| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | package api | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2021-09-27 22:43:16 +08:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2020-11-19 20:34:28 +08:00
										 |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2021-12-23 01:46:33 +08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 	"net/http" | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 	"strconv" | 
					
						
							| 
									
										
										
										
											2020-11-19 20:34:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-18 14:17:35 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/api/dtos" | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/api/response" | 
					
						
							| 
									
										
										
										
											2019-08-13 02:03:48 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/models" | 
					
						
							| 
									
										
										
										
											2020-09-14 14:58:23 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/util" | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/web" | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | // POST /api/org/users
 | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | func (hs *HTTPServer) AddOrgUserToCurrentOrg(c *models.ReqContext) response.Response { | 
					
						
							|  |  |  | 	cmd := models.AddOrgUserCommand{} | 
					
						
							|  |  |  | 	if err := web.Bind(c.Req, &cmd); err != nil { | 
					
						
							|  |  |  | 		return response.Error(http.StatusBadRequest, "bad request data", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | 	cmd.OrgId = c.OrgId | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	return hs.addOrgUserHelper(c.Req.Context(), cmd) | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // POST /api/orgs/:orgId/users
 | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | func (hs *HTTPServer) AddOrgUser(c *models.ReqContext) response.Response { | 
					
						
							|  |  |  | 	cmd := models.AddOrgUserCommand{} | 
					
						
							|  |  |  | 	if err := web.Bind(c.Req, &cmd); err != nil { | 
					
						
							|  |  |  | 		return response.Error(http.StatusBadRequest, "bad request data", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	var err error | 
					
						
							|  |  |  | 	cmd.OrgId, err = strconv.ParseInt(web.Params(c.Req)[":orgId"], 10, 64) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return response.Error(http.StatusBadRequest, "orgId is invalid", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	return hs.addOrgUserHelper(c.Req.Context(), cmd) | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | func (hs *HTTPServer) addOrgUserHelper(ctx context.Context, cmd models.AddOrgUserCommand) response.Response { | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | 	if !cmd.Role.IsValid() { | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 		return response.Error(400, "Invalid role specified", nil) | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-13 02:03:48 +08:00
										 |  |  | 	userQuery := models.GetUserByLoginQuery{LoginOrEmail: cmd.LoginOrEmail} | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	err := hs.SQLStore.GetUserByLogin(ctx, &userQuery) | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 		return response.Error(404, "User not found", nil) | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	userToAdd := userQuery.Result | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cmd.UserId = userToAdd.Id | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	if err := hs.SQLStore.AddOrgUser(ctx, &cmd); err != nil { | 
					
						
							| 
									
										
										
										
											2020-11-19 20:34:28 +08:00
										 |  |  | 		if errors.Is(err, models.ErrOrgUserAlreadyAdded) { | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 			return response.JSON(409, util.DynMap{ | 
					
						
							| 
									
										
										
										
											2020-09-14 14:58:23 +08:00
										 |  |  | 				"message": "User is already member of this organization", | 
					
						
							|  |  |  | 				"userId":  cmd.UserId, | 
					
						
							|  |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2016-11-23 21:38:44 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 		return response.Error(500, "Could not add user to organization", err) | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-15 20:01:58 +08:00
										 |  |  | 	return response.JSON(http.StatusOK, util.DynMap{ | 
					
						
							| 
									
										
										
										
											2020-09-14 14:58:23 +08:00
										 |  |  | 		"message": "User added to organization", | 
					
						
							|  |  |  | 		"userId":  cmd.UserId, | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // GET /api/org/users
 | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | func (hs *HTTPServer) GetOrgUsersForCurrentOrg(c *models.ReqContext) response.Response { | 
					
						
							| 
									
										
										
										
											2021-12-23 01:46:33 +08:00
										 |  |  | 	result, err := hs.getOrgUsersHelper(c, &models.GetOrgUsersQuery{ | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 		OrgId: c.OrgId, | 
					
						
							|  |  |  | 		Query: c.Query("query"), | 
					
						
							|  |  |  | 		Limit: c.QueryInt("limit"), | 
					
						
							| 
									
										
										
										
											2022-01-13 21:40:32 +08:00
										 |  |  | 		User:  c.SignedInUser, | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 	}, c.SignedInUser) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-13 02:03:48 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 		return response.Error(500, "Failed to get users for current organization", err) | 
					
						
							| 
									
										
										
										
											2019-08-13 02:03:48 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-15 20:01:58 +08:00
										 |  |  | 	return response.JSON(http.StatusOK, result) | 
					
						
							| 
									
										
										
										
											2019-08-13 02:03:48 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // GET /api/org/users/lookup
 | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | func (hs *HTTPServer) GetOrgUsersForCurrentOrgLookup(c *models.ReqContext) response.Response { | 
					
						
							| 
									
										
										
										
											2021-12-23 01:46:33 +08:00
										 |  |  | 	orgUsers, err := hs.getOrgUsersHelper(c, &models.GetOrgUsersQuery{ | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 		OrgId: c.OrgId, | 
					
						
							|  |  |  | 		Query: c.Query("query"), | 
					
						
							|  |  |  | 		Limit: c.QueryInt("limit"), | 
					
						
							| 
									
										
										
										
											2022-01-13 21:40:32 +08:00
										 |  |  | 		User:  c.SignedInUser, | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 	}, c.SignedInUser) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-13 02:03:48 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 		return response.Error(500, "Failed to get users for current organization", err) | 
					
						
							| 
									
										
										
										
											2019-08-13 02:03:48 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	result := make([]*dtos.UserLookupDTO, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, u := range orgUsers { | 
					
						
							|  |  |  | 		result = append(result, &dtos.UserLookupDTO{ | 
					
						
							|  |  |  | 			UserID:    u.UserId, | 
					
						
							|  |  |  | 			Login:     u.Login, | 
					
						
							|  |  |  | 			AvatarURL: u.AvatarUrl, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-15 20:01:58 +08:00
										 |  |  | 	return response.JSON(http.StatusOK, result) | 
					
						
							| 
									
										
										
										
											2019-08-13 02:03:48 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | // GET /api/orgs/:orgId/users
 | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | func (hs *HTTPServer) GetOrgUsers(c *models.ReqContext) response.Response { | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 	orgId, err := strconv.ParseInt(web.Params(c.Req)[":orgId"], 10, 64) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return response.Error(http.StatusBadRequest, "orgId is invalid", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-23 01:46:33 +08:00
										 |  |  | 	result, err := hs.getOrgUsersHelper(c, &models.GetOrgUsersQuery{ | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 		OrgId: orgId, | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 		Query: "", | 
					
						
							|  |  |  | 		Limit: 0, | 
					
						
							| 
									
										
										
										
											2022-01-13 21:40:32 +08:00
										 |  |  | 		User:  c.SignedInUser, | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 	}, c.SignedInUser) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-13 02:03:48 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 		return response.Error(500, "Failed to get users for organization", err) | 
					
						
							| 
									
										
										
										
											2019-08-13 02:03:48 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-15 20:01:58 +08:00
										 |  |  | 	return response.JSON(http.StatusOK, result) | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-23 01:46:33 +08:00
										 |  |  | func (hs *HTTPServer) getOrgUsersHelper(c *models.ReqContext, query *models.GetOrgUsersQuery, signedInUser *models.SignedInUser) ([]*models.OrgUserDTO, error) { | 
					
						
							|  |  |  | 	if err := hs.SQLStore.GetOrgUsers(c.Req.Context(), query); err != nil { | 
					
						
							| 
									
										
										
										
											2019-08-13 02:03:48 +08:00
										 |  |  | 		return nil, err | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 	filteredUsers := make([]*models.OrgUserDTO, 0, len(query.Result)) | 
					
						
							| 
									
										
										
										
											2022-01-05 16:59:17 +08:00
										 |  |  | 	userIDs := map[string]bool{} | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 	for _, user := range query.Result { | 
					
						
							|  |  |  | 		if dtos.IsHiddenUser(user.Login, signedInUser, hs.Cfg) { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-08-18 14:17:35 +08:00
										 |  |  | 		user.AvatarUrl = dtos.GetGravatarUrl(user.Email) | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-05 16:59:17 +08:00
										 |  |  | 		userIDs[fmt.Sprint(user.UserId)] = true | 
					
						
							|  |  |  | 		filteredUsers = append(filteredUsers, user) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-12-23 01:46:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-24 15:58:10 +08:00
										 |  |  | 	// Get accesscontrol metadata for users in the target org
 | 
					
						
							|  |  |  | 	accessControlMetadata := hs.getMultiAccessControlMetadata(c, query.OrgId, "users:id:", userIDs) | 
					
						
							| 
									
										
										
										
											2022-02-18 18:27:00 +08:00
										 |  |  | 	if len(accessControlMetadata) > 0 { | 
					
						
							|  |  |  | 		for i := range filteredUsers { | 
					
						
							|  |  |  | 			filteredUsers[i].AccessControl = accessControlMetadata[fmt.Sprint(filteredUsers[i].UserId)] | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-08-18 14:17:35 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 	return filteredUsers, nil | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-12 20:10:35 +08:00
										 |  |  | // SearchOrgUsersWithPaging is an HTTP handler to search for org users with paging.
 | 
					
						
							|  |  |  | // GET /api/org/users/search
 | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | func (hs *HTTPServer) SearchOrgUsersWithPaging(c *models.ReqContext) response.Response { | 
					
						
							|  |  |  | 	ctx := c.Req.Context() | 
					
						
							| 
									
										
										
										
											2021-05-12 20:10:35 +08:00
										 |  |  | 	perPage := c.QueryInt("perpage") | 
					
						
							|  |  |  | 	if perPage <= 0 { | 
					
						
							|  |  |  | 		perPage = 1000 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	page := c.QueryInt("page") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if page < 1 { | 
					
						
							|  |  |  | 		page = 1 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	query := &models.SearchOrgUsersQuery{ | 
					
						
							|  |  |  | 		OrgID: c.OrgId, | 
					
						
							|  |  |  | 		Query: c.Query("query"), | 
					
						
							|  |  |  | 		Page:  page, | 
					
						
							| 
									
										
										
										
											2022-01-13 21:40:32 +08:00
										 |  |  | 		Limit: perPage, | 
					
						
							|  |  |  | 		User:  c.SignedInUser, | 
					
						
							| 
									
										
										
										
											2021-05-12 20:10:35 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-27 22:43:16 +08:00
										 |  |  | 	if err := hs.SQLStore.SearchOrgUsers(ctx, query); err != nil { | 
					
						
							| 
									
										
										
										
											2021-05-12 20:10:35 +08:00
										 |  |  | 		return response.Error(500, "Failed to get users for current organization", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	filteredUsers := make([]*models.OrgUserDTO, 0, len(query.Result.OrgUsers)) | 
					
						
							|  |  |  | 	for _, user := range query.Result.OrgUsers { | 
					
						
							|  |  |  | 		if dtos.IsHiddenUser(user.Login, c.SignedInUser, hs.Cfg) { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		user.AvatarUrl = dtos.GetGravatarUrl(user.Email) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		filteredUsers = append(filteredUsers, user) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	query.Result.OrgUsers = filteredUsers | 
					
						
							|  |  |  | 	query.Result.Page = page | 
					
						
							|  |  |  | 	query.Result.PerPage = perPage | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-15 20:01:58 +08:00
										 |  |  | 	return response.JSON(http.StatusOK, query.Result) | 
					
						
							| 
									
										
										
										
											2021-05-12 20:10:35 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | // PATCH /api/org/users/:userId
 | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | func (hs *HTTPServer) UpdateOrgUserForCurrentOrg(c *models.ReqContext) response.Response { | 
					
						
							|  |  |  | 	cmd := models.UpdateOrgUserCommand{} | 
					
						
							|  |  |  | 	if err := web.Bind(c.Req, &cmd); err != nil { | 
					
						
							|  |  |  | 		return response.Error(http.StatusBadRequest, "bad request data", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | 	cmd.OrgId = c.OrgId | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 	var err error | 
					
						
							|  |  |  | 	cmd.UserId, err = strconv.ParseInt(web.Params(c.Req)[":userId"], 10, 64) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return response.Error(http.StatusBadRequest, "userId is invalid", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	return hs.updateOrgUserHelper(c.Req.Context(), cmd) | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // PATCH /api/orgs/:orgId/users/:userId
 | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | func (hs *HTTPServer) UpdateOrgUser(c *models.ReqContext) response.Response { | 
					
						
							|  |  |  | 	cmd := models.UpdateOrgUserCommand{} | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 	var err error | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 	if err := web.Bind(c.Req, &cmd); err != nil { | 
					
						
							|  |  |  | 		return response.Error(http.StatusBadRequest, "bad request data", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 	cmd.OrgId, err = strconv.ParseInt(web.Params(c.Req)[":orgId"], 10, 64) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return response.Error(http.StatusBadRequest, "orgId is invalid", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	cmd.UserId, err = strconv.ParseInt(web.Params(c.Req)[":userId"], 10, 64) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return response.Error(http.StatusBadRequest, "userId is invalid", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	return hs.updateOrgUserHelper(c.Req.Context(), cmd) | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | func (hs *HTTPServer) updateOrgUserHelper(ctx context.Context, cmd models.UpdateOrgUserCommand) response.Response { | 
					
						
							| 
									
										
										
										
											2015-05-01 15:48:07 +08:00
										 |  |  | 	if !cmd.Role.IsValid() { | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 		return response.Error(400, "Invalid role specified", nil) | 
					
						
							| 
									
										
										
										
											2015-05-01 15:48:07 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	if err := hs.SQLStore.UpdateOrgUser(ctx, &cmd); err != nil { | 
					
						
							| 
									
										
										
										
											2020-11-19 20:34:28 +08:00
										 |  |  | 		if errors.Is(err, models.ErrLastOrgAdmin) { | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 			return response.Error(400, "Cannot change role so that there is no organization admin left", nil) | 
					
						
							| 
									
										
										
										
											2015-05-19 17:47:14 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 		return response.Error(500, "Failed update org user", err) | 
					
						
							| 
									
										
										
										
											2015-05-01 15:48:07 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 	return response.Success("Organization user updated") | 
					
						
							| 
									
										
										
										
											2015-05-01 15:48:07 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | // DELETE /api/org/users/:userId
 | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | func (hs *HTTPServer) RemoveOrgUserForCurrentOrg(c *models.ReqContext) response.Response { | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 	userId, err := strconv.ParseInt(web.Params(c.Req)[":userId"], 10, 64) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return response.Error(http.StatusBadRequest, "userId is invalid", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	return hs.removeOrgUserHelper(c.Req.Context(), &models.RemoveOrgUserCommand{ | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 		UserId:                   userId, | 
					
						
							| 
									
										
										
										
											2018-10-12 03:26:06 +08:00
										 |  |  | 		OrgId:                    c.OrgId, | 
					
						
							| 
									
										
										
										
											2018-10-11 13:48:35 +08:00
										 |  |  | 		ShouldDeleteOrphanedUser: true, | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // DELETE /api/orgs/:orgId/users/:userId
 | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | func (hs *HTTPServer) RemoveOrgUser(c *models.ReqContext) response.Response { | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 	userId, err := strconv.ParseInt(web.Params(c.Req)[":userId"], 10, 64) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return response.Error(http.StatusBadRequest, "userId 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) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	return hs.removeOrgUserHelper(c.Req.Context(), &models.RemoveOrgUserCommand{ | 
					
						
							| 
									
										
										
										
											2022-01-15 00:55:57 +08:00
										 |  |  | 		UserId: userId, | 
					
						
							|  |  |  | 		OrgId:  orgId, | 
					
						
							| 
									
										
										
										
											2018-10-11 13:48:35 +08:00
										 |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2015-05-19 16:16:32 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | func (hs *HTTPServer) removeOrgUserHelper(ctx context.Context, cmd *models.RemoveOrgUserCommand) response.Response { | 
					
						
							|  |  |  | 	if err := hs.SQLStore.RemoveOrgUser(ctx, cmd); err != nil { | 
					
						
							| 
									
										
										
										
											2020-11-19 20:34:28 +08:00
										 |  |  | 		if errors.Is(err, models.ErrLastOrgAdmin) { | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 			return response.Error(400, "Cannot remove last organization admin", nil) | 
					
						
							| 
									
										
										
										
											2015-01-20 22:48:19 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 		return response.Error(500, "Failed to remove user from organization", err) | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 03:20:53 +08:00
										 |  |  | 	if cmd.UserWasDeleted { | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 		return response.Success("User deleted") | 
					
						
							| 
									
										
										
										
											2018-10-11 13:58:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 	return response.Success("User removed from organization") | 
					
						
							| 
									
										
										
										
											2015-01-20 01:01:04 +08:00
										 |  |  | } |