You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

package.go 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package packages
  4. import (
  5. "net/http"
  6. "code.gitea.io/gitea/models/packages"
  7. "code.gitea.io/gitea/modules/context"
  8. api "code.gitea.io/gitea/modules/structs"
  9. "code.gitea.io/gitea/modules/util"
  10. "code.gitea.io/gitea/routers/api/v1/utils"
  11. "code.gitea.io/gitea/services/convert"
  12. packages_service "code.gitea.io/gitea/services/packages"
  13. )
  14. // ListPackages gets all packages of an owner
  15. func ListPackages(ctx *context.APIContext) {
  16. // swagger:operation GET /packages/{owner} package listPackages
  17. // ---
  18. // summary: Gets all packages of an owner
  19. // produces:
  20. // - application/json
  21. // parameters:
  22. // - name: owner
  23. // in: path
  24. // description: owner of the packages
  25. // type: string
  26. // required: true
  27. // - name: page
  28. // in: query
  29. // description: page number of results to return (1-based)
  30. // type: integer
  31. // - name: limit
  32. // in: query
  33. // description: page size of results
  34. // type: integer
  35. // - name: type
  36. // in: query
  37. // description: package type filter
  38. // type: string
  39. // enum: [composer, conan, conda, container, generic, helm, maven, npm, nuget, pub, pypi, rubygems, vagrant]
  40. // - name: q
  41. // in: query
  42. // description: name filter
  43. // type: string
  44. // responses:
  45. // "200":
  46. // "$ref": "#/responses/PackageList"
  47. listOptions := utils.GetListOptions(ctx)
  48. packageType := ctx.FormTrim("type")
  49. query := ctx.FormTrim("q")
  50. pvs, count, err := packages.SearchVersions(ctx, &packages.PackageSearchOptions{
  51. OwnerID: ctx.Package.Owner.ID,
  52. Type: packages.Type(packageType),
  53. Name: packages.SearchValue{Value: query},
  54. IsInternal: util.OptionalBoolFalse,
  55. Paginator: &listOptions,
  56. })
  57. if err != nil {
  58. ctx.Error(http.StatusInternalServerError, "SearchVersions", err)
  59. return
  60. }
  61. pds, err := packages.GetPackageDescriptors(ctx, pvs)
  62. if err != nil {
  63. ctx.Error(http.StatusInternalServerError, "GetPackageDescriptors", err)
  64. return
  65. }
  66. apiPackages := make([]*api.Package, 0, len(pds))
  67. for _, pd := range pds {
  68. apiPackage, err := convert.ToPackage(ctx, pd, ctx.Doer)
  69. if err != nil {
  70. ctx.Error(http.StatusInternalServerError, "Error converting package for api", err)
  71. return
  72. }
  73. apiPackages = append(apiPackages, apiPackage)
  74. }
  75. ctx.SetLinkHeader(int(count), listOptions.PageSize)
  76. ctx.SetTotalCountHeader(count)
  77. ctx.JSON(http.StatusOK, apiPackages)
  78. }
  79. // GetPackage gets a package
  80. func GetPackage(ctx *context.APIContext) {
  81. // swagger:operation GET /packages/{owner}/{type}/{name}/{version} package getPackage
  82. // ---
  83. // summary: Gets a package
  84. // produces:
  85. // - application/json
  86. // parameters:
  87. // - name: owner
  88. // in: path
  89. // description: owner of the package
  90. // type: string
  91. // required: true
  92. // - name: type
  93. // in: path
  94. // description: type of the package
  95. // type: string
  96. // required: true
  97. // - name: name
  98. // in: path
  99. // description: name of the package
  100. // type: string
  101. // required: true
  102. // - name: version
  103. // in: path
  104. // description: version of the package
  105. // type: string
  106. // required: true
  107. // responses:
  108. // "200":
  109. // "$ref": "#/responses/Package"
  110. // "404":
  111. // "$ref": "#/responses/notFound"
  112. apiPackage, err := convert.ToPackage(ctx, ctx.Package.Descriptor, ctx.Doer)
  113. if err != nil {
  114. ctx.Error(http.StatusInternalServerError, "Error converting package for api", err)
  115. return
  116. }
  117. ctx.JSON(http.StatusOK, apiPackage)
  118. }
  119. // DeletePackage deletes a package
  120. func DeletePackage(ctx *context.APIContext) {
  121. // swagger:operation DELETE /packages/{owner}/{type}/{name}/{version} package deletePackage
  122. // ---
  123. // summary: Delete a package
  124. // parameters:
  125. // - name: owner
  126. // in: path
  127. // description: owner of the package
  128. // type: string
  129. // required: true
  130. // - name: type
  131. // in: path
  132. // description: type of the package
  133. // type: string
  134. // required: true
  135. // - name: name
  136. // in: path
  137. // description: name of the package
  138. // type: string
  139. // required: true
  140. // - name: version
  141. // in: path
  142. // description: version of the package
  143. // type: string
  144. // required: true
  145. // responses:
  146. // "204":
  147. // "$ref": "#/responses/empty"
  148. // "404":
  149. // "$ref": "#/responses/notFound"
  150. err := packages_service.RemovePackageVersion(ctx.Doer, ctx.Package.Descriptor.Version)
  151. if err != nil {
  152. ctx.Error(http.StatusInternalServerError, "RemovePackageVersion", err)
  153. return
  154. }
  155. ctx.Status(http.StatusNoContent)
  156. }
  157. // ListPackageFiles gets all files of a package
  158. func ListPackageFiles(ctx *context.APIContext) {
  159. // swagger:operation GET /packages/{owner}/{type}/{name}/{version}/files package listPackageFiles
  160. // ---
  161. // summary: Gets all files of a package
  162. // produces:
  163. // - application/json
  164. // parameters:
  165. // - name: owner
  166. // in: path
  167. // description: owner of the package
  168. // type: string
  169. // required: true
  170. // - name: type
  171. // in: path
  172. // description: type of the package
  173. // type: string
  174. // required: true
  175. // - name: name
  176. // in: path
  177. // description: name of the package
  178. // type: string
  179. // required: true
  180. // - name: version
  181. // in: path
  182. // description: version of the package
  183. // type: string
  184. // required: true
  185. // responses:
  186. // "200":
  187. // "$ref": "#/responses/PackageFileList"
  188. // "404":
  189. // "$ref": "#/responses/notFound"
  190. apiPackageFiles := make([]*api.PackageFile, 0, len(ctx.Package.Descriptor.Files))
  191. for _, pfd := range ctx.Package.Descriptor.Files {
  192. apiPackageFiles = append(apiPackageFiles, convert.ToPackageFile(pfd))
  193. }
  194. ctx.JSON(http.StatusOK, apiPackageFiles)
  195. }