code.gitea.io/gitea@v1.22.3/routers/api/v1/user/user.go (about) 1 // Copyright 2014 The Gogs Authors. All rights reserved. 2 // Copyright 2020 The Gitea Authors. 3 // SPDX-License-Identifier: MIT 4 5 package user 6 7 import ( 8 "net/http" 9 10 activities_model "code.gitea.io/gitea/models/activities" 11 user_model "code.gitea.io/gitea/models/user" 12 "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 // Search search users 19 func Search(ctx *context.APIContext) { 20 // swagger:operation GET /users/search user userSearch 21 // --- 22 // summary: Search for users 23 // produces: 24 // - application/json 25 // parameters: 26 // - name: q 27 // in: query 28 // description: keyword 29 // type: string 30 // - name: uid 31 // in: query 32 // description: ID of the user to search for 33 // type: integer 34 // format: int64 35 // - name: page 36 // in: query 37 // description: page number of results to return (1-based) 38 // type: integer 39 // - name: limit 40 // in: query 41 // description: page size of results 42 // type: integer 43 // responses: 44 // "200": 45 // description: "SearchResults of a successful search" 46 // schema: 47 // type: object 48 // properties: 49 // ok: 50 // type: boolean 51 // data: 52 // type: array 53 // items: 54 // "$ref": "#/definitions/User" 55 56 listOptions := utils.GetListOptions(ctx) 57 58 uid := ctx.FormInt64("uid") 59 var users []*user_model.User 60 var maxResults int64 61 var err error 62 63 switch uid { 64 case user_model.GhostUserID: 65 maxResults = 1 66 users = []*user_model.User{user_model.NewGhostUser()} 67 case user_model.ActionsUserID: 68 maxResults = 1 69 users = []*user_model.User{user_model.NewActionsUser()} 70 default: 71 var visible []structs.VisibleType 72 if ctx.PublicOnly { 73 visible = []structs.VisibleType{structs.VisibleTypePublic} 74 } 75 users, maxResults, err = user_model.SearchUsers(ctx, &user_model.SearchUserOptions{ 76 Actor: ctx.Doer, 77 Keyword: ctx.FormTrim("q"), 78 UID: uid, 79 Type: user_model.UserTypeIndividual, 80 Visible: visible, 81 ListOptions: listOptions, 82 }) 83 if err != nil { 84 ctx.JSON(http.StatusInternalServerError, map[string]any{ 85 "ok": false, 86 "error": err.Error(), 87 }) 88 return 89 } 90 } 91 92 ctx.SetLinkHeader(int(maxResults), listOptions.PageSize) 93 ctx.SetTotalCountHeader(maxResults) 94 95 ctx.JSON(http.StatusOK, map[string]any{ 96 "ok": true, 97 "data": convert.ToUsers(ctx, ctx.Doer, users), 98 }) 99 } 100 101 // GetInfo get user's information 102 func GetInfo(ctx *context.APIContext) { 103 // swagger:operation GET /users/{username} user userGet 104 // --- 105 // summary: Get a user 106 // produces: 107 // - application/json 108 // parameters: 109 // - name: username 110 // in: path 111 // description: username of user to get 112 // type: string 113 // required: true 114 // responses: 115 // "200": 116 // "$ref": "#/responses/User" 117 // "404": 118 // "$ref": "#/responses/notFound" 119 120 if !user_model.IsUserVisibleToViewer(ctx, ctx.ContextUser, ctx.Doer) { 121 // fake ErrUserNotExist error message to not leak information about existence 122 ctx.NotFound("GetUserByName", user_model.ErrUserNotExist{Name: ctx.Params(":username")}) 123 return 124 } 125 ctx.JSON(http.StatusOK, convert.ToUser(ctx, ctx.ContextUser, ctx.Doer)) 126 } 127 128 // GetAuthenticatedUser get current user's information 129 func GetAuthenticatedUser(ctx *context.APIContext) { 130 // swagger:operation GET /user user userGetCurrent 131 // --- 132 // summary: Get the authenticated user 133 // produces: 134 // - application/json 135 // responses: 136 // "200": 137 // "$ref": "#/responses/User" 138 139 ctx.JSON(http.StatusOK, convert.ToUser(ctx, ctx.Doer, ctx.Doer)) 140 } 141 142 // GetUserHeatmapData is the handler to get a users heatmap 143 func GetUserHeatmapData(ctx *context.APIContext) { 144 // swagger:operation GET /users/{username}/heatmap user userGetHeatmapData 145 // --- 146 // summary: Get a user's heatmap 147 // produces: 148 // - application/json 149 // parameters: 150 // - name: username 151 // in: path 152 // description: username of user to get 153 // type: string 154 // required: true 155 // responses: 156 // "200": 157 // "$ref": "#/responses/UserHeatmapData" 158 // "404": 159 // "$ref": "#/responses/notFound" 160 161 heatmap, err := activities_model.GetUserHeatmapDataByUser(ctx, ctx.ContextUser, ctx.Doer) 162 if err != nil { 163 ctx.Error(http.StatusInternalServerError, "GetUserHeatmapDataByUser", err) 164 return 165 } 166 ctx.JSON(http.StatusOK, heatmap) 167 } 168 169 func ListUserActivityFeeds(ctx *context.APIContext) { 170 // swagger:operation GET /users/{username}/activities/feeds user userListActivityFeeds 171 // --- 172 // summary: List a user's activity feeds 173 // produces: 174 // - application/json 175 // parameters: 176 // - name: username 177 // in: path 178 // description: username of user 179 // type: string 180 // required: true 181 // - name: only-performed-by 182 // in: query 183 // description: if true, only show actions performed by the requested user 184 // type: boolean 185 // - name: date 186 // in: query 187 // description: the date of the activities to be found 188 // type: string 189 // format: date 190 // - name: page 191 // in: query 192 // description: page number of results to return (1-based) 193 // type: integer 194 // - name: limit 195 // in: query 196 // description: page size of results 197 // type: integer 198 // responses: 199 // "200": 200 // "$ref": "#/responses/ActivityFeedsList" 201 // "404": 202 // "$ref": "#/responses/notFound" 203 204 includePrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID) 205 listOptions := utils.GetListOptions(ctx) 206 207 opts := activities_model.GetFeedsOptions{ 208 RequestedUser: ctx.ContextUser, 209 Actor: ctx.Doer, 210 IncludePrivate: includePrivate, 211 OnlyPerformedBy: ctx.FormBool("only-performed-by"), 212 Date: ctx.FormString("date"), 213 ListOptions: listOptions, 214 } 215 216 feeds, count, err := activities_model.GetFeeds(ctx, opts) 217 if err != nil { 218 ctx.Error(http.StatusInternalServerError, "GetFeeds", err) 219 return 220 } 221 ctx.SetTotalCountHeader(count) 222 223 ctx.JSON(http.StatusOK, convert.ToActivities(ctx, feeds, ctx.Doer)) 224 }