2015-01-19 11:01:04 -06:00
package api
import (
2021-10-04 08:46:09 -05:00
"context"
2020-11-19 06:34:28 -06:00
"errors"
2021-11-29 03:18:01 -06:00
"net/http"
2022-01-14 10:55:57 -06:00
"strconv"
2020-11-19 06:34:28 -06:00
2017-08-18 07:49:04 -05:00
"github.com/grafana/grafana/pkg/api/dtos"
2021-01-15 07:43:20 -06:00
"github.com/grafana/grafana/pkg/api/response"
2020-03-04 05:57:20 -06:00
"github.com/grafana/grafana/pkg/models"
2022-08-10 03:21:33 -05:00
"github.com/grafana/grafana/pkg/services/login"
2022-07-20 07:50:06 -05:00
"github.com/grafana/grafana/pkg/services/user"
2016-04-09 12:27:06 -05:00
"github.com/grafana/grafana/pkg/setting"
2015-02-19 09:09:49 -06:00
"github.com/grafana/grafana/pkg/util"
2021-11-29 03:18:01 -06:00
"github.com/grafana/grafana/pkg/web"
2015-01-19 11:01:04 -06:00
)
2022-07-27 08:54:37 -05:00
// swagger:route GET /user signed_in_user getSignedInUser
//
// Get (current authenticated user)
//
// Responses:
// 200: userResponse
// 401: unauthorisedError
// 403: forbiddenError
// 404: notFoundError
// 500: internalServerError
2022-01-05 02:59:17 -06:00
func ( hs * HTTPServer ) GetSignedInUser ( c * models . ReqContext ) response . Response {
return hs . getUserUserProfile ( c , c . UserId )
2015-05-18 10:28:15 -05:00
}
2022-07-27 08:54:37 -05:00
// swagger:route GET /users/{user_id} users getUserByID
//
// Get user by id.
//
// Responses:
// 200: userResponse
// 401: unauthorisedError
// 403: forbiddenError
// 404: notFoundError
// 500: internalServerError
2022-01-05 02:59:17 -06:00
func ( hs * HTTPServer ) GetUserByID ( c * models . ReqContext ) response . Response {
2022-01-14 10:55:57 -06:00
id , err := strconv . ParseInt ( web . Params ( c . Req ) [ ":id" ] , 10 , 64 )
if err != nil {
return response . Error ( http . StatusBadRequest , "id is invalid" , err )
}
return hs . getUserUserProfile ( c , id )
2015-05-18 10:28:15 -05:00
}
2022-01-05 02:59:17 -06:00
func ( hs * HTTPServer ) getUserUserProfile ( c * models . ReqContext , userID int64 ) response . Response {
2020-03-04 05:57:20 -06:00
query := models . GetUserProfileQuery { UserId : userID }
2015-01-19 11:01:04 -06:00
2022-01-26 13:24:05 -06:00
if err := hs . SQLStore . GetUserProfile ( c . Req . Context ( ) , & query ) ; err != nil {
2022-07-20 07:50:06 -05:00
if errors . Is ( err , user . ErrUserNotFound ) {
return response . Error ( 404 , user . ErrUserNotFound . Error ( ) , nil )
2017-01-30 23:25:55 -06:00
}
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Failed to get user" , err )
2015-01-19 11:01:04 -06:00
}
2020-03-04 05:57:20 -06:00
getAuthQuery := models . GetAuthInfoQuery { UserId : userID }
2019-07-10 04:06:51 -05:00
query . Result . AuthLabels = [ ] string { }
2022-01-26 13:24:05 -06:00
if err := hs . authInfoService . GetAuthInfo ( c . Req . Context ( ) , & getAuthQuery ) ; err == nil {
2022-08-10 03:21:33 -05:00
authLabel := login . GetAuthProviderLabel ( getAuthQuery . Result . AuthModule )
2019-07-10 04:06:51 -05:00
query . Result . AuthLabels = append ( query . Result . AuthLabels , authLabel )
query . Result . IsExternal = true
2019-06-25 10:29:07 -05:00
}
2022-03-24 02:58:10 -05:00
query . Result . AccessControl = hs . getAccessControlMetadata ( c , c . OrgId , "global.users:id:" , strconv . FormatInt ( userID , 10 ) )
2020-01-13 10:10:19 -06:00
query . Result . AvatarUrl = dtos . GetGravatarUrl ( query . Result . Email )
2022-04-15 07:01:58 -05:00
return response . JSON ( http . StatusOK , query . Result )
2015-01-19 11:01:04 -06:00
}
2022-07-27 08:54:37 -05:00
// swagger:route GET /users/lookup users getUserByLoginOrEmail
//
// Get user by login or email.
//
// Responses:
// 200: userResponse
// 401: unauthorisedError
// 403: forbiddenError
// 404: notFoundError
// 500: internalServerError
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) GetUserByLoginOrEmail ( c * models . ReqContext ) response . Response {
2022-08-04 06:22:43 -05:00
query := user . GetUserByLoginQuery { LoginOrEmail : c . Query ( "loginOrEmail" ) }
usr , err := hs . userService . GetByLogin ( c . Req . Context ( ) , & query )
if err != nil {
2022-07-20 07:50:06 -05:00
if errors . Is ( err , user . ErrUserNotFound ) {
return response . Error ( 404 , user . ErrUserNotFound . Error ( ) , nil )
2017-01-30 23:25:55 -06:00
}
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Failed to get user" , err )
2017-01-30 23:25:55 -06:00
}
2020-03-04 05:57:20 -06:00
result := models . UserProfileDTO {
2022-08-04 06:22:43 -05:00
Id : usr . ID ,
Name : usr . Name ,
Email : usr . Email ,
Login : usr . Login ,
Theme : usr . Theme ,
IsGrafanaAdmin : usr . IsAdmin ,
OrgId : usr . OrgID ,
UpdatedAt : usr . Updated ,
CreatedAt : usr . Created ,
2017-01-30 23:25:55 -06:00
}
2022-04-15 07:01:58 -05:00
return response . JSON ( http . StatusOK , & result )
2017-01-30 23:25:55 -06:00
}
2022-07-27 08:54:37 -05:00
// swagger:route PUT /user signed_in_user updateSignedInUser
//
// Update signed in User.
//
// Responses:
// 200: okResponse
// 401: unauthorisedError
// 403: forbiddenError
// 500: internalServerError
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) UpdateSignedInUser ( c * models . ReqContext ) response . Response {
2022-08-04 07:22:44 -05:00
cmd := user . UpdateUserCommand { }
2021-11-29 03:18:01 -06:00
if err := web . Bind ( c . Req , & cmd ) ; err != nil {
return response . Error ( http . StatusBadRequest , "bad request data" , err )
}
2016-12-14 15:19:25 -06:00
if setting . AuthProxyEnabled {
if setting . AuthProxyHeaderProperty == "email" && cmd . Email != c . Email {
2021-01-15 07:43:20 -06:00
return response . Error ( 400 , "Not allowed to change email when auth proxy is using email property" , nil )
2016-12-14 15:19:25 -06:00
}
if setting . AuthProxyHeaderProperty == "username" && cmd . Login != c . Login {
2021-01-15 07:43:20 -06:00
return response . Error ( 400 , "Not allowed to change username when auth proxy is using username property" , nil )
2016-12-14 15:19:25 -06:00
}
}
2022-08-04 07:22:44 -05:00
cmd . UserID = c . UserId
2022-01-26 13:24:05 -06:00
return hs . handleUpdateUser ( c . Req . Context ( ) , cmd )
2015-05-18 12:06:19 -05:00
}
2022-07-27 08:54:37 -05:00
// swagger:route PUT /users/{user_id} users updateUser
//
// Update user.
//
// Update the user identified by id.
//
// Responses:
// 200: okResponse
// 401: unauthorisedError
// 403: forbiddenError
// 404: notFoundError
// 500: internalServerError
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) UpdateUser ( c * models . ReqContext ) response . Response {
2022-08-04 07:22:44 -05:00
cmd := user . UpdateUserCommand { }
2022-01-14 10:55:57 -06:00
var err error
2021-11-29 03:18:01 -06:00
if err := web . Bind ( c . Req , & cmd ) ; err != nil {
return response . Error ( http . StatusBadRequest , "bad request data" , err )
}
2022-08-04 07:22:44 -05:00
cmd . UserID , err = strconv . ParseInt ( web . Params ( c . Req ) [ ":id" ] , 10 , 64 )
2022-01-14 10:55:57 -06:00
if err != nil {
return response . Error ( http . StatusBadRequest , "id is invalid" , err )
}
2022-01-26 13:24:05 -06:00
return hs . handleUpdateUser ( c . Req . Context ( ) , cmd )
2015-05-18 12:06:19 -05:00
}
2020-09-22 09:22:19 -05:00
// POST /api/users/:id/using/:orgId
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) UpdateUserActiveOrg ( c * models . ReqContext ) response . Response {
2022-01-14 10:55:57 -06:00
userID , err := strconv . ParseInt ( web . Params ( c . Req ) [ ":id" ] , 10 , 64 )
if err != nil {
return response . Error ( http . StatusBadRequest , "id is invalid" , err )
}
orgID , err := strconv . ParseInt ( web . Params ( c . Req ) [ ":orgId" ] , 10 , 64 )
if err != nil {
return response . Error ( http . StatusBadRequest , "orgId is invalid" , err )
}
2016-05-25 23:51:23 -05:00
2022-01-26 13:24:05 -06:00
if ! hs . validateUsingOrg ( c . Req . Context ( ) , userID , orgID ) {
2021-01-15 07:43:20 -06:00
return response . Error ( 401 , "Not a valid organization" , nil )
2016-05-25 23:51:23 -05:00
}
2020-03-04 05:57:20 -06:00
cmd := models . SetUsingOrgCommand { UserId : userID , OrgId : orgID }
2016-05-25 23:51:23 -05:00
2022-01-26 13:24:05 -06:00
if err := hs . SQLStore . SetUsingOrg ( c . Req . Context ( ) , & cmd ) ; err != nil {
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Failed to change active organization" , err )
2016-05-25 23:51:23 -05:00
}
2021-01-15 07:43:20 -06:00
return response . Success ( "Active organization changed" )
2016-05-25 23:51:23 -05:00
}
2022-08-04 07:22:44 -05:00
func ( hs * HTTPServer ) handleUpdateUser ( ctx context . Context , cmd user . UpdateUserCommand ) response . Response {
2015-05-18 12:06:19 -05:00
if len ( cmd . Login ) == 0 {
cmd . Login = cmd . Email
if len ( cmd . Login ) == 0 {
2022-06-24 09:59:45 -05:00
return response . Error ( http . StatusBadRequest , "Validation error, need to specify either username or email" , nil )
2015-05-18 12:06:19 -05:00
}
}
2015-01-19 11:01:04 -06:00
2022-08-04 07:22:44 -05:00
if err := hs . userService . Update ( ctx , & cmd ) ; err != nil {
2022-07-20 07:50:06 -05:00
if errors . Is ( err , user . ErrCaseInsensitive ) {
2022-06-24 09:59:45 -05:00
return response . Error ( http . StatusConflict , "Update would result in user login conflict" , err )
}
return response . Error ( http . StatusInternalServerError , "Failed to update user" , err )
2015-01-19 11:01:04 -06:00
}
2021-01-15 07:43:20 -06:00
return response . Success ( "User updated" )
2015-01-19 11:01:04 -06:00
}
2022-07-27 08:54:37 -05:00
// swagger:route GET /user/orgs signed_in_user getSignedInUserOrgList
//
// Organizations of the actual User.
//
// Return a list of all organizations of the current user.
//
// Security:
// - basic:
//
// Responses:
// 200: getSignedInUserOrgListResponse
// 401: unauthorisedError
// 403: forbiddenError
// 500: internalServerError
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) GetSignedInUserOrgList ( c * models . ReqContext ) response . Response {
return hs . getUserOrgList ( c . Req . Context ( ) , c . UserId )
2015-05-18 10:28:15 -05:00
}
2015-01-19 11:01:04 -06:00
2022-07-27 08:54:37 -05:00
// swagger:route GET /user/teams signed_in_user getSignedInUserTeamList
//
// Teams that the actual User is member of.
//
// Return a list of all teams that the current user is member of.
//
// Responses:
// 200: getSignedInUserTeamListResponse
// 401: unauthorisedError
// 403: forbiddenError
// 500: internalServerError
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) GetSignedInUserTeamList ( c * models . ReqContext ) response . Response {
2022-06-02 07:14:48 -05:00
return hs . getUserTeamList ( c , c . OrgId , c . UserId )
2018-11-19 03:08:10 -06:00
}
2022-07-27 08:54:37 -05:00
// swagger:route GET /users/{user_id}/teams users getUserTeams
//
// Get teams for user.
//
// Get teams for user identified by id.
//
// Responses:
// 200: getUserTeamsResponse
// 401: unauthorisedError
// 403: forbiddenError
// 404: notFoundError
// 500: internalServerError
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) GetUserTeams ( c * models . ReqContext ) response . Response {
2022-01-14 10:55:57 -06:00
id , err := strconv . ParseInt ( web . Params ( c . Req ) [ ":id" ] , 10 , 64 )
if err != nil {
return response . Error ( http . StatusBadRequest , "id is invalid" , err )
}
2022-06-02 07:14:48 -05:00
return hs . getUserTeamList ( c , c . OrgId , id )
2018-11-19 03:08:10 -06:00
}
2022-06-02 07:14:48 -05:00
func ( hs * HTTPServer ) getUserTeamList ( c * models . ReqContext , orgID int64 , userID int64 ) response . Response {
query := models . GetTeamsByUserQuery { OrgId : orgID , UserId : userID , SignedInUser : c . SignedInUser }
2018-08-08 03:26:05 -05:00
2022-06-02 07:14:48 -05:00
if err := hs . SQLStore . GetTeamsByUser ( c . Req . Context ( ) , & query ) ; err != nil {
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Failed to get user teams" , err )
2018-08-08 03:26:05 -05:00
}
for _ , team := range query . Result {
team . AvatarUrl = dtos . GetGravatarUrlWithDefault ( team . Email , team . Name )
}
2022-04-15 07:01:58 -05:00
return response . JSON ( http . StatusOK , query . Result )
2018-08-08 03:26:05 -05:00
}
2022-07-27 08:54:37 -05:00
// swagger:route GET /users/{user_id}/orgs users getUserOrgList
//
// Get organizations for user.
//
// Get organizations for user identified by id.
//
// Responses:
// 200: getUserOrgListResponse
// 401: unauthorisedError
// 403: forbiddenError
// 404: notFoundError
// 500: internalServerError
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) GetUserOrgList ( c * models . ReqContext ) response . Response {
2022-01-14 10:55:57 -06:00
id , err := strconv . ParseInt ( web . Params ( c . Req ) [ ":id" ] , 10 , 64 )
if err != nil {
return response . Error ( http . StatusBadRequest , "id is invalid" , err )
}
2022-01-26 13:24:05 -06:00
return hs . getUserOrgList ( c . Req . Context ( ) , id )
2015-05-18 10:28:15 -05:00
}
2015-01-19 11:01:04 -06:00
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) getUserOrgList ( ctx context . Context , userID int64 ) response . Response {
2020-03-04 05:57:20 -06:00
query := models . GetUserOrgListQuery { UserId : userID }
2015-05-18 10:28:15 -05:00
2022-01-26 13:24:05 -06:00
if err := hs . SQLStore . GetUserOrgList ( ctx , & query ) ; err != nil {
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Failed to get user organizations" , err )
2015-01-19 11:01:04 -06:00
}
2022-04-15 07:01:58 -05:00
return response . JSON ( http . StatusOK , query . Result )
2015-01-19 11:01:04 -06:00
}
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) validateUsingOrg ( ctx context . Context , userID int64 , orgID int64 ) bool {
2020-03-04 05:57:20 -06:00
query := models . GetUserOrgListQuery { UserId : userID }
2015-01-19 11:01:04 -06:00
2022-01-26 13:24:05 -06:00
if err := hs . SQLStore . GetUserOrgList ( ctx , & query ) ; err != nil {
2015-01-19 11:01:04 -06:00
return false
}
2015-02-23 13:07:49 -06:00
// validate that the org id in the list
2015-01-19 11:01:04 -06:00
valid := false
for _ , other := range query . Result {
2018-03-22 06:37:35 -05:00
if other . OrgId == orgID {
2015-01-19 11:01:04 -06:00
valid = true
}
}
return valid
}
2022-07-27 08:54:37 -05:00
// swagger:route POST /user/using/{org_id} signed_in_user userSetUsingOrg
//
// Switch user context for signed in user.
//
// Switch user context to the given organization.
//
// Responses:
// 200: okResponse
// 400: badRequestError
// 401: unauthorisedError
// 403: forbiddenError
// 500: internalServerError
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) UserSetUsingOrg ( c * models . ReqContext ) response . Response {
2022-01-14 10:55:57 -06:00
orgID , err := strconv . ParseInt ( web . Params ( c . Req ) [ ":id" ] , 10 , 64 )
if err != nil {
return response . Error ( http . StatusBadRequest , "id is invalid" , err )
}
2015-01-19 11:01:04 -06:00
2022-01-26 13:24:05 -06:00
if ! hs . validateUsingOrg ( c . Req . Context ( ) , c . UserId , orgID ) {
2021-01-15 07:43:20 -06:00
return response . Error ( 401 , "Not a valid organization" , nil )
2015-01-19 11:01:04 -06:00
}
2020-03-04 05:57:20 -06:00
cmd := models . SetUsingOrgCommand { UserId : c . UserId , OrgId : orgID }
2015-01-19 11:01:04 -06:00
2022-01-26 13:24:05 -06:00
if err := hs . SQLStore . SetUsingOrg ( c . Req . Context ( ) , & cmd ) ; err != nil {
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Failed to change active organization" , err )
2015-01-19 11:01:04 -06:00
}
2021-01-15 07:43:20 -06:00
return response . Success ( "Active organization changed" )
2015-01-19 11:01:04 -06:00
}
2015-02-19 09:09:49 -06:00
2016-04-09 12:27:06 -05:00
// GET /profile/switch-org/:id
2020-03-04 05:57:20 -06:00
func ( hs * HTTPServer ) ChangeActiveOrgAndRedirectToHome ( c * models . ReqContext ) {
2022-01-14 10:55:57 -06:00
orgID , err := strconv . ParseInt ( web . Params ( c . Req ) [ ":id" ] , 10 , 64 )
if err != nil {
c . JsonApiErr ( http . StatusBadRequest , "id is invalid" , err )
return
}
2016-04-09 12:27:06 -05:00
2022-01-26 13:24:05 -06:00
if ! hs . validateUsingOrg ( c . Req . Context ( ) , c . UserId , orgID ) {
2018-10-12 04:26:42 -05:00
hs . NotFoundHandler ( c )
2016-04-09 12:27:06 -05:00
}
2020-03-04 05:57:20 -06:00
cmd := models . SetUsingOrgCommand { UserId : c . UserId , OrgId : orgID }
2016-04-09 12:27:06 -05:00
2022-01-26 13:24:05 -06:00
if err := hs . SQLStore . SetUsingOrg ( c . Req . Context ( ) , & cmd ) ; err != nil {
2018-10-12 04:26:42 -05:00
hs . NotFoundHandler ( c )
2016-04-09 12:27:06 -05:00
}
2021-03-10 05:41:29 -06:00
c . Redirect ( hs . Cfg . AppSubURL + "/" )
2016-04-09 12:27:06 -05:00
}
2022-07-27 08:54:37 -05:00
// swagger:route PUT /user/password signed_in_user changeUserPassword
//
// Change Password.
//
// Changes the password for the user.
//
// Security:
// - basic:
//
// Responses:
// 200: okResponse
// 400: badRequestError
// 401: unauthorisedError
// 403: forbiddenError
// 500: internalServerError
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) ChangeUserPassword ( c * models . ReqContext ) response . Response {
2022-08-04 08:05:05 -05:00
cmd := user . ChangeUserPasswordCommand { }
2021-11-29 03:18:01 -06:00
if err := web . Bind ( c . Req , & cmd ) ; err != nil {
return response . Error ( http . StatusBadRequest , "bad request data" , err )
}
2016-12-14 15:19:25 -06:00
2022-08-02 09:58:05 -05:00
userQuery := user . GetUserByIDQuery { ID : c . UserId }
2015-02-19 09:09:49 -06:00
2022-08-02 09:58:05 -05:00
user , err := hs . userService . GetByID ( c . Req . Context ( ) , & userQuery )
if err != nil {
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Could not read user from database" , err )
2015-02-19 09:09:49 -06:00
}
2022-08-08 00:12:39 -05:00
getAuthQuery := models . GetAuthInfoQuery { UserId : user . ID }
if err := hs . authInfoService . GetAuthInfo ( c . Req . Context ( ) , & getAuthQuery ) ; err == nil {
authModule := getAuthQuery . Result . AuthModule
2022-08-10 03:21:33 -05:00
if authModule == login . LDAPAuthModule || authModule == login . AuthProxyAuthModule {
2022-08-08 00:12:39 -05:00
return response . Error ( 400 , "Not allowed to reset password for LDAP or Auth Proxy user" , nil )
}
}
2022-08-02 09:58:05 -05:00
passwordHashed , err := util . EncodePassword ( cmd . OldPassword , user . Salt )
2019-10-23 03:40:12 -05:00
if err != nil {
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Failed to encode password" , err )
2019-10-23 03:40:12 -05:00
}
2022-08-02 09:58:05 -05:00
if passwordHashed != user . Password {
2021-01-15 07:43:20 -06:00
return response . Error ( 401 , "Invalid old password" , nil )
2015-02-19 09:09:49 -06:00
}
2020-03-04 05:57:20 -06:00
password := models . Password ( cmd . NewPassword )
2016-12-09 08:25:02 -06:00
if password . IsWeak ( ) {
2021-01-15 07:43:20 -06:00
return response . Error ( 400 , "New password is too short" , nil )
2015-02-19 09:09:49 -06:00
}
2022-08-04 08:05:05 -05:00
cmd . UserID = c . UserId
2022-08-02 09:58:05 -05:00
cmd . NewPassword , err = util . EncodePassword ( cmd . NewPassword , user . Salt )
2019-10-23 03:40:12 -05:00
if err != nil {
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Failed to encode password" , err )
2019-10-23 03:40:12 -05:00
}
2015-02-19 09:09:49 -06:00
2022-08-04 08:05:05 -05:00
if err := hs . userService . ChangePassword ( c . Req . Context ( ) , & cmd ) ; err != nil {
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Failed to change user password" , err )
2015-02-19 09:09:49 -06:00
}
2021-01-15 07:43:20 -06:00
return response . Success ( "User password changed" )
2015-02-19 09:09:49 -06:00
}
2015-05-19 04:47:14 -05:00
2020-11-10 16:36:35 -06:00
// redirectToChangePassword handles GET /.well-known/change-password.
func redirectToChangePassword ( c * models . ReqContext ) {
c . Redirect ( "/profile/password" , 302 )
}
2022-07-27 08:54:37 -05:00
// swagger:route PUT /user/helpflags/{flag_id} signed_in_user setHelpFlag
//
// Set user help flag.
//
// Responses:
// 200: helpFlagResponse
// 401: unauthorisedError
// 403: forbiddenError
// 500: internalServerError
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) SetHelpFlag ( c * models . ReqContext ) response . Response {
2022-01-14 10:55:57 -06:00
flag , err := strconv . ParseInt ( web . Params ( c . Req ) [ ":id" ] , 10 , 64 )
if err != nil {
return response . Error ( http . StatusBadRequest , "id is invalid" , err )
}
2016-11-09 03:41:39 -06:00
bitmask := & c . HelpFlags1
2022-08-10 04:56:48 -05:00
bitmask . AddFlag ( user . HelpFlags1 ( flag ) )
2016-11-09 03:41:39 -06:00
2020-03-04 05:57:20 -06:00
cmd := models . SetUserHelpFlagCommand {
2016-11-09 03:41:39 -06:00
UserId : c . UserId ,
HelpFlags1 : * bitmask ,
}
2022-01-26 13:24:05 -06:00
if err := hs . SQLStore . SetUserHelpFlag ( c . Req . Context ( ) , & cmd ) ; err != nil {
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Failed to update help flag" , err )
2016-11-09 03:41:39 -06:00
}
2022-04-15 07:01:58 -05:00
return response . JSON ( http . StatusOK , & util . DynMap { "message" : "Help flag set" , "helpFlags1" : cmd . HelpFlags1 } )
2016-11-09 03:41:39 -06:00
}
2022-07-27 08:54:37 -05:00
// swagger:route GET /user/helpflags/clear signed_in_user clearHelpFlags
//
// Clear user help flag.
//
// Responses:
// 200: helpFlagResponse
// 401: unauthorisedError
// 403: forbiddenError
// 500: internalServerError
2022-01-26 13:24:05 -06:00
func ( hs * HTTPServer ) ClearHelpFlags ( c * models . ReqContext ) response . Response {
2020-03-04 05:57:20 -06:00
cmd := models . SetUserHelpFlagCommand {
2016-11-09 03:41:39 -06:00
UserId : c . UserId ,
2022-08-10 04:56:48 -05:00
HelpFlags1 : user . HelpFlags1 ( 0 ) ,
2016-11-09 03:41:39 -06:00
}
2022-01-26 13:24:05 -06:00
if err := hs . SQLStore . SetUserHelpFlag ( c . Req . Context ( ) , & cmd ) ; err != nil {
2021-01-15 07:43:20 -06:00
return response . Error ( 500 , "Failed to update help flag" , err )
2016-11-09 03:41:39 -06:00
}
2022-04-15 07:01:58 -05:00
return response . JSON ( http . StatusOK , & util . DynMap { "message" : "Help flag set" , "helpFlags1" : cmd . HelpFlags1 } )
2016-11-09 03:41:39 -06:00
}
2019-07-10 04:06:51 -05:00
2022-07-27 08:54:37 -05:00
// swagger:parameters searchUsers
type SearchUsersParams struct {
// Limit the maximum number of users to return per page
// in:query
// required:false
// default:1000
Limit int64 ` json:"perpage" `
// Page index for starting fetching users
// in:query
// required:false
// default:1
Page int64 ` json:"page" `
}
// swagger:parameters searchUsersWithPaging
type SearchUsersWithPagingParams struct {
// Limit the maximum number of users to return per page
// in:query
// required:false
// default:1000
Limit int64 ` json:"perpage" `
// Page index for starting fetching users
// in:query
// required:false
// default:1
Page int64 ` json:"page" `
// Query allows return results where the query value is contained in one of the name, login or email fields. Query values with spaces need to be URL encoded e.g. query=Jane%20Doe
// in:query
// required:false
Query string ` json:"query" `
}
// swagger:parameters updateSignedInUser
type UpdateSignedInUserParams struct {
// To change the email, name, login, theme, provide another one.
// in:body
// required:true
Body models . UpdateUserCommand ` json:"body" `
}
// swagger:parameters userSetUsingOrg
type UserSetUsingOrgParams struct {
// in:path
// required:true
OrgID int64 ` json:"org_id" `
}
// swagger:parameters setHelpFlag
type SetHelpFlagParams struct {
// in:path
// required:true
FlagID string ` json:"flag_id" `
}
// swagger:parameters changeUserPassword
type ChangeUserPasswordParams struct {
// To change the email, name, login, theme, provide another one.
// in:body
// required:true
Body models . ChangeUserPasswordCommand ` json:"body" `
}
// swagger:parameters getUserByID
type GetUserByIDParams struct {
// in:path
// required:true
UserID int64 ` json:"user_id" `
}
// swagger:parameters getUserOrgList
type GetUserOrgListParams struct {
// in:path
// required:true
UserID int64 ` json:"user_id" `
}
// swagger:parameters getUserTeams
type GetUserTeamsParams struct {
// in:path
// required:true
UserID int64 ` json:"user_id" `
}
// swagger:parameters getUserByLoginOrEmail
type GetUserByLoginOrEmailParams struct {
// loginOrEmail of the user
// in:query
// required:true
LoginOrEmail string ` json:"loginOrEmail" `
}
// swagger:parameters updateUser
type UpdateUserParams struct {
// To change the email, name, login, theme, provide another one.
// in:body
// required:true
Body models . UpdateUserCommand ` json:"body" `
// in:path
// required:true
UserID int64 ` json:"user_id" `
}
// swagger:response searchUsersResponse
type SearchUsersResponse struct {
// The response message
// in: body
Body models . SearchUserQueryResult ` json:"body" `
}
// swagger:response userResponse
type UserResponse struct {
// The response message
// in: body
Body models . UserProfileDTO ` json:"body" `
}
// swagger:response getUserOrgListResponse
type GetUserOrgListResponse struct {
// The response message
// in: body
Body [ ] * models . UserOrgDTO ` json:"body" `
}
// swagger:response getSignedInUserOrgListResponse
type GetSignedInUserOrgListResponse struct {
// The response message
// in: body
Body [ ] * models . UserOrgDTO ` json:"body" `
}
// swagger:response getUserTeamsResponse
type GetUserTeamsResponse struct {
// The response message
// in: body
Body [ ] * models . TeamDTO ` json:"body" `
}
// swagger:response getSignedInUserTeamListResponse
type GetSignedInUserTeamListResponse struct {
// The response message
// in: body
Body [ ] * models . TeamDTO ` json:"body" `
}
// swagger:response helpFlagResponse
type HelpFlagResponse struct {
// The response message
// in: body
Body struct {
HelpFlags1 int64 ` json:"helpFlags1" `
Message string ` json:"message" `
} ` json:"body" `
}