123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- package service
- import (
- "context"
- "github.com/go-nunu/nunu-layout-advanced/internal/model"
- "github.com/go-nunu/nunu-layout-advanced/internal/pkg/request"
- "github.com/go-nunu/nunu-layout-advanced/internal/repository"
- "github.com/pkg/errors"
- "golang.org/x/crypto/bcrypt"
- "time"
- )
- type UserService interface {
- Register(ctx context.Context, req *request.RegisterRequest) error
- Login(ctx context.Context, req *request.LoginRequest) (string, error)
- GetProfile(ctx context.Context, userId string) (*model.User, error)
- UpdateProfile(ctx context.Context, userId string, req *request.UpdateProfileRequest) error
- }
- type userService struct {
- userRepo repository.UserRepository
- *Service
- }
- func NewUserService(service *Service, userRepo repository.UserRepository) UserService {
- return &userService{
- userRepo: userRepo,
- Service: service,
- }
- }
- func (s *userService) Register(ctx context.Context, req *request.RegisterRequest) error {
- // 检查用户名是否已存在
- if user, err := s.userRepo.GetByUsername(ctx, req.Username); err == nil && user != nil {
- return errors.New("username already exists")
- }
- hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
- if err != nil {
- return errors.Wrap(err, "failed to hash password")
- }
- // Generate user ID
- userId, err := s.sid.GenString()
- if err != nil {
- return errors.Wrap(err, "failed to generate user ID")
- }
- // Create a user
- user := &model.User{
- UserId: userId,
- Username: req.Username,
- Password: string(hashedPassword),
- Email: req.Email,
- }
- if err = s.userRepo.Create(ctx, user); err != nil {
- return errors.Wrap(err, "failed to create user")
- }
- return nil
- }
- func (s *userService) Login(ctx context.Context, req *request.LoginRequest) (string, error) {
- user, err := s.userRepo.GetByUsername(ctx, req.Username)
- if err != nil || user == nil {
- return "", errors.Wrap(err, "failed to get user by username")
- }
- err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password))
- if err != nil {
- return "", errors.Wrap(err, "failed to hash password")
- }
- token, err := s.jwt.GenToken(user.UserId, time.Now().Add(time.Hour*24*90))
- if err != nil {
- return "", errors.Wrap(err, "failed to generate JWT token")
- }
- return token, nil
- }
- func (s *userService) GetProfile(ctx context.Context, userId string) (*model.User, error) {
- user, err := s.userRepo.GetByID(ctx, userId)
- if err != nil {
- return nil, errors.Wrap(err, "failed to get user by ID")
- }
- return user, nil
- }
- func (s *userService) UpdateProfile(ctx context.Context, userId string, req *request.UpdateProfileRequest) error {
- user, err := s.userRepo.GetByID(ctx, userId)
- if err != nil {
- return errors.Wrap(err, "failed to get user by ID")
- }
- user.Email = req.Email
- user.Nickname = req.Nickname
- if err = s.userRepo.Update(ctx, user); err != nil {
- return errors.Wrap(err, "failed to update user")
- }
- return nil
- }
|