Files
tyapi-server/internal/domains/user/services/user_auth_service.go
2025-07-20 20:53:26 +08:00

130 lines
3.2 KiB
Go

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
}