diff options
author | Jack Vine <jackv24@users.noreply.github.com> | 2022-09-24 20:54:33 +0930 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-24 19:24:33 +0800 |
commit | 83680c97a7fd23d2a2953302771ed2b234c0689e (patch) | |
tree | ff0affb5ab524b24955a1793074150cac2572f2f /routers | |
parent | da0a9ec81132dabbec0d217d5f6a49550ce6793a (diff) | |
download | gitea-83680c97a7fd23d2a2953302771ed2b234c0689e.tar.gz gitea-83680c97a7fd23d2a2953302771ed2b234c0689e.zip |
NPM Package Registry search API endpoint (#20280)
Close #20098, in the NPM registry API, implemented to match what's described by https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#get-v1search
Currently have only implemented the bare minimum to work with the [Unity Package Manager](https://docs.unity3d.com/Manual/upm-ui.html).
Co-authored-by: Jack Vine <jackv@jack-lemur-suse.cat-prometheus.ts.net>
Co-authored-by: KN4CK3R <admin@oldschoolhack.me>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'routers')
-rw-r--r-- | routers/api/packages/api.go | 3 | ||||
-rw-r--r-- | routers/api/packages/npm/api.go | 35 | ||||
-rw-r--r-- | routers/api/packages/npm/npm.go | 32 |
3 files changed, 70 insertions, 0 deletions
diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index 93f9afca7b..cb9b3b78ab 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -236,6 +236,9 @@ func Routes(ctx gocontext.Context) *web.Route { r.Delete("", npm.DeletePackageTag) }, reqPackageAccess(perm.AccessModeWrite)) }) + r.Group("/-/v1/search", func() { + r.Get("", npm.PackageSearch) + }) }) r.Group("/pub", func() { r.Group("/api/packages", func() { diff --git a/routers/api/packages/npm/api.go b/routers/api/packages/npm/api.go index 763c595152..d1027763a8 100644 --- a/routers/api/packages/npm/api.go +++ b/routers/api/packages/npm/api.go @@ -74,3 +74,38 @@ func createPackageMetadataVersion(registryURL string, pd *packages_model.Package }, } } + +func createPackageSearchResponse(pds []*packages_model.PackageDescriptor, total int64) *npm_module.PackageSearch { + objects := make([]*npm_module.PackageSearchObject, 0, len(pds)) + for _, pd := range pds { + metadata := pd.Metadata.(*npm_module.Metadata) + + scope := metadata.Scope + if scope == "" { + scope = "unscoped" + } + + objects = append(objects, &npm_module.PackageSearchObject{ + Package: &npm_module.PackageSearchPackage{ + Scope: scope, + Name: metadata.Name, + Version: pd.Version.Version, + Date: pd.Version.CreatedUnix.AsLocalTime(), + Description: metadata.Description, + Author: npm_module.User{Name: metadata.Author}, + Publisher: npm_module.User{Name: pd.Owner.Name}, + Maintainers: []npm_module.User{}, // npm cli needs this field + Keywords: metadata.Keywords, + Links: &npm_module.PackageSearchPackageLinks{ + Registry: pd.FullWebLink(), + Homepage: metadata.ProjectURL, + }, + }, + }) + } + + return &npm_module.PackageSearch{ + Objects: objects, + Total: total, + } +} diff --git a/routers/api/packages/npm/npm.go b/routers/api/packages/npm/npm.go index 66b999d47e..2989ce6e7f 100644 --- a/routers/api/packages/npm/npm.go +++ b/routers/api/packages/npm/npm.go @@ -350,3 +350,35 @@ func setPackageTag(tag string, pv *packages_model.PackageVersion, deleteOnly boo return committer.Commit() } + +func PackageSearch(ctx *context.Context) { + pvs, total, err := packages_model.SearchLatestVersions(ctx, &packages_model.PackageSearchOptions{ + OwnerID: ctx.Package.Owner.ID, + Type: packages_model.TypeNpm, + Name: packages_model.SearchValue{ + ExactMatch: false, + Value: ctx.FormTrim("text"), + }, + Paginator: db.NewAbsoluteListOptions( + ctx.FormInt("from"), + ctx.FormInt("size"), + ), + }) + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) + return + } + + pds, err := packages_model.GetPackageDescriptors(ctx, pvs) + if err != nil { + apiError(ctx, http.StatusInternalServerError, err) + return + } + + resp := createPackageSearchResponse( + pds, + total, + ) + + ctx.JSON(http.StatusOK, resp) +} |