org_users.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package sqlstore
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "github.com/grafana/grafana/pkg/bus"
  7. m "github.com/grafana/grafana/pkg/models"
  8. "github.com/grafana/grafana/pkg/util"
  9. )
  10. func init() {
  11. bus.AddHandler("sql", AddOrgUser)
  12. bus.AddHandler("sql", RemoveOrgUser)
  13. bus.AddHandler("sql", GetOrgUsers)
  14. bus.AddHandler("sql", UpdateOrgUser)
  15. }
  16. func AddOrgUser(cmd *m.AddOrgUserCommand) error {
  17. return inTransaction(func(sess *DBSession) error {
  18. // check if user exists
  19. if res, err := sess.Query("SELECT 1 from org_user WHERE org_id=? and user_id=?", cmd.OrgId, cmd.UserId); err != nil {
  20. return err
  21. } else if len(res) == 1 {
  22. return m.ErrOrgUserAlreadyAdded
  23. }
  24. if res, err := sess.Query("SELECT 1 from org WHERE id=?", cmd.OrgId); err != nil {
  25. return err
  26. } else if len(res) != 1 {
  27. return m.ErrOrgNotFound
  28. }
  29. entity := m.OrgUser{
  30. OrgId: cmd.OrgId,
  31. UserId: cmd.UserId,
  32. Role: cmd.Role,
  33. Created: time.Now(),
  34. Updated: time.Now(),
  35. }
  36. _, err := sess.Insert(&entity)
  37. return err
  38. })
  39. }
  40. func UpdateOrgUser(cmd *m.UpdateOrgUserCommand) error {
  41. return inTransaction(func(sess *DBSession) error {
  42. var orgUser m.OrgUser
  43. exists, err := sess.Where("org_id=? AND user_id=?", cmd.OrgId, cmd.UserId).Get(&orgUser)
  44. if err != nil {
  45. return err
  46. }
  47. if !exists {
  48. return m.ErrOrgUserNotFound
  49. }
  50. orgUser.Role = cmd.Role
  51. orgUser.Updated = time.Now()
  52. _, err = sess.Id(orgUser.Id).Update(&orgUser)
  53. if err != nil {
  54. return err
  55. }
  56. return validateOneAdminLeftInOrg(cmd.OrgId, sess)
  57. })
  58. }
  59. func GetOrgUsers(query *m.GetOrgUsersQuery) error {
  60. query.Result = make([]*m.OrgUserDTO, 0)
  61. sess := x.Table("org_user")
  62. sess.Join("INNER", "user", fmt.Sprintf("org_user.user_id=%s.id", x.Dialect().Quote("user")))
  63. whereConditions := make([]string, 0)
  64. whereParams := make([]interface{}, 0)
  65. whereConditions = append(whereConditions, "org_user.org_id = ?")
  66. whereParams = append(whereParams, query.OrgId)
  67. if query.Query != "" {
  68. queryWithWildcards := "%" + query.Query + "%"
  69. whereConditions = append(whereConditions, "(email "+dialect.LikeStr()+" ? OR name "+dialect.LikeStr()+" ? OR login "+dialect.LikeStr()+" ?)")
  70. whereParams = append(whereParams, queryWithWildcards, queryWithWildcards, queryWithWildcards)
  71. }
  72. if len(whereConditions) > 0 {
  73. sess.Where(strings.Join(whereConditions, " AND "), whereParams...)
  74. }
  75. if query.Limit > 0 {
  76. sess.Limit(query.Limit, 0)
  77. }
  78. sess.Cols("org_user.org_id", "org_user.user_id", "user.email", "user.login", "org_user.role", "user.last_seen_at")
  79. sess.Asc("user.email", "user.login")
  80. if err := sess.Find(&query.Result); err != nil {
  81. return err
  82. }
  83. for _, user := range query.Result {
  84. user.LastSeenAtAge = util.GetAgeString(user.LastSeenAt)
  85. }
  86. return nil
  87. }
  88. func RemoveOrgUser(cmd *m.RemoveOrgUserCommand) error {
  89. return inTransaction(func(sess *DBSession) error {
  90. deletes := []string{
  91. "DELETE FROM org_user WHERE org_id=? and user_id=?",
  92. "DELETE FROM dashboard_acl WHERE org_id=? and user_id = ?",
  93. "DELETE FROM team_member WHERE org_id=? and user_id = ?",
  94. }
  95. for _, sql := range deletes {
  96. _, err := sess.Exec(sql, cmd.OrgId, cmd.UserId)
  97. if err != nil {
  98. return err
  99. }
  100. }
  101. return validateOneAdminLeftInOrg(cmd.OrgId, sess)
  102. })
  103. }
  104. func validateOneAdminLeftInOrg(orgId int64, sess *DBSession) error {
  105. // validate that there is an admin user left
  106. res, err := sess.Query("SELECT 1 from org_user WHERE org_id=? and role='Admin'", orgId)
  107. if err != nil {
  108. return err
  109. }
  110. if len(res) == 0 {
  111. return m.ErrLastOrgAdmin
  112. }
  113. return err
  114. }