users.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package controller
  2. import (
  3. "errors"
  4. "net/http"
  5. "woord-core-service/model"
  6. "github.com/gin-gonic/gin"
  7. "gorm.io/gorm"
  8. )
  9. type RegisterRequest struct {
  10. Name string `form:"name" binding:"required"`
  11. Password string `form:"password" binding:"required"`
  12. }
  13. type RegisterResponse struct {
  14. UserID uint `json:"id"`
  15. }
  16. // 注册
  17. func Register(c *gin.Context) {
  18. var request RegisterRequest
  19. if err := c.ShouldBind(&request); err != nil {
  20. respondError(c, http.StatusBadRequest, err)
  21. return
  22. }
  23. user := &model.User{Name: request.Name, Password: request.Password}
  24. if err := model.CreateUser(user); err != nil {
  25. if errors.Is(err, model.ErrUserNameAlreadyExists) {
  26. respondError(c, http.StatusConflict, err)
  27. } else {
  28. respondUnknownError(c, err)
  29. }
  30. } else {
  31. respondOK(c, &RegisterResponse{UserID: user.ID})
  32. }
  33. }
  34. type LoginRequest struct {
  35. Name string `form:"name" binding:"required"`
  36. Password string `form:"password" binding:"required"`
  37. }
  38. type LoginResponse struct {
  39. UserID uint `json:"id"`
  40. Token string `json:"token"`
  41. }
  42. // 登录
  43. func Login(c *gin.Context) {
  44. var request LoginRequest
  45. if err := c.ShouldBind(&request); err != nil {
  46. respondError(c, http.StatusBadRequest, err)
  47. return
  48. }
  49. user := &model.User{Name: request.Name, Password: request.Password}
  50. if err := model.AuthenticateUser(user); err != nil {
  51. if errors.Is(err, model.ErrWrongUserNameOrPassword) {
  52. respondError(c, http.StatusUnauthorized, err)
  53. } else {
  54. respondUnknownError(c, err)
  55. }
  56. } else if token, err := newToken(user.ID); err != nil {
  57. respondUnknownError(c, err)
  58. } else {
  59. respondOK(c, &LoginResponse{UserID: user.ID, Token: token})
  60. }
  61. }
  62. type GetCurrentUserResponse struct {
  63. UserID uint `json:"id"`
  64. UserName string `json:"name"`
  65. }
  66. // 获取当前用户
  67. func GetCurrentUser(c *gin.Context) {
  68. user := &model.User{Model: gorm.Model{ID: c.MustGet(AuthUserKey).(uint)}}
  69. if err := model.GetUser(user); err != nil {
  70. if errors.Is(err, model.ErrUserNotFound) {
  71. respondError(c, http.StatusNotFound, err)
  72. } else {
  73. respondUnknownError(c, err)
  74. }
  75. } else {
  76. respondOK(c, &GetCurrentUserResponse{UserID: user.ID, UserName: user.Name})
  77. }
  78. }