package services import ( "context" "fmt" "go.uber.org/zap" "tyapi-server/internal/domains/user/entities" "tyapi-server/internal/domains/user/repositories" ) // UserAuthService 用户认证领域服务 // 负责用户认证相关的业务逻辑,包括密码验证、登录状态管理等 type UserAuthService struct { userRepo repositories.UserRepository logger *zap.Logger } // NewUserAuthService 创建用户认证领域服务 func NewUserAuthService( userRepo repositories.UserRepository, logger *zap.Logger, ) *UserAuthService { return &UserAuthService{ userRepo: userRepo, logger: logger, } } // ValidatePassword 验证用户密码 func (s *UserAuthService) ValidatePassword(ctx context.Context, phone, password string) (*entities.User, error) { user, err := s.userRepo.GetByPhone(ctx, phone) if err != nil { return nil, fmt.Errorf("用户名或密码错误") } if !user.CanLogin() { return nil, fmt.Errorf("用户状态异常,无法登录") } if !user.CheckPassword(password) { return nil, fmt.Errorf("用户名或密码错误") } return user, nil } // ValidateUserLogin 验证用户登录状态 func (s *UserAuthService) ValidateUserLogin(ctx context.Context, phone string) (*entities.User, error) { user, err := s.userRepo.GetByPhone(ctx, phone) if err != nil { return nil, fmt.Errorf("用户不存在") } if !user.CanLogin() { return nil, fmt.Errorf("用户状态异常,无法登录") } return user, nil } // ChangePassword 修改用户密码 func (s *UserAuthService) ChangePassword(ctx context.Context, userID, oldPassword, newPassword string) error { user, err := s.userRepo.GetByID(ctx, userID) if err != nil { return fmt.Errorf("用户不存在: %w", err) } if err := user.ChangePassword(oldPassword, newPassword, newPassword); err != nil { return err } if err := s.userRepo.Update(ctx, user); err != nil { s.logger.Error("密码修改失败", zap.Error(err)) return fmt.Errorf("密码修改失败: %w", err) } s.logger.Info("密码修改成功", zap.String("user_id", userID), ) return nil } // ResetPassword 重置用户密码 func (s *UserAuthService) ResetPassword(ctx context.Context, phone, newPassword string) error { user, err := s.userRepo.GetByPhone(ctx, phone) if err != nil { return fmt.Errorf("用户不存在: %w", err) } if err := user.ResetPassword(newPassword, newPassword); err != nil { return err } if err := s.userRepo.Update(ctx, *user); err != nil { s.logger.Error("密码重置失败", zap.Error(err)) return fmt.Errorf("密码重置失败: %w", err) } s.logger.Info("密码重置成功", zap.String("user_id", user.ID), zap.String("phone", user.Phone), ) return nil } // GetUserPermissions 获取用户权限 func (s *UserAuthService) GetUserPermissions(ctx context.Context, user *entities.User) ([]string, error) { if !user.IsAdmin() { return []string{}, nil } // 这里可以根据用户角色返回不同的权限 // 目前返回默认的管理员权限 permissions := []string{ "user:read", "user:write", "product:read", "product:write", "certification:read", "certification:write", "finance:read", "finance:write", } return permissions, nil }