user.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "github.com/Jinnrry/pmail/config"
  5. "github.com/Jinnrry/pmail/db"
  6. "github.com/Jinnrry/pmail/dto/response"
  7. "github.com/Jinnrry/pmail/models"
  8. "github.com/Jinnrry/pmail/utils/array"
  9. "github.com/Jinnrry/pmail/utils/context"
  10. "github.com/Jinnrry/pmail/utils/password"
  11. log "github.com/sirupsen/logrus"
  12. "github.com/spf13/cast"
  13. "io"
  14. "math"
  15. "net/http"
  16. )
  17. type userCreateRequest struct {
  18. Id int `json:"id"`
  19. Account string `json:"account"`
  20. Username string `json:"username"`
  21. Password string `json:"password"`
  22. Disabled int `json:"disabled"`
  23. }
  24. func CreateUser(ctx *context.Context, w http.ResponseWriter, req *http.Request) {
  25. if !ctx.IsAdmin {
  26. response.NewErrorResponse(response.NoAccessPrivileges, "No Access Privileges", "").FPrint(w)
  27. return
  28. }
  29. reqBytes, err := io.ReadAll(req.Body)
  30. if err != nil {
  31. log.Errorf("%+v", err)
  32. }
  33. var reqData userCreateRequest
  34. err = json.Unmarshal(reqBytes, &reqData)
  35. if err != nil {
  36. log.Errorf("%+v", err)
  37. }
  38. if reqData.Username == "" || reqData.Password == "" || reqData.Account == "" {
  39. response.NewErrorResponse(response.ParamsError, "Params Error", "").FPrint(w)
  40. return
  41. }
  42. var user models.User
  43. user.Name = reqData.Username
  44. user.Password = password.Encode(reqData.Password)
  45. user.Account = reqData.Account
  46. _, err = db.Instance.Insert(&user)
  47. if err != nil {
  48. response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
  49. return
  50. }
  51. response.NewSuccessResponse(user).FPrint(w)
  52. }
  53. type userListRequest struct {
  54. CurrentPage int `json:"current_page"`
  55. PageSize int `json:"page_size"`
  56. }
  57. func UserList(ctx *context.Context, w http.ResponseWriter, req *http.Request) {
  58. if !ctx.IsAdmin {
  59. response.NewErrorResponse(response.NoAccessPrivileges, "No Access Privileges", "").FPrint(w)
  60. return
  61. }
  62. reqBytes, err := io.ReadAll(req.Body)
  63. if err != nil {
  64. log.Errorf("%+v", err)
  65. }
  66. var reqData userListRequest
  67. err = json.Unmarshal(reqBytes, &reqData)
  68. if err != nil {
  69. log.Errorf("%+v", err)
  70. }
  71. offset := 0
  72. if reqData.CurrentPage >= 1 {
  73. offset = (reqData.CurrentPage - 1) * reqData.PageSize
  74. }
  75. if reqData.PageSize == 0 {
  76. reqData.PageSize = 15
  77. }
  78. var users []models.User
  79. totalNum, err := db.Instance.Table(&models.User{}).Limit(reqData.PageSize, offset).FindAndCount(&users)
  80. if err != nil {
  81. log.Errorf("%+v", err)
  82. }
  83. response.NewSuccessResponse(map[string]any{
  84. "current_page": reqData.CurrentPage,
  85. "total_page": cast.ToInt(math.Ceil(cast.ToFloat64(totalNum) / cast.ToFloat64(reqData.PageSize))),
  86. "list": users,
  87. }).FPrint(w)
  88. }
  89. func Info(ctx *context.Context, w http.ResponseWriter, req *http.Request) {
  90. domains := config.Instance.Domains
  91. domains = array.Difference(domains, []string{config.Instance.Domain})
  92. domains = append([]string{config.Instance.Domain}, domains...)
  93. response.NewSuccessResponse(map[string]any{
  94. "account": ctx.UserAccount,
  95. "name": ctx.UserName,
  96. "is_admin": ctx.IsAdmin,
  97. "domains": domains,
  98. }).FPrint(w)
  99. }
  100. func EditUser(ctx *context.Context, w http.ResponseWriter, req *http.Request) {
  101. if !ctx.IsAdmin {
  102. response.NewErrorResponse(response.NoAccessPrivileges, "No Access Privileges", "").FPrint(w)
  103. return
  104. }
  105. reqBytes, err := io.ReadAll(req.Body)
  106. if err != nil {
  107. log.Errorf("%+v", err)
  108. }
  109. var reqData userCreateRequest
  110. err = json.Unmarshal(reqBytes, &reqData)
  111. if err != nil {
  112. log.Errorf("%+v", err)
  113. }
  114. if reqData.Id == 0 && reqData.Account == "" {
  115. response.NewErrorResponse(response.ParamsError, "Params Error", "").FPrint(w)
  116. return
  117. }
  118. var user models.User
  119. if reqData.Id != 0 {
  120. _, err = db.Instance.Where("id=?", reqData.Id).Get(&user)
  121. if err != nil {
  122. log.Errorf("SQL Error: %+v", err)
  123. }
  124. } else {
  125. _, err = db.Instance.Where("account=?", reqData.Account).Get(&user)
  126. if err != nil {
  127. log.Errorf("SQL Error: %+v", err)
  128. }
  129. }
  130. if user.ID == 0 {
  131. response.NewErrorResponse(response.ParamsError, "User not found", "").FPrint(w)
  132. return
  133. }
  134. if reqData.Username != "" && reqData.Username != user.Name {
  135. user.Name = reqData.Username
  136. }
  137. if reqData.Disabled != user.Disabled {
  138. user.Disabled = reqData.Disabled
  139. }
  140. if reqData.Password != "" {
  141. user.Password = password.Encode(reqData.Password)
  142. }
  143. num, err := db.Instance.ID(user.ID).Cols("name", "password", "disabled").Update(&user)
  144. if err != nil {
  145. response.NewErrorResponse(response.ServerError, err.Error(), "").FPrint(w)
  146. return
  147. }
  148. if num == 0 {
  149. response.NewErrorResponse(response.ServerError, "No Data Update", "").FPrint(w)
  150. return
  151. }
  152. response.NewSuccessResponse(user).FPrint(w)
  153. }