code.gitea.io/gitea@v1.22.3/routers/api/v1/user/repo.go (about)

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package user
     5  
     6  import (
     7  	"net/http"
     8  
     9  	access_model "code.gitea.io/gitea/models/perm/access"
    10  	repo_model "code.gitea.io/gitea/models/repo"
    11  	user_model "code.gitea.io/gitea/models/user"
    12  	api "code.gitea.io/gitea/modules/structs"
    13  	"code.gitea.io/gitea/routers/api/v1/utils"
    14  	"code.gitea.io/gitea/services/context"
    15  	"code.gitea.io/gitea/services/convert"
    16  )
    17  
    18  // listUserRepos - List the repositories owned by the given user.
    19  func listUserRepos(ctx *context.APIContext, u *user_model.User, private bool) {
    20  	opts := utils.GetListOptions(ctx)
    21  
    22  	repos, count, err := repo_model.GetUserRepositories(ctx, &repo_model.SearchRepoOptions{
    23  		Actor:       u,
    24  		Private:     private,
    25  		ListOptions: opts,
    26  		OrderBy:     "id ASC",
    27  	})
    28  	if err != nil {
    29  		ctx.Error(http.StatusInternalServerError, "GetUserRepositories", err)
    30  		return
    31  	}
    32  
    33  	if err := repos.LoadAttributes(ctx); err != nil {
    34  		ctx.Error(http.StatusInternalServerError, "RepositoryList.LoadAttributes", err)
    35  		return
    36  	}
    37  
    38  	apiRepos := make([]*api.Repository, 0, len(repos))
    39  	for i := range repos {
    40  		permission, err := access_model.GetUserRepoPermission(ctx, repos[i], ctx.Doer)
    41  		if err != nil {
    42  			ctx.Error(http.StatusInternalServerError, "GetUserRepoPermission", err)
    43  			return
    44  		}
    45  		if ctx.IsSigned && ctx.Doer.IsAdmin || permission.HasAnyUnitAccess() {
    46  			apiRepos = append(apiRepos, convert.ToRepo(ctx, repos[i], permission))
    47  		}
    48  	}
    49  
    50  	ctx.SetLinkHeader(int(count), opts.PageSize)
    51  	ctx.SetTotalCountHeader(count)
    52  	ctx.JSON(http.StatusOK, &apiRepos)
    53  }
    54  
    55  // ListUserRepos - list the repos owned by the given user.
    56  func ListUserRepos(ctx *context.APIContext) {
    57  	// swagger:operation GET /users/{username}/repos user userListRepos
    58  	// ---
    59  	// summary: List the repos owned by the given user
    60  	// produces:
    61  	// - application/json
    62  	// parameters:
    63  	// - name: username
    64  	//   in: path
    65  	//   description: username of user
    66  	//   type: string
    67  	//   required: true
    68  	// - name: page
    69  	//   in: query
    70  	//   description: page number of results to return (1-based)
    71  	//   type: integer
    72  	// - name: limit
    73  	//   in: query
    74  	//   description: page size of results
    75  	//   type: integer
    76  	// responses:
    77  	//   "200":
    78  	//     "$ref": "#/responses/RepositoryList"
    79  	//   "404":
    80  	//     "$ref": "#/responses/notFound"
    81  
    82  	private := ctx.IsSigned
    83  	listUserRepos(ctx, ctx.ContextUser, private)
    84  }
    85  
    86  // ListMyRepos - list the repositories you own or have access to.
    87  func ListMyRepos(ctx *context.APIContext) {
    88  	// swagger:operation GET /user/repos user userCurrentListRepos
    89  	// ---
    90  	// summary: List the repos that the authenticated user owns
    91  	// produces:
    92  	// - application/json
    93  	// parameters:
    94  	// - name: page
    95  	//   in: query
    96  	//   description: page number of results to return (1-based)
    97  	//   type: integer
    98  	// - name: limit
    99  	//   in: query
   100  	//   description: page size of results
   101  	//   type: integer
   102  	// responses:
   103  	//   "200":
   104  	//     "$ref": "#/responses/RepositoryList"
   105  
   106  	opts := &repo_model.SearchRepoOptions{
   107  		ListOptions:        utils.GetListOptions(ctx),
   108  		Actor:              ctx.Doer,
   109  		OwnerID:            ctx.Doer.ID,
   110  		Private:            ctx.IsSigned,
   111  		IncludeDescription: true,
   112  	}
   113  
   114  	var err error
   115  	repos, count, err := repo_model.SearchRepository(ctx, opts)
   116  	if err != nil {
   117  		ctx.Error(http.StatusInternalServerError, "SearchRepository", err)
   118  		return
   119  	}
   120  
   121  	results := make([]*api.Repository, len(repos))
   122  	for i, repo := range repos {
   123  		if err = repo.LoadOwner(ctx); err != nil {
   124  			ctx.Error(http.StatusInternalServerError, "LoadOwner", err)
   125  			return
   126  		}
   127  		permission, err := access_model.GetUserRepoPermission(ctx, repo, ctx.Doer)
   128  		if err != nil {
   129  			ctx.Error(http.StatusInternalServerError, "GetUserRepoPermission", err)
   130  		}
   131  		results[i] = convert.ToRepo(ctx, repo, permission)
   132  	}
   133  
   134  	ctx.SetLinkHeader(int(count), opts.ListOptions.PageSize)
   135  	ctx.SetTotalCountHeader(count)
   136  	ctx.JSON(http.StatusOK, &results)
   137  }
   138  
   139  // ListOrgRepos - list the repositories of an organization.
   140  func ListOrgRepos(ctx *context.APIContext) {
   141  	// swagger:operation GET /orgs/{org}/repos organization orgListRepos
   142  	// ---
   143  	// summary: List an organization's repos
   144  	// produces:
   145  	// - application/json
   146  	// parameters:
   147  	// - name: org
   148  	//   in: path
   149  	//   description: name of the organization
   150  	//   type: string
   151  	//   required: true
   152  	// - name: page
   153  	//   in: query
   154  	//   description: page number of results to return (1-based)
   155  	//   type: integer
   156  	// - name: limit
   157  	//   in: query
   158  	//   description: page size of results
   159  	//   type: integer
   160  	// responses:
   161  	//   "200":
   162  	//     "$ref": "#/responses/RepositoryList"
   163  	//   "404":
   164  	//     "$ref": "#/responses/notFound"
   165  
   166  	listUserRepos(ctx, ctx.Org.Organization.AsUser(), ctx.IsSigned)
   167  }