gitea源码

api.go 3.7KB

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