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 }