Skip to content

Commit 6caaaf2

Browse files
committed
Move Upload Code into Service
1 parent c71e622 commit 6caaaf2

File tree

6 files changed

+160
-198
lines changed

6 files changed

+160
-198
lines changed

routers/api/packages/debian/debian.go

+3-65
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,18 @@ import (
77
stdctx "context"
88
"errors"
99
"fmt"
10-
"io"
1110
"net/http"
1211
"strings"
1312

1413
"code.gitea.io/gitea/models/db"
1514
packages_model "code.gitea.io/gitea/models/packages"
1615
"code.gitea.io/gitea/modules/context"
17-
packages_module "code.gitea.io/gitea/modules/packages"
18-
debian_module "code.gitea.io/gitea/modules/packages/debian"
1916
"code.gitea.io/gitea/modules/util"
2017
"code.gitea.io/gitea/routers/api/packages/helper"
2118
notify_service "code.gitea.io/gitea/services/notify"
2219
packages_service "code.gitea.io/gitea/services/packages"
2320
debian_service "code.gitea.io/gitea/services/packages/debian"
21+
packages_upload_service "code.gitea.io/gitea/services/packages/upload"
2422
)
2523

2624
func apiError(ctx *context.Context, status int, obj any) {
@@ -136,69 +134,9 @@ func UploadPackageFile(ctx *context.Context) {
136134
defer upload.Close()
137135
}
138136

139-
buf, err := packages_module.CreateHashedBufferFromReader(upload)
137+
statusCode, _, err := packages_upload_service.UploadDebianPackage(ctx, upload, distribution, component)
140138
if err != nil {
141-
apiError(ctx, http.StatusInternalServerError, err)
142-
return
143-
}
144-
defer buf.Close()
145-
146-
pck, err := debian_module.ParsePackage(buf)
147-
if err != nil {
148-
if errors.Is(err, util.ErrInvalidArgument) {
149-
apiError(ctx, http.StatusBadRequest, err)
150-
} else {
151-
apiError(ctx, http.StatusInternalServerError, err)
152-
}
153-
return
154-
}
155-
156-
if _, err := buf.Seek(0, io.SeekStart); err != nil {
157-
apiError(ctx, http.StatusInternalServerError, err)
158-
return
159-
}
160-
161-
_, _, err = packages_service.CreatePackageOrAddFileToExisting(
162-
&packages_service.PackageCreationInfo{
163-
PackageInfo: packages_service.PackageInfo{
164-
Owner: ctx.Package.Owner,
165-
PackageType: packages_model.TypeDebian,
166-
Name: pck.Name,
167-
Version: pck.Version,
168-
},
169-
Creator: ctx.Doer,
170-
Metadata: pck.Metadata,
171-
},
172-
&packages_service.PackageFileCreationInfo{
173-
PackageFileInfo: packages_service.PackageFileInfo{
174-
Filename: fmt.Sprintf("%s_%s_%s.deb", pck.Name, pck.Version, pck.Architecture),
175-
CompositeKey: fmt.Sprintf("%s|%s", distribution, component),
176-
},
177-
Creator: ctx.Doer,
178-
Data: buf,
179-
IsLead: true,
180-
Properties: map[string]string{
181-
debian_module.PropertyDistribution: distribution,
182-
debian_module.PropertyComponent: component,
183-
debian_module.PropertyArchitecture: pck.Architecture,
184-
debian_module.PropertyControl: pck.Control,
185-
},
186-
},
187-
)
188-
if err != nil {
189-
switch err {
190-
case packages_model.ErrDuplicatePackageVersion, packages_model.ErrDuplicatePackageFile:
191-
apiError(ctx, http.StatusBadRequest, err)
192-
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
193-
apiError(ctx, http.StatusForbidden, err)
194-
default:
195-
apiError(ctx, http.StatusInternalServerError, err)
196-
}
197-
return
198-
}
199-
200-
if err := debian_service.BuildSpecificRepositoryFiles(ctx, ctx.Package.Owner.ID, distribution, component, pck.Architecture); err != nil {
201-
apiError(ctx, http.StatusInternalServerError, err)
139+
apiError(ctx, statusCode, err)
202140
return
203141
}
204142

routers/api/packages/generic/generic.go

+3-37
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@ import (
1111

1212
packages_model "code.gitea.io/gitea/models/packages"
1313
"code.gitea.io/gitea/modules/context"
14-
"code.gitea.io/gitea/modules/log"
15-
packages_module "code.gitea.io/gitea/modules/packages"
1614
"code.gitea.io/gitea/routers/api/packages/helper"
1715
packages_service "code.gitea.io/gitea/services/packages"
16+
packages_upload_service "code.gitea.io/gitea/services/packages/upload"
1817
)
1918

2019
var (
@@ -80,42 +79,9 @@ func UploadPackage(ctx *context.Context) {
8079
defer upload.Close()
8180
}
8281

83-
buf, err := packages_module.CreateHashedBufferFromReader(upload)
82+
statusCode, _, err := packages_upload_service.UploadGenericPackage(ctx, upload, packageName, packageVersion, filename)
8483
if err != nil {
85-
log.Error("Error creating hashed buffer: %v", err)
86-
apiError(ctx, http.StatusInternalServerError, err)
87-
return
88-
}
89-
defer buf.Close()
90-
91-
_, _, err = packages_service.CreatePackageOrAddFileToExisting(
92-
&packages_service.PackageCreationInfo{
93-
PackageInfo: packages_service.PackageInfo{
94-
Owner: ctx.Package.Owner,
95-
PackageType: packages_model.TypeGeneric,
96-
Name: packageName,
97-
Version: packageVersion,
98-
},
99-
Creator: ctx.Doer,
100-
},
101-
&packages_service.PackageFileCreationInfo{
102-
PackageFileInfo: packages_service.PackageFileInfo{
103-
Filename: filename,
104-
},
105-
Creator: ctx.Doer,
106-
Data: buf,
107-
IsLead: true,
108-
},
109-
)
110-
if err != nil {
111-
switch err {
112-
case packages_model.ErrDuplicatePackageFile:
113-
apiError(ctx, http.StatusConflict, err)
114-
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
115-
apiError(ctx, http.StatusForbidden, err)
116-
default:
117-
apiError(ctx, http.StatusInternalServerError, err)
118-
}
84+
apiError(ctx, statusCode, err)
11985
return
12086
}
12187

routers/web/shared/packages/upload.go

+12-93
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,16 @@
44
package packages
55

66
import (
7-
"errors"
87
"fmt"
9-
"io"
8+
"net/http"
109

1110
packages_model "code.gitea.io/gitea/models/packages"
1211
repo_model "code.gitea.io/gitea/models/repo"
1312
"code.gitea.io/gitea/modules/context"
1413
packages_module "code.gitea.io/gitea/modules/packages"
15-
debian_module "code.gitea.io/gitea/modules/packages/debian"
16-
"code.gitea.io/gitea/modules/util"
1714
"code.gitea.io/gitea/modules/web"
1815
"code.gitea.io/gitea/services/forms"
19-
packages_service "code.gitea.io/gitea/services/packages"
20-
debian_service "code.gitea.io/gitea/services/packages/debian"
16+
packages_upload_service "code.gitea.io/gitea/services/packages/upload"
2117
)
2218

2319
func servePackageUploadError(ctx *context.Context, err error, packageType, repo string) {
@@ -73,35 +69,14 @@ func UploadGenericPackagePost(ctx *context.Context) {
7369
filename = form.PackageFilename
7470
}
7571

76-
pv, _, err := packages_service.CreatePackageOrAddFileToExisting(
77-
&packages_service.PackageCreationInfo{
78-
PackageInfo: packages_service.PackageInfo{
79-
Owner: ctx.Package.Owner,
80-
PackageType: packages_model.TypeGeneric,
81-
Name: form.PackageName,
82-
Version: form.PackageVersion,
83-
},
84-
Creator: ctx.Doer,
85-
},
86-
&packages_service.PackageFileCreationInfo{
87-
PackageFileInfo: packages_service.PackageFileInfo{
88-
Filename: filename,
89-
},
90-
Creator: ctx.Doer,
91-
Data: buf,
92-
IsLead: true,
93-
},
94-
)
72+
statusCode, pv, err := packages_upload_service.UploadGenericPackage(ctx, upload, form.PackageName, form.PackageVersion, filename)
9573
if err != nil {
96-
switch err {
97-
case packages_model.ErrDuplicatePackageFile:
98-
servePackageUploadError(ctx, err, "generic", form.PackageRepo)
99-
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
74+
if statusCode == http.StatusInternalServerError {
75+
ctx.ServerError("UploadGenericPackage", err)
76+
} else {
10077
servePackageUploadError(ctx, err, "generic", form.PackageRepo)
101-
default:
102-
ctx.ServerError("CreatePackageOrAddFileToExisting", err)
78+
return
10379
}
104-
return
10580
}
10681

10782
if form.PackageRepo != "" {
@@ -127,70 +102,14 @@ func UploadDebianPackagePost(ctx *context.Context) {
127102
return
128103
}
129104

130-
buf, err := packages_module.CreateHashedBufferFromReader(upload)
131-
if err != nil {
132-
ctx.ServerError("GetGenericPackageFile", err)
133-
return
134-
}
135-
defer buf.Close()
136-
137-
pck, err := debian_module.ParsePackage(buf)
105+
statusCode, pv, err := packages_upload_service.UploadDebianPackage(ctx, upload, form.PackageDistribution, form.PackageComponent)
138106
if err != nil {
139-
if errors.Is(err, util.ErrInvalidArgument) {
140-
servePackageUploadError(ctx, err, "debian", form.PackageRepo)
107+
if statusCode == http.StatusInternalServerError {
108+
ctx.ServerError("UploadGenericPackage", err)
141109
} else {
142-
ctx.ServerError("ParsePackage", err)
143-
}
144-
return
145-
}
146-
147-
if _, err := buf.Seek(0, io.SeekStart); err != nil {
148-
ctx.ServerError("SeekBuffer", err)
149-
return
150-
}
151-
152-
pv, _, err := packages_service.CreatePackageOrAddFileToExisting(
153-
&packages_service.PackageCreationInfo{
154-
PackageInfo: packages_service.PackageInfo{
155-
Owner: ctx.Package.Owner,
156-
PackageType: packages_model.TypeDebian,
157-
Name: pck.Name,
158-
Version: pck.Version,
159-
},
160-
Creator: ctx.Doer,
161-
Metadata: pck.Metadata,
162-
},
163-
&packages_service.PackageFileCreationInfo{
164-
PackageFileInfo: packages_service.PackageFileInfo{
165-
Filename: fmt.Sprintf("%s_%s_%s.deb", pck.Name, pck.Version, pck.Architecture),
166-
CompositeKey: fmt.Sprintf("%s|%s", form.PackageDistribution, form.PackageComponent),
167-
},
168-
Creator: ctx.Doer,
169-
Data: buf,
170-
IsLead: true,
171-
Properties: map[string]string{
172-
debian_module.PropertyDistribution: form.PackageDistribution,
173-
debian_module.PropertyComponent: form.PackageComponent,
174-
debian_module.PropertyArchitecture: pck.Architecture,
175-
debian_module.PropertyControl: pck.Control,
176-
},
177-
},
178-
)
179-
if err != nil {
180-
switch err {
181-
case packages_model.ErrDuplicatePackageVersion, packages_model.ErrDuplicatePackageFile:
182-
servePackageUploadError(ctx, err, "debian", form.PackageRepo)
183-
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
184-
servePackageUploadError(ctx, err, "debian", form.PackageRepo)
185-
default:
186-
ctx.ServerError("CreatePackageOrAddFileToExisting", err)
110+
servePackageUploadError(ctx, err, "generic", form.PackageRepo)
111+
return
187112
}
188-
return
189-
}
190-
191-
if err := debian_service.BuildSpecificRepositoryFiles(ctx, ctx.Package.Owner.ID, form.PackageDistribution, form.PackageComponent, pck.Architecture); err != nil {
192-
ctx.ServerError("BuildSpecificRepositoryFiles", err)
193-
return
194113
}
195114

196115
if form.PackageRepo != "" {

services/packages/upload/debian.go

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package upload
5+
6+
import (
7+
"errors"
8+
"fmt"
9+
"io"
10+
"net/http"
11+
12+
packages_model "code.gitea.io/gitea/models/packages"
13+
"code.gitea.io/gitea/modules/context"
14+
packages_module "code.gitea.io/gitea/modules/packages"
15+
debian_module "code.gitea.io/gitea/modules/packages/debian"
16+
"code.gitea.io/gitea/modules/util"
17+
packages_service "code.gitea.io/gitea/services/packages"
18+
debian_service "code.gitea.io/gitea/services/packages/debian"
19+
)
20+
21+
func UploadDebianPackage(ctx *context.Context, upload io.Reader, distribution, component string) (int, *packages_model.PackageVersion, error) {
22+
buf, err := packages_module.CreateHashedBufferFromReader(upload)
23+
if err != nil {
24+
return http.StatusInternalServerError, nil, err
25+
}
26+
defer buf.Close()
27+
28+
pck, err := debian_module.ParsePackage(buf)
29+
if err != nil {
30+
if errors.Is(err, util.ErrInvalidArgument) {
31+
return http.StatusBadGateway, nil, err
32+
}
33+
34+
return http.StatusInternalServerError, nil, err
35+
}
36+
37+
if _, err := buf.Seek(0, io.SeekStart); err != nil {
38+
return http.StatusInternalServerError, nil, err
39+
}
40+
41+
pv, _, err := packages_service.CreatePackageOrAddFileToExisting(
42+
&packages_service.PackageCreationInfo{
43+
PackageInfo: packages_service.PackageInfo{
44+
Owner: ctx.Package.Owner,
45+
PackageType: packages_model.TypeDebian,
46+
Name: pck.Name,
47+
Version: pck.Version,
48+
},
49+
Creator: ctx.Doer,
50+
Metadata: pck.Metadata,
51+
},
52+
&packages_service.PackageFileCreationInfo{
53+
PackageFileInfo: packages_service.PackageFileInfo{
54+
Filename: fmt.Sprintf("%s_%s_%s.deb", pck.Name, pck.Version, pck.Architecture),
55+
CompositeKey: fmt.Sprintf("%s|%s", distribution, component),
56+
},
57+
Creator: ctx.Doer,
58+
Data: buf,
59+
IsLead: true,
60+
Properties: map[string]string{
61+
debian_module.PropertyDistribution: distribution,
62+
debian_module.PropertyComponent: component,
63+
debian_module.PropertyArchitecture: pck.Architecture,
64+
debian_module.PropertyControl: pck.Control,
65+
},
66+
},
67+
)
68+
if err != nil {
69+
switch err {
70+
case packages_model.ErrDuplicatePackageVersion, packages_model.ErrDuplicatePackageFile:
71+
return http.StatusBadRequest, nil, err
72+
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
73+
return http.StatusForbidden, nil, err
74+
default:
75+
return http.StatusInternalServerError, nil, err
76+
}
77+
}
78+
79+
if err := debian_service.BuildSpecificRepositoryFiles(ctx, ctx.Package.Owner.ID, distribution, component, pck.Architecture); err != nil {
80+
return http.StatusInternalServerError, nil, err
81+
}
82+
83+
return http.StatusOK, pv, nil
84+
}

0 commit comments

Comments
 (0)