2015-12-21 04:24:11 -08:00
// Copyright 2015 The Gogs Authors. All rights reserved.
2020-01-24 19:00:29 +00:00
// Copyright 2020 The Gitea Authors.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2015-12-21 04:24:11 -08:00
package user
import (
2019-12-20 18:07:12 +01:00
"net/http"
2021-11-17 17:58:31 +08:00
user_model "code.gitea.io/gitea/models/user"
2016-11-10 17:24:48 +01:00
"code.gitea.io/gitea/modules/context"
2019-08-23 09:40:30 -07:00
api "code.gitea.io/gitea/modules/structs"
2020-01-24 19:00:29 +00:00
"code.gitea.io/gitea/routers/api/v1/utils"
2022-12-29 03:57:15 +01:00
"code.gitea.io/gitea/services/convert"
2015-12-21 04:24:11 -08:00
)
2021-11-24 17:49:20 +08:00
func responseAPIUsers ( ctx * context . APIContext , users [ ] * user_model . User ) {
2015-12-21 04:24:11 -08:00
apiUsers := make ( [ ] * api . User , len ( users ) )
for i := range users {
2022-03-22 08:03:22 +01:00
apiUsers [ i ] = convert . ToUser ( users [ i ] , ctx . Doer )
2015-12-21 04:24:11 -08:00
}
2019-12-20 18:07:12 +01:00
ctx . JSON ( http . StatusOK , & apiUsers )
2015-12-21 04:24:11 -08:00
}
2021-11-24 17:49:20 +08:00
func listUserFollowers ( ctx * context . APIContext , u * user_model . User ) {
2022-07-05 16:47:45 +01:00
users , count , err := user_model . GetUserFollowers ( ctx , u , ctx . Doer , utils . GetListOptions ( ctx ) )
2015-12-21 04:24:11 -08:00
if err != nil {
2019-12-20 18:07:12 +01:00
ctx . Error ( http . StatusInternalServerError , "GetUserFollowers" , err )
2015-12-21 04:24:11 -08:00
return
}
2021-08-12 14:43:08 +02:00
2022-07-05 16:47:45 +01:00
ctx . SetTotalCountHeader ( count )
2016-11-24 15:04:31 +08:00
responseAPIUsers ( ctx , users )
2015-12-21 04:24:11 -08:00
}
2017-11-12 23:02:25 -08:00
// ListMyFollowers list the authenticated user's followers
2016-03-13 18:49:16 -04:00
func ListMyFollowers ( ctx * context . APIContext ) {
2017-11-12 23:02:25 -08:00
// swagger:operation GET /user/followers user userCurrentListFollowers
// ---
// summary: List the authenticated user's followers
2020-01-24 19:00:29 +00:00
// parameters:
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
2020-06-09 06:57:38 +02:00
// description: page size of results
2020-01-24 19:00:29 +00:00
// type: integer
2017-11-12 23:02:25 -08:00
// produces:
// - application/json
// responses:
// "200":
// "$ref": "#/responses/UserList"
2019-12-20 18:07:12 +01:00
2022-03-22 08:03:22 +01:00
listUserFollowers ( ctx , ctx . Doer )
2015-12-21 04:24:11 -08:00
}
2017-11-12 23:02:25 -08:00
// ListFollowers list the given user's followers
2016-03-13 18:49:16 -04:00
func ListFollowers ( ctx * context . APIContext ) {
2017-11-12 23:02:25 -08:00
// swagger:operation GET /users/{username}/followers user userListFollowers
// ---
// summary: List the given user's followers
// produces:
// - application/json
// parameters:
// - name: username
// in: path
// description: username of user
// type: string
// required: true
2020-01-24 19:00:29 +00:00
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
2020-06-09 06:57:38 +02:00
// description: page size of results
2020-01-24 19:00:29 +00:00
// type: integer
2017-11-12 23:02:25 -08:00
// responses:
// "200":
// "$ref": "#/responses/UserList"
2019-12-20 18:07:12 +01:00
2022-03-26 10:04:22 +01:00
listUserFollowers ( ctx , ctx . ContextUser )
2015-12-21 04:24:11 -08:00
}
2021-11-24 17:49:20 +08:00
func listUserFollowing ( ctx * context . APIContext , u * user_model . User ) {
2022-07-05 16:47:45 +01:00
users , count , err := user_model . GetUserFollowing ( ctx , u , ctx . Doer , utils . GetListOptions ( ctx ) )
2015-12-21 04:24:11 -08:00
if err != nil {
2021-11-22 23:21:55 +08:00
ctx . Error ( http . StatusInternalServerError , "GetUserFollowing" , err )
2015-12-21 04:24:11 -08:00
return
}
2021-08-12 14:43:08 +02:00
2022-07-05 16:47:45 +01:00
ctx . SetTotalCountHeader ( count )
2016-11-24 15:04:31 +08:00
responseAPIUsers ( ctx , users )
2015-12-21 04:24:11 -08:00
}
2017-11-12 23:02:25 -08:00
// ListMyFollowing list the users that the authenticated user is following
2016-03-13 18:49:16 -04:00
func ListMyFollowing ( ctx * context . APIContext ) {
2017-11-12 23:02:25 -08:00
// swagger:operation GET /user/following user userCurrentListFollowing
// ---
// summary: List the users that the authenticated user is following
2020-01-24 19:00:29 +00:00
// parameters:
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
2020-06-09 06:57:38 +02:00
// description: page size of results
2020-01-24 19:00:29 +00:00
// type: integer
2017-11-12 23:02:25 -08:00
// produces:
// - application/json
// responses:
// "200":
// "$ref": "#/responses/UserList"
2019-12-20 18:07:12 +01:00
2022-03-22 08:03:22 +01:00
listUserFollowing ( ctx , ctx . Doer )
2015-12-21 04:24:11 -08:00
}
2017-11-12 23:02:25 -08:00
// ListFollowing list the users that the given user is following
2016-03-13 18:49:16 -04:00
func ListFollowing ( ctx * context . APIContext ) {
2017-11-12 23:02:25 -08:00
// swagger:operation GET /users/{username}/following user userListFollowing
// ---
// summary: List the users that the given user is following
// produces:
// - application/json
// parameters:
// - name: username
// in: path
// description: username of user
// type: string
// required: true
2020-01-24 19:00:29 +00:00
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
2020-06-09 06:57:38 +02:00
// description: page size of results
2020-01-24 19:00:29 +00:00
// type: integer
2017-11-12 23:02:25 -08:00
// responses:
// "200":
// "$ref": "#/responses/UserList"
2019-12-20 18:07:12 +01:00
2022-03-26 10:04:22 +01:00
listUserFollowing ( ctx , ctx . ContextUser )
2015-12-21 04:24:11 -08:00
}
2021-11-24 17:49:20 +08:00
func checkUserFollowing ( ctx * context . APIContext , u * user_model . User , followID int64 ) {
2021-11-22 23:21:55 +08:00
if user_model . IsFollowing ( u . ID , followID ) {
2019-12-20 18:07:12 +01:00
ctx . Status ( http . StatusNoContent )
2015-12-21 04:24:11 -08:00
} else {
2019-03-18 21:29:43 -05:00
ctx . NotFound ( )
2015-12-21 04:24:11 -08:00
}
}
2017-11-12 23:02:25 -08:00
// CheckMyFollowing whether the given user is followed by the authenticated user
2016-03-13 18:49:16 -04:00
func CheckMyFollowing ( ctx * context . APIContext ) {
2018-06-12 16:59:22 +02:00
// swagger:operation GET /user/following/{username} user userCurrentCheckFollowing
2017-11-12 23:02:25 -08:00
// ---
// summary: Check whether a user is followed by the authenticated user
// parameters:
2018-06-12 16:59:22 +02:00
// - name: username
2017-11-12 23:02:25 -08:00
// in: path
// description: username of followed user
// type: string
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
// "404":
// "$ref": "#/responses/notFound"
2019-12-20 18:07:12 +01:00
2022-03-26 10:04:22 +01:00
checkUserFollowing ( ctx , ctx . Doer , ctx . ContextUser . ID )
2015-12-21 04:24:11 -08:00
}
2017-11-12 23:02:25 -08:00
// CheckFollowing check if one user is following another user
2016-03-13 18:49:16 -04:00
func CheckFollowing ( ctx * context . APIContext ) {
2022-03-26 10:04:22 +01:00
// swagger:operation GET /users/{username}/following/{target} user userCheckFollowing
2017-11-12 23:02:25 -08:00
// ---
// summary: Check if one user is following another user
// parameters:
2022-03-26 10:04:22 +01:00
// - name: username
2017-11-12 23:02:25 -08:00
// in: path
// description: username of following user
// type: string
// required: true
2022-03-26 10:04:22 +01:00
// - name: target
2017-11-12 23:02:25 -08:00
// in: path
// description: username of followed user
// type: string
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
// "404":
// "$ref": "#/responses/notFound"
2019-12-20 18:07:12 +01:00
2015-12-21 04:24:11 -08:00
target := GetUserByParamsName ( ctx , ":target" )
if ctx . Written ( ) {
return
}
2022-03-26 10:04:22 +01:00
checkUserFollowing ( ctx , ctx . ContextUser , target . ID )
2015-12-21 04:24:11 -08:00
}
2017-11-12 23:02:25 -08:00
// Follow follow a user
2016-03-13 18:49:16 -04:00
func Follow ( ctx * context . APIContext ) {
2017-11-12 23:02:25 -08:00
// swagger:operation PUT /user/following/{username} user userCurrentPutFollow
// ---
// summary: Follow a user
// parameters:
// - name: username
// in: path
// description: username of user to follow
// type: string
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
2019-12-20 18:07:12 +01:00
2022-03-26 10:04:22 +01:00
if err := user_model . FollowUser ( ctx . Doer . ID , ctx . ContextUser . ID ) ; err != nil {
2019-12-20 18:07:12 +01:00
ctx . Error ( http . StatusInternalServerError , "FollowUser" , err )
2015-12-21 04:24:11 -08:00
return
}
2019-12-20 18:07:12 +01:00
ctx . Status ( http . StatusNoContent )
2015-12-21 04:24:11 -08:00
}
2017-11-12 23:02:25 -08:00
// Unfollow unfollow a user
2016-03-13 18:49:16 -04:00
func Unfollow ( ctx * context . APIContext ) {
2017-11-12 23:02:25 -08:00
// swagger:operation DELETE /user/following/{username} user userCurrentDeleteFollow
// ---
// summary: Unfollow a user
// parameters:
// - name: username
// in: path
// description: username of user to unfollow
// type: string
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
2019-12-20 18:07:12 +01:00
2022-03-26 10:04:22 +01:00
if err := user_model . UnfollowUser ( ctx . Doer . ID , ctx . ContextUser . ID ) ; err != nil {
2019-12-20 18:07:12 +01:00
ctx . Error ( http . StatusInternalServerError , "UnfollowUser" , err )
2015-12-21 04:24:11 -08:00
return
}
2019-12-20 18:07:12 +01:00
ctx . Status ( http . StatusNoContent )
2015-12-21 04:24:11 -08:00
}