api_account.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package api
  2. import (
  3. "strconv"
  4. "github.com/gin-gonic/gin"
  5. )
  6. func init() {
  7. addRoutes(func(self *HttpServer) {
  8. self.addRoute("POST", "/api/account/collaborators/add", self.addCollaborator)
  9. self.addRoute("POST", "/api/account/collaborators/remove", self.removeCollaborator)
  10. self.addRoute("GET", "/api/account/", self.getAccount)
  11. self.addRoute("GET", "/api/account/others", self.getOtherAccounts)
  12. self.addRoute("POST", "/api/account/using/:id", self.setUsingAccount)
  13. })
  14. }
  15. func (self *HttpServer) getAccount(c *gin.Context, auth *authContext) {
  16. var account = auth.userAccount
  17. model := accountInfoDto{
  18. Name: account.Name,
  19. Email: account.Email,
  20. AccountName: account.AccountName,
  21. }
  22. for _, collaborator := range account.Collaborators {
  23. model.Collaborators = append(model.Collaborators, &collaboratorInfoDto{
  24. AccountId: collaborator.AccountId,
  25. Role: collaborator.Role,
  26. Email: collaborator.Email,
  27. })
  28. }
  29. c.JSON(200, model)
  30. }
  31. func (self *HttpServer) getOtherAccounts(c *gin.Context, auth *authContext) {
  32. var account = auth.userAccount
  33. otherAccounts, err := self.store.GetOtherAccountsFor(account.Id)
  34. if err != nil {
  35. c.JSON(500, gin.H{"message": err.Error()})
  36. return
  37. }
  38. var result []*otherAccountDto
  39. result = append(result, &otherAccountDto{
  40. Id: account.Id,
  41. Role: "owner",
  42. IsUsing: account.Id == account.UsingAccountId,
  43. Name: account.Email,
  44. })
  45. for _, other := range otherAccounts {
  46. result = append(result, &otherAccountDto{
  47. Id: other.Id,
  48. Role: other.Role,
  49. Name: other.Name,
  50. IsUsing: other.Id == account.UsingAccountId,
  51. })
  52. }
  53. c.JSON(200, result)
  54. }
  55. func (self *HttpServer) addCollaborator(c *gin.Context, auth *authContext) {
  56. var model addCollaboratorDto
  57. if !c.EnsureBody(&model) {
  58. c.JSON(400, gin.H{"message": "Invalid request"})
  59. return
  60. }
  61. collaborator, err := self.store.GetAccountByLogin(model.Email)
  62. if err != nil {
  63. c.JSON(404, gin.H{"message": "Collaborator not found"})
  64. return
  65. }
  66. userAccount := auth.userAccount
  67. if collaborator.Id == userAccount.Id {
  68. c.JSON(400, gin.H{"message": "Cannot add yourself as collaborator"})
  69. return
  70. }
  71. err = userAccount.AddCollaborator(collaborator)
  72. if err != nil {
  73. c.JSON(400, gin.H{"message": err.Error()})
  74. return
  75. }
  76. err = self.store.UpdateAccount(userAccount)
  77. if err != nil {
  78. c.JSON(500, gin.H{"message": err.Error()})
  79. return
  80. }
  81. c.Abort(204)
  82. }
  83. func (self *HttpServer) removeCollaborator(c *gin.Context, auth *authContext) {
  84. var model removeCollaboratorDto
  85. if !c.EnsureBody(&model) {
  86. c.JSON(400, gin.H{"message": "Invalid request"})
  87. return
  88. }
  89. account := auth.userAccount
  90. account.RemoveCollaborator(model.AccountId)
  91. err := self.store.UpdateAccount(account)
  92. if err != nil {
  93. c.JSON(500, gin.H{"message": err.Error()})
  94. return
  95. }
  96. c.Abort(204)
  97. }
  98. func (self *HttpServer) setUsingAccount(c *gin.Context, auth *authContext) {
  99. idString := c.Params.ByName("id")
  100. id, _ := strconv.Atoi(idString)
  101. account := auth.userAccount
  102. otherAccount, err := self.store.GetAccount(id)
  103. if err != nil {
  104. c.JSON(500, gin.H{"message": err.Error()})
  105. return
  106. }
  107. if otherAccount.Id != account.Id && !otherAccount.HasCollaborator(account.Id) {
  108. c.Abort(401)
  109. return
  110. }
  111. account.UsingAccountId = otherAccount.Id
  112. err = self.store.UpdateAccount(account)
  113. if err != nil {
  114. c.JSON(500, gin.H{"message": err.Error()})
  115. return
  116. }
  117. c.Abort(204)
  118. }