code.gitea.io/gitea@v1.21.7/routers/api/packages/composer/api.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package composer 5 6 import ( 7 "fmt" 8 "net/url" 9 "time" 10 11 packages_model "code.gitea.io/gitea/models/packages" 12 composer_module "code.gitea.io/gitea/modules/packages/composer" 13 ) 14 15 // ServiceIndexResponse contains registry endpoints 16 type ServiceIndexResponse struct { 17 SearchTemplate string `json:"search"` 18 MetadataTemplate string `json:"metadata-url"` 19 PackageList string `json:"list"` 20 } 21 22 func createServiceIndexResponse(registryURL string) *ServiceIndexResponse { 23 return &ServiceIndexResponse{ 24 SearchTemplate: registryURL + "/search.json?q=%query%&type=%type%", 25 MetadataTemplate: registryURL + "/p2/%package%.json", 26 PackageList: registryURL + "/list.json", 27 } 28 } 29 30 // SearchResultResponse contains search results 31 type SearchResultResponse struct { 32 Total int64 `json:"total"` 33 Results []*SearchResult `json:"results"` 34 NextLink string `json:"next,omitempty"` 35 } 36 37 // SearchResult contains a search result 38 type SearchResult struct { 39 Name string `json:"name"` 40 Description string `json:"description"` 41 Downloads int64 `json:"downloads"` 42 } 43 44 func createSearchResultResponse(total int64, pds []*packages_model.PackageDescriptor, nextLink string) *SearchResultResponse { 45 results := make([]*SearchResult, 0, len(pds)) 46 47 for _, pd := range pds { 48 results = append(results, &SearchResult{ 49 Name: pd.Package.Name, 50 Description: pd.Metadata.(*composer_module.Metadata).Description, 51 Downloads: pd.Version.DownloadCount, 52 }) 53 } 54 55 return &SearchResultResponse{ 56 Total: total, 57 Results: results, 58 NextLink: nextLink, 59 } 60 } 61 62 // PackageMetadataResponse contains packages metadata 63 type PackageMetadataResponse struct { 64 Minified string `json:"minified"` 65 Packages map[string][]*PackageVersionMetadata `json:"packages"` 66 } 67 68 // PackageVersionMetadata contains package metadata 69 type PackageVersionMetadata struct { 70 *composer_module.Metadata 71 Name string `json:"name"` 72 Version string `json:"version"` 73 Type string `json:"type"` 74 Created time.Time `json:"time"` 75 Dist Dist `json:"dist"` 76 } 77 78 // Dist contains package download information 79 type Dist struct { 80 Type string `json:"type"` 81 URL string `json:"url"` 82 Checksum string `json:"shasum"` 83 } 84 85 func createPackageMetadataResponse(registryURL string, pds []*packages_model.PackageDescriptor) *PackageMetadataResponse { 86 versions := make([]*PackageVersionMetadata, 0, len(pds)) 87 88 for _, pd := range pds { 89 packageType := "" 90 for _, pvp := range pd.VersionProperties { 91 if pvp.Name == composer_module.TypeProperty { 92 packageType = pvp.Value 93 break 94 } 95 } 96 97 versions = append(versions, &PackageVersionMetadata{ 98 Name: pd.Package.Name, 99 Version: pd.Version.Version, 100 Type: packageType, 101 Created: pd.Version.CreatedUnix.AsLocalTime(), 102 Metadata: pd.Metadata.(*composer_module.Metadata), 103 Dist: Dist{ 104 Type: "zip", 105 URL: fmt.Sprintf("%s/files/%s/%s/%s", registryURL, url.PathEscape(pd.Package.LowerName), url.PathEscape(pd.Version.LowerVersion), url.PathEscape(pd.Files[0].File.LowerName)), 106 Checksum: pd.Files[0].Blob.HashSHA1, 107 }, 108 }) 109 } 110 111 return &PackageMetadataResponse{ 112 Minified: "composer/2.0", 113 Packages: map[string][]*PackageVersionMetadata{ 114 pds[0].Package.Name: versions, 115 }, 116 } 117 }