user.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package service
  2. import (
  3. "context"
  4. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  5. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  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 *v1.RegisterRequest) error
  13. Login(ctx context.Context, req *v1.LoginRequest) (string, error)
  14. GetProfile(ctx context.Context, userId string) (*v1.GetProfileResponseData, error)
  15. UpdateProfile(ctx context.Context, userId string, req *v1.UpdateProfileRequest) error
  16. }
  17. func NewUserService(service *Service, userRepo repository.UserRepository) UserService {
  18. return &userService{
  19. userRepo: userRepo,
  20. Service: service,
  21. }
  22. }
  23. type userService struct {
  24. userRepo repository.UserRepository
  25. *Service
  26. }
  27. func (s *userService) Register(ctx context.Context, req *v1.RegisterRequest) error {
  28. // check username
  29. if user, err := s.userRepo.GetByUsername(ctx, req.Username); err == nil && user != nil {
  30. return v1.ErrUsernameAlreadyUse
  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. Nickname: req.Username,
  46. Password: string(hashedPassword),
  47. Email: req.Email,
  48. }
  49. if err = s.userRepo.Create(ctx, user); err != nil {
  50. return errors.Wrap(err, "failed to create user")
  51. }
  52. return nil
  53. }
  54. func (s *userService) Login(ctx context.Context, req *v1.LoginRequest) (string, error) {
  55. user, err := s.userRepo.GetByUsername(ctx, req.Username)
  56. if err != nil || user == nil {
  57. return "", v1.ErrUnauthorized
  58. }
  59. err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password))
  60. if err != nil {
  61. return "", errors.Wrap(err, "failed to hash password")
  62. }
  63. token, err := s.jwt.GenToken(user.UserId, time.Now().Add(time.Hour*24*90))
  64. if err != nil {
  65. return "", errors.Wrap(err, "failed to generate JWT token")
  66. }
  67. return token, nil
  68. }
  69. func (s *userService) GetProfile(ctx context.Context, userId string) (*v1.GetProfileResponseData, error) {
  70. user, err := s.userRepo.GetByID(ctx, userId)
  71. if err != nil {
  72. return nil, errors.Wrap(err, "failed to get user by ID")
  73. }
  74. return &v1.GetProfileResponseData{
  75. UserId: user.UserId,
  76. Nickname: user.Nickname,
  77. Username: user.Username,
  78. }, nil
  79. }
  80. func (s *userService) UpdateProfile(ctx context.Context, userId string, req *v1.UpdateProfileRequest) error {
  81. user, err := s.userRepo.GetByID(ctx, userId)
  82. if err != nil {
  83. return errors.Wrap(err, "failed to get user by ID")
  84. }
  85. user.Email = req.Email
  86. user.Nickname = req.Nickname
  87. if err = s.userRepo.Update(ctx, user); err != nil {
  88. return errors.Wrap(err, "failed to update user")
  89. }
  90. return nil
  91. }