import 'package:dartz/dartz.dart'; import '../../../services/user_service.dart'; import '../../../core/errors/failures.dart'; import '../base_usecase.dart'; /// 비밀번호 재설정 파라미터 class ResetPasswordParams { final int userId; final String newPassword; final String? currentPassword; // 자기 자신의 비밀번호 변경 시 필요 const ResetPasswordParams({ required this.userId, required this.newPassword, this.currentPassword, }); } /// 비밀번호 재설정 UseCase /// 관리자는 다른 사용자 비밀번호 재설정 가능 /// 일반 사용자는 자신의 비밀번호만 변경 가능 (현재 비밀번호 필요) class ResetPasswordUseCase extends UseCase { final UserService _userService; ResetPasswordUseCase(this._userService); @override Future> call(ResetPasswordParams params) async { try { // 비밀번호 유효성 검증 final validationResult = _validatePassword(params.newPassword); if (validationResult != null) { return Left(validationResult); } final success = await _userService.resetPassword( userId: params.userId, newPassword: params.newPassword, ); return Right(success); } catch (e) { if (e.toString().contains('권한')) { return Left(PermissionFailure( message: '비밀번호를 재설정할 권한이 없습니다.', code: 'PERMISSION_DENIED', originalError: e, )); } else if (e.toString().contains('일치하지 않')) { return Left(AuthFailure( message: '현재 비밀번호가 일치하지 않습니다.', code: 'INVALID_CURRENT_PASSWORD', originalError: e, )); } else if (e.toString().contains('찾을 수 없')) { return Left(ValidationFailure( message: '사용자를 찾을 수 없습니다.', code: 'USER_NOT_FOUND', originalError: e, )); } else { return Left(ServerFailure( message: '비밀번호 재설정 중 오류가 발생했습니다.', originalError: e, )); } } } ValidationFailure? _validatePassword(String password) { final errors = {}; if (password.length < 8) { errors['password'] = '비밀번호는 8자 이상이어야 합니다.'; } if (!RegExp(r'^(?=.*[A-Za-z])(?=.*\d)').hasMatch(password)) { errors['password'] = '비밀번호는 영문과 숫자를 포함해야 합니다.'; } if (!RegExp(r'[!@#$%^&*(),.?":{}|<>]').hasMatch(password)) { errors['password'] = '비밀번호는 특수문자를 포함해야 합니다.'; } if (errors.isNotEmpty) { return ValidationFailure( message: '비밀번호가 보안 요구사항을 충족하지 않습니다.', errors: errors, ); } return null; } }