user.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. "golang.org/x/crypto/bcrypt"
  8. "time"
  9. )
  10. type UserService interface {
  11. Register(ctx context.Context, req *v1.RegisterRequest) error
  12. Login(ctx context.Context, req *v1.LoginRequest) (string, error)
  13. GetProfile(ctx context.Context, userId string) (*v1.GetProfileResponseData, error)
  14. UpdateProfile(ctx context.Context, userId string, req *v1.UpdateProfileRequest) error
  15. }
  16. func NewUserService(service *Service, userRepo repository.UserRepository) UserService {
  17. return &userService{
  18. userRepo: userRepo,
  19. Service: service,
  20. }
  21. }
  22. type userService struct {
  23. userRepo repository.UserRepository
  24. *Service
  25. }
  26. func (s *userService) Register(ctx context.Context, req *v1.RegisterRequest) error {
  27. // check username
  28. if user, err := s.userRepo.GetByUsername(ctx, req.Username); err == nil && user != nil {
  29. return v1.ErrUsernameAlreadyUse
  30. }
  31. hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
  32. if err != nil {
  33. return err
  34. }
  35. // Generate user ID
  36. userId, err := s.sid.GenString()
  37. if err != nil {
  38. return err
  39. }
  40. // Create a user
  41. user := &model.User{
  42. UserId: userId,
  43. Username: req.Username,
  44. Nickname: req.Username,
  45. Password: string(hashedPassword),
  46. Email: req.Email,
  47. }
  48. if err = s.userRepo.Create(ctx, user); err != nil {
  49. return err
  50. }
  51. return nil
  52. }
  53. func (s *userService) Login(ctx context.Context, req *v1.LoginRequest) (string, error) {
  54. user, err := s.userRepo.GetByUsername(ctx, req.Username)
  55. if err != nil || user == nil {
  56. return "", v1.ErrUnauthorized
  57. }
  58. err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password))
  59. if err != nil {
  60. return "", err
  61. }
  62. token, err := s.jwt.GenToken(user.UserId, time.Now().Add(time.Hour*24*90))
  63. if err != nil {
  64. return "", err
  65. }
  66. return token, nil
  67. }
  68. func (s *userService) GetProfile(ctx context.Context, userId string) (*v1.GetProfileResponseData, error) {
  69. user, err := s.userRepo.GetByID(ctx, userId)
  70. if err != nil {
  71. return nil, err
  72. }
  73. return &v1.GetProfileResponseData{
  74. UserId: user.UserId,
  75. Nickname: user.Nickname,
  76. Username: user.Username,
  77. }, nil
  78. }
  79. func (s *userService) UpdateProfile(ctx context.Context, userId string, req *v1.UpdateProfileRequest) error {
  80. user, err := s.userRepo.GetByID(ctx, userId)
  81. if err != nil {
  82. return err
  83. }
  84. user.Email = req.Email
  85. user.Nickname = req.Nickname
  86. if err = s.userRepo.Update(ctx, user); err != nil {
  87. return err
  88. }
  89. return nil
  90. }