diff options
Diffstat (limited to 'routers/api/packages/nuget')
-rw-r--r-- | routers/api/packages/nuget/api_v2.go | 46 | ||||
-rw-r--r-- | routers/api/packages/nuget/api_v3.go | 142 | ||||
-rw-r--r-- | routers/api/packages/nuget/auth.go | 2 | ||||
-rw-r--r-- | routers/api/packages/nuget/nuget.go | 23 |
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) |