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  }