aboutsummaryrefslogtreecommitdiffstats
path: root/routers/api/packages/nuget
diff options
context:
space:
mode:
Diffstat (limited to 'routers/api/packages/nuget')
-rw-r--r--routers/api/packages/nuget/api_v2.go46
-rw-r--r--routers/api/packages/nuget/api_v3.go142
-rw-r--r--routers/api/packages/nuget/auth.go2
-rw-r--r--routers/api/packages/nuget/nuget.go23
4 files changed, 142 insertions, 71 deletions
diff --git a/routers/api/packages/nuget/api_v2.go b/routers/api/packages/nuget/api_v2.go
index a726065ad0..801c60af13 100644
--- a/routers/api/packages/nuget/api_v2.go
+++ b/routers/api/packages/nuget/api_v2.go
@@ -246,21 +246,30 @@ type TypedValue[T any] struct {
}
type FeedEntryProperties struct {
- Version string `xml:"d:Version"`
- NormalizedVersion string `xml:"d:NormalizedVersion"`
Authors string `xml:"d:Authors"`
+ Copyright string `xml:"d:Copyright,omitempty"`
+ Created TypedValue[time.Time] `xml:"d:Created"`
Dependencies string `xml:"d:Dependencies"`
Description string `xml:"d:Description"`
- VersionDownloadCount TypedValue[int64] `xml:"d:VersionDownloadCount"`
+ DevelopmentDependency TypedValue[bool] `xml:"d:DevelopmentDependency"`
DownloadCount TypedValue[int64] `xml:"d:DownloadCount"`
- PackageSize TypedValue[int64] `xml:"d:PackageSize"`
- Created TypedValue[time.Time] `xml:"d:Created"`
+ ID string `xml:"d:Id"`
+ IconURL string `xml:"d:IconUrl,omitempty"`
+ Language string `xml:"d:Language,omitempty"`
LastUpdated TypedValue[time.Time] `xml:"d:LastUpdated"`
- Published TypedValue[time.Time] `xml:"d:Published"`
+ LicenseURL string `xml:"d:LicenseUrl,omitempty"`
+ MinClientVersion string `xml:"d:MinClientVersion,omitempty"`
+ NormalizedVersion string `xml:"d:NormalizedVersion"`
+ Owners string `xml:"d:Owners,omitempty"`
+ PackageSize TypedValue[int64] `xml:"d:PackageSize"`
ProjectURL string `xml:"d:ProjectUrl,omitempty"`
+ Published TypedValue[time.Time] `xml:"d:Published"`
ReleaseNotes string `xml:"d:ReleaseNotes,omitempty"`
RequireLicenseAcceptance TypedValue[bool] `xml:"d:RequireLicenseAcceptance"`
- Title string `xml:"d:Title"`
+ Tags string `xml:"d:Tags,omitempty"`
+ Title string `xml:"d:Title,omitempty"`
+ Version string `xml:"d:Version"`
+ VersionDownloadCount TypedValue[int64] `xml:"d:VersionDownloadCount"`
}
type FeedEntry struct {
@@ -353,21 +362,30 @@ func createEntry(l *linkBuilder, pd *packages_model.PackageDescriptor, withNames
Author: metadata.Authors,
Content: content,
Properties: &FeedEntryProperties{
- Version: pd.Version.Version,
- NormalizedVersion: pd.Version.Version,
Authors: metadata.Authors,
+ Copyright: metadata.Copyright,
+ Created: createdValue,
Dependencies: buildDependencyString(metadata),
Description: metadata.Description,
- VersionDownloadCount: TypedValue[int64]{Type: "Edm.Int64", Value: pd.Version.DownloadCount},
+ DevelopmentDependency: TypedValue[bool]{Type: "Edm.Boolean", Value: metadata.DevelopmentDependency},
DownloadCount: TypedValue[int64]{Type: "Edm.Int64", Value: pd.Version.DownloadCount},
- PackageSize: TypedValue[int64]{Type: "Edm.Int64", Value: pd.CalculateBlobSize()},
- Created: createdValue,
+ ID: pd.Package.Name,
+ IconURL: metadata.IconURL,
+ Language: metadata.Language,
LastUpdated: createdValue,
- Published: createdValue,
+ LicenseURL: metadata.LicenseURL,
+ MinClientVersion: metadata.MinClientVersion,
+ NormalizedVersion: pd.Version.Version,
+ Owners: metadata.Owners,
+ PackageSize: TypedValue[int64]{Type: "Edm.Int64", Value: pd.CalculateBlobSize()},
ProjectURL: metadata.ProjectURL,
+ Published: createdValue,
ReleaseNotes: metadata.ReleaseNotes,
RequireLicenseAcceptance: TypedValue[bool]{Type: "Edm.Boolean", Value: metadata.RequireLicenseAcceptance},
- Title: pd.Package.Name,
+ Tags: metadata.Tags,
+ Title: metadata.Title,
+ Version: pd.Version.Version,
+ VersionDownloadCount: TypedValue[int64]{Type: "Edm.Int64", Value: pd.Version.DownloadCount},
},
}
diff --git a/routers/api/packages/nuget/api_v3.go b/routers/api/packages/nuget/api_v3.go
index 2fe25dc0f8..3262f2d9af 100644
--- a/routers/api/packages/nuget/api_v3.go
+++ b/routers/api/packages/nuget/api_v3.go
@@ -53,15 +53,23 @@ type RegistrationIndexPageItem struct {
// https://docs.microsoft.com/en-us/nuget/api/registration-base-url-resource#catalog-entry
type CatalogEntry struct {
CatalogLeafURL string `json:"@id"`
- PackageContentURL string `json:"packageContent"`
+ Authors string `json:"authors"`
+ Copyright string `json:"copyright"`
+ DependencyGroups []*PackageDependencyGroup `json:"dependencyGroups"`
+ Description string `json:"description"`
+ IconURL string `json:"iconUrl"`
ID string `json:"id"`
+ IsPrerelease bool `json:"isPrerelease"`
+ Language string `json:"language"`
+ LicenseURL string `json:"licenseUrl"`
+ PackageContentURL string `json:"packageContent"`
+ ProjectURL string `json:"projectUrl"`
+ RequireLicenseAcceptance bool `json:"requireLicenseAcceptance"`
+ Summary string `json:"summary"`
+ Tags string `json:"tags"`
Version string `json:"version"`
- Description string `json:"description"`
ReleaseNotes string `json:"releaseNotes"`
- Authors string `json:"authors"`
- RequireLicenseAcceptance bool `json:"requireLicenseAcceptance"`
- ProjectURL string `json:"projectURL"`
- DependencyGroups []*PackageDependencyGroup `json:"dependencyGroups"`
+ Published time.Time `json:"published"`
}
// https://docs.microsoft.com/en-us/nuget/api/registration-base-url-resource#package-dependency-group
@@ -109,15 +117,24 @@ func createRegistrationIndexPageItem(l *linkBuilder, pd *packages_model.PackageD
RegistrationLeafURL: l.GetRegistrationLeafURL(pd.Package.Name, pd.Version.Version),
PackageContentURL: l.GetPackageDownloadURL(pd.Package.Name, pd.Version.Version),
CatalogEntry: &CatalogEntry{
- CatalogLeafURL: l.GetRegistrationLeafURL(pd.Package.Name, pd.Version.Version),
- PackageContentURL: l.GetPackageDownloadURL(pd.Package.Name, pd.Version.Version),
- ID: pd.Package.Name,
- Version: pd.Version.Version,
- Description: metadata.Description,
- ReleaseNotes: metadata.ReleaseNotes,
- Authors: metadata.Authors,
- ProjectURL: metadata.ProjectURL,
- DependencyGroups: createDependencyGroups(pd),
+ CatalogLeafURL: l.GetRegistrationLeafURL(pd.Package.Name, pd.Version.Version),
+ Authors: metadata.Authors,
+ Copyright: metadata.Copyright,
+ DependencyGroups: createDependencyGroups(pd),
+ Description: metadata.Description,
+ IconURL: metadata.IconURL,
+ ID: pd.Package.Name,
+ IsPrerelease: pd.Version.IsPrerelease(),
+ Language: metadata.Language,
+ LicenseURL: metadata.LicenseURL,
+ PackageContentURL: l.GetPackageDownloadURL(pd.Package.Name, pd.Version.Version),
+ ProjectURL: metadata.ProjectURL,
+ RequireLicenseAcceptance: metadata.RequireLicenseAcceptance,
+ Summary: metadata.Summary,
+ Tags: metadata.Tags,
+ Version: pd.Version.Version,
+ ReleaseNotes: metadata.ReleaseNotes,
+ Published: pd.Version.CreatedUnix.AsLocalTime(),
},
}
}
@@ -145,22 +162,42 @@ func createDependencyGroups(pd *packages_model.PackageDescriptor) []*PackageDepe
// https://docs.microsoft.com/en-us/nuget/api/registration-base-url-resource#registration-leaf
type RegistrationLeafResponse struct {
- RegistrationLeafURL string `json:"@id"`
- Type []string `json:"@type"`
- Listed bool `json:"listed"`
- PackageContentURL string `json:"packageContent"`
- Published time.Time `json:"published"`
- RegistrationIndexURL string `json:"registration"`
+ RegistrationLeafURL string `json:"@id"`
+ Type []string `json:"@type"`
+ PackageContentURL string `json:"packageContent"`
+ RegistrationIndexURL string `json:"registration"`
+ CatalogEntry CatalogEntry `json:"catalogEntry"`
}
func createRegistrationLeafResponse(l *linkBuilder, pd *packages_model.PackageDescriptor) *RegistrationLeafResponse {
+ registrationLeafURL := l.GetRegistrationLeafURL(pd.Package.Name, pd.Version.Version)
+ packageDownloadURL := l.GetPackageDownloadURL(pd.Package.Name, pd.Version.Version)
+ metadata := pd.Metadata.(*nuget_module.Metadata)
return &RegistrationLeafResponse{
- Type: []string{"Package", "http://schema.nuget.org/catalog#Permalink"},
- Listed: true,
- Published: pd.Version.CreatedUnix.AsLocalTime(),
- RegistrationLeafURL: l.GetRegistrationLeafURL(pd.Package.Name, pd.Version.Version),
- PackageContentURL: l.GetPackageDownloadURL(pd.Package.Name, pd.Version.Version),
+ RegistrationLeafURL: registrationLeafURL,
RegistrationIndexURL: l.GetRegistrationIndexURL(pd.Package.Name),
+ PackageContentURL: packageDownloadURL,
+ Type: []string{"Package", "http://schema.nuget.org/catalog#Permalink"},
+ CatalogEntry: CatalogEntry{
+ CatalogLeafURL: registrationLeafURL,
+ Authors: metadata.Authors,
+ Copyright: metadata.Copyright,
+ DependencyGroups: createDependencyGroups(pd),
+ Description: metadata.Description,
+ IconURL: metadata.IconURL,
+ ID: pd.Package.Name,
+ IsPrerelease: pd.Version.IsPrerelease(),
+ Language: metadata.Language,
+ LicenseURL: metadata.LicenseURL,
+ PackageContentURL: packageDownloadURL,
+ ProjectURL: metadata.ProjectURL,
+ RequireLicenseAcceptance: metadata.RequireLicenseAcceptance,
+ Summary: metadata.Summary,
+ Tags: metadata.Tags,
+ Version: pd.Version.Version,
+ ReleaseNotes: metadata.ReleaseNotes,
+ Published: pd.Version.CreatedUnix.AsLocalTime(),
+ },
}
}
@@ -188,13 +225,24 @@ type SearchResultResponse struct {
// https://docs.microsoft.com/en-us/nuget/api/search-query-service-resource#search-result
type SearchResult struct {
- ID string `json:"id"`
- Version string `json:"version"`
- Versions []*SearchResultVersion `json:"versions"`
- Description string `json:"description"`
- Authors string `json:"authors"`
- ProjectURL string `json:"projectURL"`
- RegistrationIndexURL string `json:"registration"`
+ Authors string `json:"authors"`
+ Copyright string `json:"copyright"`
+ DependencyGroups []*PackageDependencyGroup `json:"dependencyGroups"`
+ Description string `json:"description"`
+ IconURL string `json:"iconUrl"`
+ ID string `json:"id"`
+ IsPrerelease bool `json:"isPrerelease"`
+ Language string `json:"language"`
+ LicenseURL string `json:"licenseUrl"`
+ ProjectURL string `json:"projectUrl"`
+ RequireLicenseAcceptance bool `json:"requireLicenseAcceptance"`
+ Summary string `json:"summary"`
+ Tags string `json:"tags"`
+ Title string `json:"title"`
+ TotalDownloads int64 `json:"totalDownloads"`
+ Version string `json:"version"`
+ Versions []*SearchResultVersion `json:"versions"`
+ RegistrationIndexURL string `json:"registration"`
}
// https://docs.microsoft.com/en-us/nuget/api/search-query-service-resource#search-result
@@ -230,11 +278,12 @@ func createSearchResultResponse(l *linkBuilder, totalHits int64, pds []*packages
func createSearchResult(l *linkBuilder, pds []*packages_model.PackageDescriptor) *SearchResult {
latest := pds[0]
versions := make([]*SearchResultVersion, 0, len(pds))
+ totalDownloads := int64(0)
for _, pd := range pds {
if latest.SemVer.LessThan(pd.SemVer) {
latest = pd
}
-
+ totalDownloads += pd.Version.DownloadCount
versions = append(versions, &SearchResultVersion{
RegistrationLeafURL: l.GetRegistrationLeafURL(pd.Package.Name, pd.Version.Version),
Version: pd.Version.Version,
@@ -244,12 +293,23 @@ func createSearchResult(l *linkBuilder, pds []*packages_model.PackageDescriptor)
metadata := latest.Metadata.(*nuget_module.Metadata)
return &SearchResult{
- ID: latest.Package.Name,
- Version: latest.Version.Version,
- Versions: versions,
- Description: metadata.Description,
- Authors: metadata.Authors,
- ProjectURL: metadata.ProjectURL,
- RegistrationIndexURL: l.GetRegistrationIndexURL(latest.Package.Name),
+ Authors: metadata.Authors,
+ Copyright: metadata.Copyright,
+ Description: metadata.Description,
+ DependencyGroups: createDependencyGroups(latest),
+ IconURL: metadata.IconURL,
+ ID: latest.Package.Name,
+ IsPrerelease: latest.Version.IsPrerelease(),
+ Language: metadata.Language,
+ LicenseURL: metadata.LicenseURL,
+ ProjectURL: metadata.ProjectURL,
+ RequireLicenseAcceptance: metadata.RequireLicenseAcceptance,
+ Summary: metadata.Summary,
+ Tags: metadata.Tags,
+ Title: metadata.Title,
+ TotalDownloads: totalDownloads,
+ Version: latest.Version.Version,
+ Versions: versions,
+ RegistrationIndexURL: l.GetRegistrationIndexURL(latest.Package.Name),
}
}
diff --git a/routers/api/packages/nuget/auth.go b/routers/api/packages/nuget/auth.go
index e81ad01b2b..ce7df0ce0a 100644
--- a/routers/api/packages/nuget/auth.go
+++ b/routers/api/packages/nuget/auth.go
@@ -26,7 +26,6 @@ func (a *Auth) Verify(req *http.Request, w http.ResponseWriter, store auth.DataS
token, err := auth_model.GetAccessTokenBySHA(req.Context(), req.Header.Get("X-NuGet-ApiKey"))
if err != nil {
if !(auth_model.IsErrAccessTokenNotExist(err) || auth_model.IsErrAccessTokenEmpty(err)) {
- log.Error("GetAccessTokenBySHA: %v", err)
return nil, err
}
return nil, nil
@@ -34,7 +33,6 @@ func (a *Auth) Verify(req *http.Request, w http.ResponseWriter, store auth.DataS
u, err := user_model.GetUserByID(req.Context(), token.UID)
if err != nil {
- log.Error("GetUserByID: %v", err)
return nil, err
}
diff --git a/routers/api/packages/nuget/nuget.go b/routers/api/packages/nuget/nuget.go
index fa5067a278..c42fdd7db5 100644
--- a/routers/api/packages/nuget/nuget.go
+++ b/routers/api/packages/nuget/nuget.go
@@ -17,7 +17,6 @@ import (
"code.gitea.io/gitea/models/db"
packages_model "code.gitea.io/gitea/models/packages"
nuget_model "code.gitea.io/gitea/models/packages/nuget"
- "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/optional"
packages_module "code.gitea.io/gitea/modules/packages"
nuget_module "code.gitea.io/gitea/modules/packages/nuget"
@@ -29,22 +28,17 @@ import (
)
func apiError(ctx *context.Context, status int, obj any) {
- helper.LogAndProcessError(ctx, status, obj, func(message string) {
- ctx.JSON(status, map[string]string{
- "Message": message,
- })
+ message := helper.ProcessErrorForUser(ctx, status, obj)
+ ctx.JSON(status, map[string]string{
+ "Message": message,
})
}
-func xmlResponse(ctx *context.Context, status int, obj any) { //nolint:unparam
+func xmlResponse(ctx *context.Context, status int, obj any) { //nolint:unparam // status is always StatusOK
ctx.Resp.Header().Set("Content-Type", "application/atom+xml; charset=utf-8")
ctx.Resp.WriteHeader(status)
- if _, err := ctx.Resp.Write([]byte(xml.Header)); err != nil {
- log.Error("Write failed: %v", err)
- }
- if err := xml.NewEncoder(ctx.Resp).Encode(obj); err != nil {
- log.Error("XML encode failed: %v", err)
- }
+ _, _ = ctx.Resp.Write([]byte(xml.Header))
+ _ = xml.NewEncoder(ctx.Resp).Encode(obj)
}
// https://github.com/NuGet/NuGet.Client/blob/dev/src/NuGet.Core/NuGet.Protocol/LegacyFeed/V2FeedQueryBuilder.cs
@@ -405,7 +399,7 @@ func DownloadPackageFile(ctx *context.Context) {
packageVersion := ctx.PathParam("version")
filename := ctx.PathParam("filename")
- s, u, pf, err := packages_service.GetFileStreamByPackageNameAndVersion(
+ s, u, pf, err := packages_service.OpenFileForDownloadByPackageNameAndVersion(
ctx,
&packages_service.PackageInfo{
Owner: ctx.Package.Owner,
@@ -416,6 +410,7 @@ func DownloadPackageFile(ctx *context.Context) {
&packages_service.PackageFileInfo{
Filename: filename,
},
+ ctx.Req.Method,
)
if err != nil {
if errors.Is(err, packages_model.ErrPackageNotExist) || errors.Is(err, packages_model.ErrPackageFileNotExist) {
@@ -669,7 +664,7 @@ func DownloadSymbolFile(ctx *context.Context) {
return
}
- s, u, pf, err := packages_service.GetPackageFileStream(ctx, pfs[0])
+ s, u, pf, err := packages_service.OpenFileForDownload(ctx, pfs[0], ctx.Req.Method)
if err != nil {
if errors.Is(err, packages_model.ErrPackageNotExist) || errors.Is(err, packages_model.ErrPackageFileNotExist) {
apiError(ctx, http.StatusNotFound, err)