import 'package:dartz/dartz.dart'; import '../../../services/user_service.dart'; import '../../../models/user_model.dart' as model; import '../../../core/constants/app_constants.dart'; import '../../../core/errors/failures.dart'; import '../base_usecase.dart'; /// 사용자 생성 파라미터 class CreateUserParams { final String username; final String email; final String password; final String name; final String role; final int companyId; final String? phone; final String? position; const CreateUserParams({ required this.username, required this.email, required this.password, required this.name, required this.role, required this.companyId, this.phone, this.position, }); } /// 사용자 생성 UseCase /// 유효성 검증 및 중복 체크 포함 class CreateUserUseCase extends UseCase { final UserService _userService; CreateUserUseCase(this._userService); @override Future> call(CreateUserParams params) async { try { // 유효성 검증 final validationResult = _validateUserInput(params); if (validationResult != null) { return Left(validationResult); } final user = await _userService.createUser( username: params.username, email: params.email, password: params.password, name: params.name, role: params.role, companyId: params.companyId, phone: params.phone, position: params.position, ); return Right(user); } catch (e) { if (e.toString().contains('이미 존재')) { return Left(ValidationFailure( message: '이미 존재하는 사용자입니다.', code: 'USER_EXISTS', errors: { 'username': '이미 사용중인 사용자명입니다.', 'email': '이미 등록된 이메일입니다.', }, originalError: e, )); } else if (e.toString().contains('권한')) { return Left(PermissionFailure( message: '사용자를 생성할 권한이 없습니다.', code: 'PERMISSION_DENIED', originalError: e, )); } else { return Left(ServerFailure( message: '사용자 생성 중 오류가 발생했습니다.', originalError: e, )); } } } ValidationFailure? _validateUserInput(CreateUserParams params) { final errors = {}; // 사용자명 검증 if (params.username.length < 3) { errors['username'] = '사용자명은 3자 이상이어야 합니다.'; } if (!RegExp(r'^[a-zA-Z0-9_]+$').hasMatch(params.username)) { errors['username'] = '사용자명은 영문, 숫자, 언더스코어만 사용 가능합니다.'; } // 이메일 검증 if (!AppConstants.emailRegex.hasMatch(params.email)) { errors['email'] = '올바른 이메일 형식이 아닙니다.'; } // 비밀번호 검증 if (params.password.length < 8) { errors['password'] = '비밀번호는 8자 이상이어야 합니다.'; } if (!RegExp(r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]').hasMatch(params.password)) { errors['password'] = '비밀번호는 영문, 숫자, 특수문자를 포함해야 합니다.'; } // 이름 검증 if (params.name.isEmpty) { errors['name'] = '이름을 입력해주세요.'; } // 역할 검증 if (!['S', 'M', 'U', 'V'].contains(params.role)) { errors['role'] = '올바른 역할을 선택해주세요.'; } // 전화번호 검증 (선택사항) if (params.phone != null && params.phone!.isNotEmpty) { if (!AppConstants.phoneRegex.hasMatch(params.phone!)) { errors['phone'] = '올바른 전화번호 형식이 아닙니다.'; } } if (errors.isNotEmpty) { return ValidationFailure( message: '입력값을 확인해주세요.', errors: errors, ); } return null; } }