org_invite.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package api
  2. import (
  3. "github.com/grafana/grafana/pkg/api/dtos"
  4. "github.com/grafana/grafana/pkg/bus"
  5. "github.com/grafana/grafana/pkg/middleware"
  6. m "github.com/grafana/grafana/pkg/models"
  7. "github.com/grafana/grafana/pkg/setting"
  8. "github.com/grafana/grafana/pkg/util"
  9. )
  10. func GetPendingOrgInvites(c *middleware.Context) Response {
  11. query := m.GetTempUsersForOrgQuery{OrgId: c.OrgId}
  12. if err := bus.Dispatch(&query); err != nil {
  13. return ApiError(500, "Failed to get invites from db", err)
  14. }
  15. return Json(200, query.Result)
  16. }
  17. func AddOrgInvite(c *middleware.Context, inviteDto dtos.AddInviteForm) Response {
  18. if !inviteDto.Role.IsValid() {
  19. return ApiError(400, "Invalid role specified", nil)
  20. }
  21. if !util.IsEmail(inviteDto.Email) {
  22. return ApiError(400, "Invalid email specified", nil)
  23. }
  24. // first try get existing user
  25. userQuery := m.GetUserByLoginQuery{LoginOrEmail: inviteDto.Email}
  26. if err := bus.Dispatch(&userQuery); err != nil {
  27. if err != m.ErrUserNotFound {
  28. return ApiError(500, "Failed to query db for existing user check", err)
  29. }
  30. } else {
  31. // user exists, add org role
  32. createOrgUserCmd := m.AddOrgUserCommand{OrgId: c.OrgId, UserId: userQuery.Result.Id, Role: inviteDto.Role}
  33. if err := bus.Dispatch(&createOrgUserCmd); err != nil {
  34. return ApiError(500, "Error while trying to create org user", err)
  35. } else {
  36. return ApiSuccess("Existing Grafana user added to org " + c.OrgName)
  37. }
  38. }
  39. cmd := m.CreateTempUserCommand{}
  40. cmd.OrgId = c.OrgId
  41. cmd.Email = inviteDto.Email
  42. cmd.Name = inviteDto.Name
  43. cmd.IsInvite = true
  44. cmd.InvitedByUserId = c.UserId
  45. cmd.Code = util.GetRandomString(30)
  46. cmd.Role = inviteDto.Role
  47. if err := bus.Dispatch(&cmd); err != nil {
  48. return ApiError(500, "Failed to save invite to database", err)
  49. }
  50. // send invite email
  51. if !inviteDto.SkipEmails {
  52. emailCmd := m.SendEmailCommand{
  53. To: []string{inviteDto.Email},
  54. Template: "new_user_invite.html",
  55. Data: map[string]interface{}{
  56. "NameOrEmail": util.StringsFallback2(cmd.Name, cmd.Email),
  57. "OrgName": c.OrgName,
  58. "Email": c.Email,
  59. "LinkUrl": setting.ToAbsUrl("signup/invited/" + cmd.Code),
  60. "InvitedBy": util.StringsFallback2(c.Name, c.Email),
  61. },
  62. }
  63. if err := bus.Dispatch(&emailCmd); err != nil {
  64. return ApiError(500, "Failed to send email invite", err)
  65. }
  66. }
  67. return ApiSuccess("ok, done!")
  68. }