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 }