130 lines
3.2 KiB
Go
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
|
|
} |