org_users.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. var user m.User
  20. if exists, err := sess.Id(cmd.UserId).Get(&user); err != nil {
  21. return err
  22. } else if !exists {
  23. return m.ErrUserNotFound
  24. }
  25. if res, err := sess.Query("SELECT 1 from org_user WHERE org_id=? and user_id=?", cmd.OrgId, user.Id); err != nil {
  26. return err
  27. } else if len(res) == 1 {
  28. return m.ErrOrgUserAlreadyAdded
  29. }
  30. if res, err := sess.Query("SELECT 1 from org WHERE id=?", cmd.OrgId); err != nil {
  31. return err
  32. } else if len(res) != 1 {
  33. return m.ErrOrgNotFound
  34. }
  35. entity := m.OrgUser{
  36. OrgId: cmd.OrgId,
  37. UserId: cmd.UserId,
  38. Role: cmd.Role,
  39. Created: time.Now(),
  40. Updated: time.Now(),
  41. }
  42. _, err := sess.Insert(&entity)
  43. if err != nil {
  44. return err
  45. }
  46. var userOrgs []*m.UserOrgDTO
  47. sess.Table("org_user")
  48. sess.Join("INNER", "org", "org_user.org_id=org.id")
  49. sess.Where("org_user.user_id=? AND org_user.org_id=?", user.Id, user.OrgId)
  50. sess.Cols("org.name", "org_user.role", "org_user.org_id")
  51. err = sess.Find(&userOrgs)
  52. if err != nil {
  53. return err
  54. }
  55. if len(userOrgs) == 0 {
  56. return setUsingOrgInTransaction(sess, user.Id, cmd.OrgId)
  57. }
  58. return nil
  59. })
  60. }
  61. func UpdateOrgUser(cmd *m.UpdateOrgUserCommand) error {
  62. return inTransaction(func(sess *DBSession) error {
  63. var orgUser m.OrgUser
  64. exists, err := sess.Where("org_id=? AND user_id=?", cmd.OrgId, cmd.UserId).Get(&orgUser)
  65. if err != nil {
  66. return err
  67. }
  68. if !exists {
  69. return m.ErrOrgUserNotFound
  70. }
  71. orgUser.Role = cmd.Role
  72. orgUser.Updated = time.Now()
  73. _, err = sess.Id(orgUser.Id).Update(&orgUser)
  74. if err != nil {
  75. return err
  76. }
  77. return validateOneAdminLeftInOrg(cmd.OrgId, sess)
  78. })
  79. }
  80. func GetOrgUsers(query *m.GetOrgUsersQuery) error {
  81. query.Result = make([]*m.OrgUserDTO, 0)
  82. sess := x.Table("org_user")
  83. sess.Join("INNER", "user", fmt.Sprintf("org_user.user_id=%s.id", x.Dialect().Quote("user")))
  84. whereConditions := make([]string, 0)
  85. whereParams := make([]interface{}, 0)
  86. whereConditions = append(whereConditions, "org_user.org_id = ?")
  87. whereParams = append(whereParams, query.OrgId)
  88. if query.Query != "" {
  89. queryWithWildcards := "%" + query.Query + "%"
  90. whereConditions = append(whereConditions, "(email "+dialect.LikeStr()+" ? OR name "+dialect.LikeStr()+" ? OR login "+dialect.LikeStr()+" ?)")
  91. whereParams = append(whereParams, queryWithWildcards, queryWithWildcards, queryWithWildcards)
  92. }
  93. if len(whereConditions) > 0 {
  94. sess.Where(strings.Join(whereConditions, " AND "), whereParams...)
  95. }
  96. if query.Limit > 0 {
  97. sess.Limit(query.Limit, 0)
  98. }
  99. sess.Cols("org_user.org_id", "org_user.user_id", "user.email", "user.login", "org_user.role", "user.last_seen_at")
  100. sess.Asc("user.email", "user.login")
  101. if err := sess.Find(&query.Result); err != nil {
  102. return err
  103. }
  104. for _, user := range query.Result {
  105. user.LastSeenAtAge = util.GetAgeString(user.LastSeenAt)
  106. }
  107. return nil
  108. }
  109. func RemoveOrgUser(cmd *m.RemoveOrgUserCommand) error {
  110. return inTransaction(func(sess *DBSession) error {
  111. // check if user exists
  112. var user m.User
  113. if exists, err := sess.Id(cmd.UserId).Get(&user); err != nil {
  114. return err
  115. } else if !exists {
  116. return m.ErrUserNotFound
  117. }
  118. deletes := []string{
  119. "DELETE FROM org_user WHERE org_id=? and user_id=?",
  120. "DELETE FROM dashboard_acl WHERE org_id=? and user_id = ?",
  121. "DELETE FROM team_member WHERE org_id=? and user_id = ?",
  122. }
  123. for _, sql := range deletes {
  124. _, err := sess.Exec(sql, cmd.OrgId, cmd.UserId)
  125. if err != nil {
  126. return err
  127. }
  128. }
  129. var userOrgs []*m.UserOrgDTO
  130. sess.Table("org_user")
  131. sess.Join("INNER", "org", "org_user.org_id=org.id")
  132. sess.Where("org_user.user_id=?", user.Id)
  133. sess.Cols("org.name", "org_user.role", "org_user.org_id")
  134. err := sess.Find(&userOrgs)
  135. if err != nil {
  136. return err
  137. }
  138. hasCurrentOrgSet := false
  139. for _, userOrg := range userOrgs {
  140. if user.OrgId == userOrg.OrgId {
  141. hasCurrentOrgSet = true
  142. break
  143. }
  144. }
  145. if !hasCurrentOrgSet && len(userOrgs) > 0 {
  146. err = setUsingOrgInTransaction(sess, user.Id, userOrgs[0].OrgId)
  147. if err != nil {
  148. return err
  149. }
  150. }
  151. return validateOneAdminLeftInOrg(cmd.OrgId, sess)
  152. })
  153. }
  154. func validateOneAdminLeftInOrg(orgId int64, sess *DBSession) error {
  155. // validate that there is an admin user left
  156. res, err := sess.Query("SELECT 1 from org_user WHERE org_id=? and role='Admin'", orgId)
  157. if err != nil {
  158. return err
  159. }
  160. if len(res) == 0 {
  161. return m.ErrLastOrgAdmin
  162. }
  163. return err
  164. }