rethinkdb_accounts.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package stores
  2. import (
  3. "errors"
  4. r "github.com/dancannon/gorethink"
  5. "github.com/torkelo/grafana-pro/pkg/models"
  6. )
  7. func (self *rethinkStore) getNextAccountId() (int, error) {
  8. resp, err := r.Table("master").Get("ids").Update(map[string]interface{}{
  9. "NextAccountId": r.Row.Field("NextAccountId").Add(1),
  10. }, r.UpdateOpts{ReturnChanges: true}).RunWrite(self.session)
  11. if err != nil {
  12. return 0, err
  13. }
  14. change := resp.Changes[0]
  15. if change.NewValue == nil {
  16. return 0, errors.New("Failed to get new value after incrementing account id")
  17. }
  18. return int(change.NewValue.(map[string]interface{})["NextAccountId"].(float64)), nil
  19. }
  20. func (self *rethinkStore) CreateAccount(account *models.Account) error {
  21. accountId, err := self.getNextAccountId()
  22. if err != nil {
  23. return err
  24. }
  25. account.Id = accountId
  26. account.UsingAccountId = accountId
  27. resp, err := r.Table("accounts").Insert(account).RunWrite(self.session)
  28. if err != nil {
  29. return err
  30. }
  31. if resp.Inserted == 0 {
  32. return errors.New("Failed to insert acccount")
  33. }
  34. return nil
  35. }
  36. func (self *rethinkStore) GetAccountByLogin(emailOrName string) (*models.Account, error) {
  37. resp, err := r.Table("accounts").GetAllByIndex("Login", emailOrName).Run(self.session)
  38. if err != nil {
  39. return nil, err
  40. }
  41. var account models.Account
  42. err = resp.One(&account)
  43. if err != nil {
  44. return nil, errors.New("Not found")
  45. }
  46. return &account, nil
  47. }
  48. func (self *rethinkStore) GetAccount(id int) (*models.Account, error) {
  49. resp, err := r.Table("accounts").Get(id).Run(self.session)
  50. if err != nil {
  51. return nil, err
  52. }
  53. var account models.Account
  54. err = resp.One(&account)
  55. if err != nil {
  56. return nil, errors.New("Not found")
  57. }
  58. return &account, nil
  59. }
  60. func (self *rethinkStore) UpdateAccount(account *models.Account) error {
  61. resp, err := r.Table("accounts").Update(account).RunWrite(self.session)
  62. if err != nil {
  63. return err
  64. }
  65. if resp.Replaced == 0 && resp.Unchanged == 0 {
  66. return errors.New("Could not find account to update")
  67. }
  68. return nil
  69. }
  70. func (self *rethinkStore) getNextDashboardNumber(accountId int) (int, error) {
  71. resp, err := r.Table("accounts").Get(accountId).Update(map[string]interface{}{
  72. "NextDashboardId": r.Row.Field("NextDashboardId").Add(1),
  73. }, r.UpdateOpts{ReturnChanges: true}).RunWrite(self.session)
  74. if err != nil {
  75. return 0, err
  76. }
  77. change := resp.Changes[0]
  78. if change.NewValue == nil {
  79. return 0, errors.New("Failed to get next dashboard id, no new value after update")
  80. }
  81. return int(change.NewValue.(map[string]interface{})["NextDashboardId"].(float64)), nil
  82. }
  83. func (self *rethinkStore) GetOtherAccountsFor(accountId int) ([]*models.OtherAccount, error) {
  84. resp, err := r.Table("accounts").
  85. GetAllByIndex("CollaboratorAccountId", accountId).
  86. Map(func(row r.Term) interface{} {
  87. return map[string]interface{}{
  88. "id": row.Field("id"),
  89. "Name": row.Field("Email"),
  90. "Role": row.Field("Collaborators").Filter(map[string]interface{}{
  91. "AccountId": accountId,
  92. }).Nth(0).Field("Role"),
  93. }
  94. }).Run(self.session)
  95. if err != nil {
  96. return nil, err
  97. }
  98. var list []*models.OtherAccount
  99. err = resp.All(&list)
  100. if err != nil {
  101. return nil, errors.New("Failed to read available accounts")
  102. }
  103. return list, nil
  104. }