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