team.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package api
  2. import (
  3. "github.com/grafana/grafana/pkg/api/dtos"
  4. "github.com/grafana/grafana/pkg/bus"
  5. m "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/services/teamguardian"
  7. "github.com/grafana/grafana/pkg/util"
  8. )
  9. // POST /api/teams
  10. func (hs *HTTPServer) CreateTeam(c *m.ReqContext, cmd m.CreateTeamCommand) Response {
  11. cmd.OrgId = c.OrgId
  12. if c.OrgRole == m.ROLE_VIEWER {
  13. return Error(403, "Not allowed to create team.", nil)
  14. }
  15. if err := hs.Bus.Dispatch(&cmd); err != nil {
  16. if err == m.ErrTeamNameTaken {
  17. return Error(409, "Team name taken", err)
  18. }
  19. return Error(500, "Failed to create Team", err)
  20. }
  21. if c.OrgRole == m.ROLE_EDITOR && hs.Cfg.EditorsCanAdmin {
  22. // if the request is authenticated using API tokens
  23. // the SignedInUser is an empty struct therefore
  24. // an additional check whether it is an actual user is required
  25. if c.SignedInUser.IsRealUser() {
  26. addMemberCmd := m.AddTeamMemberCommand{
  27. UserId: c.SignedInUser.UserId,
  28. OrgId: cmd.OrgId,
  29. TeamId: cmd.Result.Id,
  30. Permission: m.PERMISSION_ADMIN,
  31. }
  32. if err := hs.Bus.Dispatch(&addMemberCmd); err != nil {
  33. c.Logger.Error("Could not add creator to team.", "error", err)
  34. }
  35. } else {
  36. c.Logger.Warn("Could not add creator to team because is not a real user.")
  37. }
  38. }
  39. return JSON(200, &util.DynMap{
  40. "teamId": cmd.Result.Id,
  41. "message": "Team created",
  42. })
  43. }
  44. // PUT /api/teams/:teamId
  45. func (hs *HTTPServer) UpdateTeam(c *m.ReqContext, cmd m.UpdateTeamCommand) Response {
  46. cmd.OrgId = c.OrgId
  47. cmd.Id = c.ParamsInt64(":teamId")
  48. if err := teamguardian.CanAdmin(hs.Bus, cmd.OrgId, cmd.Id, c.SignedInUser); err != nil {
  49. return Error(403, "Not allowed to update team", err)
  50. }
  51. if err := hs.Bus.Dispatch(&cmd); err != nil {
  52. if err == m.ErrTeamNameTaken {
  53. return Error(400, "Team name taken", err)
  54. }
  55. return Error(500, "Failed to update Team", err)
  56. }
  57. return Success("Team updated")
  58. }
  59. // DELETE /api/teams/:teamId
  60. func (hs *HTTPServer) DeleteTeamByID(c *m.ReqContext) Response {
  61. orgId := c.OrgId
  62. teamId := c.ParamsInt64(":teamId")
  63. user := c.SignedInUser
  64. if err := teamguardian.CanAdmin(hs.Bus, orgId, teamId, user); err != nil {
  65. return Error(403, "Not allowed to delete team", err)
  66. }
  67. if err := hs.Bus.Dispatch(&m.DeleteTeamCommand{OrgId: orgId, Id: teamId}); err != nil {
  68. if err == m.ErrTeamNotFound {
  69. return Error(404, "Failed to delete Team. ID not found", nil)
  70. }
  71. return Error(500, "Failed to delete Team", err)
  72. }
  73. return Success("Team deleted")
  74. }
  75. // GET /api/teams/search
  76. func (hs *HTTPServer) SearchTeams(c *m.ReqContext) Response {
  77. perPage := c.QueryInt("perpage")
  78. if perPage <= 0 {
  79. perPage = 1000
  80. }
  81. page := c.QueryInt("page")
  82. if page < 1 {
  83. page = 1
  84. }
  85. var userIdFilter int64
  86. if hs.Cfg.EditorsCanAdmin && c.OrgRole != m.ROLE_ADMIN {
  87. userIdFilter = c.SignedInUser.UserId
  88. }
  89. query := m.SearchTeamsQuery{
  90. OrgId: c.OrgId,
  91. Query: c.Query("query"),
  92. Name: c.Query("name"),
  93. UserIdFilter: userIdFilter,
  94. Page: page,
  95. Limit: perPage,
  96. }
  97. if err := bus.Dispatch(&query); err != nil {
  98. return Error(500, "Failed to search Teams", err)
  99. }
  100. for _, team := range query.Result.Teams {
  101. team.AvatarUrl = dtos.GetGravatarUrlWithDefault(team.Email, team.Name)
  102. }
  103. query.Result.Page = page
  104. query.Result.PerPage = perPage
  105. return JSON(200, query.Result)
  106. }
  107. // GET /api/teams/:teamId
  108. func GetTeamByID(c *m.ReqContext) Response {
  109. query := m.GetTeamByIdQuery{OrgId: c.OrgId, Id: c.ParamsInt64(":teamId")}
  110. if err := bus.Dispatch(&query); err != nil {
  111. if err == m.ErrTeamNotFound {
  112. return Error(404, "Team not found", err)
  113. }
  114. return Error(500, "Failed to get Team", err)
  115. }
  116. query.Result.AvatarUrl = dtos.GetGravatarUrlWithDefault(query.Result.Email, query.Result.Name)
  117. return JSON(200, &query.Result)
  118. }
  119. // GET /api/teams/:teamId/preferences
  120. func (hs *HTTPServer) GetTeamPreferences(c *m.ReqContext) Response {
  121. teamId := c.ParamsInt64(":teamId")
  122. orgId := c.OrgId
  123. if err := teamguardian.CanAdmin(hs.Bus, orgId, teamId, c.SignedInUser); err != nil {
  124. return Error(403, "Not allowed to view team preferences.", err)
  125. }
  126. return getPreferencesFor(orgId, 0, teamId)
  127. }
  128. // PUT /api/teams/:teamId/preferences
  129. func (hs *HTTPServer) UpdateTeamPreferences(c *m.ReqContext, dtoCmd dtos.UpdatePrefsCmd) Response {
  130. teamId := c.ParamsInt64(":teamId")
  131. orgId := c.OrgId
  132. if err := teamguardian.CanAdmin(hs.Bus, orgId, teamId, c.SignedInUser); err != nil {
  133. return Error(403, "Not allowed to update team preferences.", err)
  134. }
  135. return updatePreferencesFor(orgId, 0, teamId, &dtoCmd)
  136. }