user.go 4.1 KB

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