code.gitea.io/gitea@v1.21.7/routers/api/v1/packages/package.go (about)

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