user_request.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package requests
  2. import (
  3. "mime/multipart"
  4. "github.com/gin-gonic/gin"
  5. "github.com/thedevsaddam/govalidator"
  6. "github.com/runningwater/gohub/app/requests/validators"
  7. "github.com/runningwater/gohub/pkg/auth"
  8. )
  9. type UserUpdateProfileRequest struct {
  10. Name string `valid:"name" json:"name"`
  11. City string `valid:"city" json:"city"`
  12. Introduction string `valid:"introduction" json:"introduction"`
  13. }
  14. func UserUpdateProfile(data any, c *gin.Context) map[string][]string {
  15. // 查询用户名重复时,过滤当前用户ID
  16. uid := auth.CurrentUID(c)
  17. rules := govalidator.MapData{
  18. "name": []string{"required", "alpha_num", "between:3,20", "not_exists:users,name," + uid},
  19. "city": []string{"min_cn:2", "max_cn:20"},
  20. "introduction": []string{"min_cn:4", "max_cn:240"},
  21. }
  22. messages := govalidator.MapData{
  23. "name": []string{
  24. "required:用户名不能为空",
  25. "alpha_num:用户名格式错误",
  26. "between:3,20:用户名长度需在 3-20 之间",
  27. "not_exists:用户名已存在",
  28. },
  29. "city": []string{
  30. "min_cn:城市长度需至少 2 个字符",
  31. "max_cn:城市长度不能超过 20 个字符",
  32. },
  33. "introduction": []string{
  34. "min_cn:简介长度需至少 4 个字符",
  35. "max_cn:简介长度不能超过 240 个字符",
  36. },
  37. }
  38. return validate(data, rules, messages)
  39. }
  40. type UserUpdateEmailRequest struct {
  41. Email string `valid:"email" json:"email"`
  42. VerifyCode string `valid:"verify_code" json:"verify_code,omitempty"`
  43. }
  44. // UserUpdateEmail 处理用户邮箱更新请求
  45. // 参数:
  46. //
  47. // data - 请求数据,应为 UserUpdateEmailRequest 类型
  48. // c - Gin 上下文对象
  49. //
  50. // 返回值:
  51. //
  52. // map[string][]string - 包含验证错误的映射
  53. func UserUpdateEmail(data any, c *gin.Context) map[string][]string {
  54. currentUser := auth.CurrentUser(c)
  55. rules := govalidator.MapData{
  56. "email": []string{
  57. "required",
  58. "min:4",
  59. "max:30",
  60. "email",
  61. "not_exists:users,email," + currentUser.GetStringID(),
  62. "not_in:" + currentUser.Email,
  63. },
  64. "verify_code": []string{"required", "digits:6"},
  65. }
  66. messages := govalidator.MapData{
  67. "email": []string{
  68. "required:邮箱不能为空",
  69. "min:邮箱长度需至少 4 个字符",
  70. "max:邮箱长度不能超过 30 个字符",
  71. "email:邮箱格式错误",
  72. "not_exists:邮箱已存在",
  73. "not_in:新邮箱与当前邮箱相同",
  74. },
  75. "verify_code": []string{
  76. "required:验证码不能为空",
  77. "digits:6:验证码长度必须为 6 位数字",
  78. },
  79. }
  80. errs := validate(data, rules, messages)
  81. _data := data.(*UserUpdateEmailRequest)
  82. errs = validators.ValidateVerifyCode(_data.Email, _data.VerifyCode, errs)
  83. return errs
  84. }
  85. type UserUpdateAvatarRequest struct {
  86. Avatar *multipart.FileHeader `valid:"avatar" form:"avatar"`
  87. }
  88. func UserUpdateAvatar(data any, c *gin.Context) map[string][]string {
  89. // size 的单位为 bytes
  90. // - 1024 bytes 为 1 KB
  91. // - 1024 * 1024 bytes 为 1 MB
  92. // - 1024 * 1024 * 1024 bytes 为 1 GB
  93. // - 20971520 bytes 为 20 MB
  94. rules := govalidator.MapData{
  95. "file:avatar": []string{"ext:png,jpg,jpeg", "size:20971520", "required"},
  96. }
  97. messages := govalidator.MapData{
  98. "file:avatar": []string{
  99. "ext:头像格式错误,只能为 png,jpg,jpeg 一种",
  100. "siz:头像大小不能超过 20 MB",
  101. "required:头像不能为空",
  102. },
  103. }
  104. return validateFile(c, data, rules, messages)
  105. }