forked from phonkee/gopypi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.go
More file actions
172 lines (138 loc) · 3.48 KB
/
Copy pathparser.go
File metadata and controls
172 lines (138 loc) · 3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
parser package handles parsing of submitted packages.
*/
package core
import (
"io/ioutil"
"mime/multipart"
"net/http"
"os"
"strings"
)
/*
Return action from form
*/
func GetPostAction(r *http.Request) (result int, err error) {
var ok bool
if result, ok = POST_PACKAGE_ACTIONS[r.Form.Get(":action")]; !ok {
err = ErrPostPackageInvalidAction
}
return
}
/*
GetPackage parses request form and returns package
*/
func GetPostedPackage(cfg Config, r *http.Request) (pack Package, err error) {
form := r.Form
name := strings.TrimSpace(form.Get("name"))
// if no name given error
if name == "" {
err = ErrPostPackageInvalidName
return
}
// prepare package
pack = Package{}
var (
user User
)
if cfg.DB().Preload("Author").First(&pack, "name = ?", name).RecordNotFound() {
pack.Name = name
// get user from context
if user, err = ContextGetTokenUser(r.Context()); err != nil {
return
}
pack.Author = &user
}
return
}
/*
Return package version
*/
func GetPostedPackageVersion(cfg Config, pack Package, r *http.Request) (pv PackageVersion, err error) {
pv = PackageVersion{}
version := strings.TrimSpace(r.Form.Get("version"))
// check version
if version == "" {
err = ErrPostPackageInvalidVersion
return
}
// check if package version exists in database
if cfg.DB().First(&pv, "package_id = ? AND version = ?", pack.ID, version).RecordNotFound() {
pv.Version = version
pv.Comment = strings.TrimSpace(r.Form.Get("comment"))
pv.Description = strings.TrimSpace(r.Form.Get("description"))
pv.Summary = strings.TrimSpace(r.Form.Get("summary"))
pv.Version = strings.TrimSpace(r.Form.Get("version"))
pv.HomePage = strings.TrimSpace(r.Form.Get("home_page"))
// assign package
pv.PackageID = pack.ID
var (
classifiers []string
ok bool
)
// get classifiers
if classifiers, ok = r.Form["classifiers"]; !ok {
classifiers = []string{}
}
c := make([]Classifier, 0, len(classifiers))
// get and assign classifiers
if err = cfg.Manager().Classifier().ListOrCreate(&c, classifiers); err != nil {
return
}
pv.Classifiers = c
// get license
if license, errLicense := cfg.Manager().License().GetByCode(strings.TrimSpace(r.Form.Get("license"))); errLicense != nil {
if errLicense != ErrLicenseNotFound {
err = errLicense
return
}
} else {
pv.License = &license
}
}
return
}
/*
Returns PackageVersionFile along with tempfile
*/
func GetPostedPackageVersionFile(config Config, pv PackageVersion, r *http.Request) (result PackageVersionFile, filename string, err error) {
var (
f *os.File
file multipart.File
header *multipart.FileHeader
)
// parse file content
file, header, err = r.FormFile("content")
if err != nil {
return
}
// create temporary file
if f, err = ioutil.TempFile("", header.Filename); err != nil {
return
}
// get filename
filename = f.Name()
var (
content []byte
)
// read file content
if content, err = ioutil.ReadAll(file); err != nil {
return
}
// write contents to file
if _, err = f.Write(content); err != nil {
return
}
defer f.Close()
// close file
result = PackageVersionFile{}
// check if packaged version file exists / if not provide one
if config.DB().Where("filename = ? AND package_version_id = ?", header.Filename, pv.ID).First(&result).RecordNotFound() {
result.Filename = header.Filename
result.MD5Digest = MD5(string(content))
result.RelativePath = result.GenerateRelativePath()
result.PackageVersionID = pv.ID
return
}
return
}