user.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package service
  2. import (
  3. "context"
  4. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  5. "github.com/go-nunu/nunu-layout-advanced/internal/pkg/request"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/repository"
  7. "github.com/pkg/errors"
  8. "golang.org/x/crypto/bcrypt"
  9. "time"
  10. )
  11. type UserService interface {
  12. Register(ctx context.Context, req *request.RegisterRequest) error
  13. Login(ctx context.Context, req *request.LoginRequest) (string, error)
  14. GetProfile(ctx context.Context, userId string) (*model.User, error)
  15. UpdateProfile(ctx context.Context, userId string, req *request.UpdateProfileRequest) error
  16. }
  17. type userService struct {
  18. userRepo repository.UserRepository
  19. *Service
  20. }
  21. func NewUserService(service *Service, userRepo repository.UserRepository) UserService {
  22. return &userService{
  23. userRepo: userRepo,
  24. Service: service,
  25. }
  26. }
  27. func (s *userService) Register(ctx context.Context, req *request.RegisterRequest) error {
  28. // 检查用户名是否已存在
  29. if user, err := s.userRepo.GetByUsername(ctx, req.Username); err == nil && user != nil {
  30. return errors.New("username already exists")
  31. }
  32. hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
  33. if err != nil {
  34. return errors.Wrap(err, "failed to hash password")
  35. }
  36. // Generate user ID
  37. userId, err := s.sid.GenString()
  38. if err != nil {
  39. return errors.Wrap(err, "failed to generate user ID")
  40. }
  41. // Create a user
  42. user := &model.User{
  43. UserId: userId,
  44. Username: req.Username,
  45. Password: string(hashedPassword),
  46. Email: req.Email,
  47. }
  48. if err = s.userRepo.Create(ctx, user); err != nil {
  49. return errors.Wrap(err, "failed to create user")
  50. }
  51. return nil
  52. }
  53. func (s *userService) Login(ctx context.Context, req *request.LoginRequest) (string, error) {
  54. user, err := s.userRepo.GetByUsername(ctx, req.Username)
  55. if err != nil || user == nil {
  56. return "", errors.Wrap(err, "failed to get user by username")
  57. }
  58. err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password))
  59. if err != nil {
  60. return "", errors.Wrap(err, "failed to hash password")
  61. }
  62. token, err := s.jwt.GenToken(user.UserId, time.Now().Add(time.Hour*24*90))
  63. if err != nil {
  64. return "", errors.Wrap(err, "failed to generate JWT token")
  65. }
  66. return token, nil
  67. }
  68. func (s *userService) GetProfile(ctx context.Context, userId string) (*model.User, error) {
  69. user, err := s.userRepo.GetByID(ctx, userId)
  70. if err != nil {
  71. return nil, errors.Wrap(err, "failed to get user by ID")
  72. }
  73. return user, nil
  74. }
  75. func (s *userService) UpdateProfile(ctx context.Context, userId string, req *request.UpdateProfileRequest) error {
  76. user, err := s.userRepo.GetByID(ctx, userId)
  77. if err != nil {
  78. return errors.Wrap(err, "failed to get user by ID")
  79. }
  80. user.Email = req.Email
  81. user.Nickname = req.Nickname
  82. if err = s.userRepo.Update(ctx, user); err != nil {
  83. return errors.Wrap(err, "failed to update user")
  84. }
  85. return nil
  86. }