사용하지 않는 파일 정리 전 백업 (Phase 10 완료 후 상태)

This commit is contained in:
JiWoong Sul
2025-08-29 15:11:59 +09:00
parent a740ff10c8
commit d916b281a7
333 changed files with 53617 additions and 22574 deletions

View File

@@ -0,0 +1,165 @@
import 'package:injectable/injectable.dart';
import 'package:superport/data/models/model_dto.dart';
import 'package:superport/data/repositories/model_repository.dart';
/// Model 비즈니스 로직을 처리하는 UseCase
@lazySingleton
class ModelUseCase {
final ModelRepository _repository;
ModelUseCase(this._repository);
/// 모든 모델 조회 (선택적으로 vendor로 필터링)
Future<List<ModelDto>> getModels({int? vendorId}) async {
try {
final models = await _repository.getModels(vendorId: vendorId);
// 활성 모델만 필터링 (비즈니스 규칙)
return models.where((model) => model.isActive).toList()
..sort((a, b) => a.name.compareTo(b.name));
} catch (e) {
throw Exception('모델 목록을 불러오는데 실패했습니다: $e');
}
}
/// 특정 모델 상세 조회
Future<ModelDto> getModelById(int id) async {
try {
return await _repository.getModelById(id);
} catch (e) {
throw Exception('모델 정보를 불러오는데 실패했습니다: $e');
}
}
/// 새 모델 생성
Future<ModelDto> createModel({
required int vendorsId,
required String name,
}) async {
try {
// 입력값 검증
if (name.trim().isEmpty) {
throw Exception('모델명을 입력해주세요');
}
// 중복 검사 (같은 vendor 내에서)
final existingModels = await _repository.getModels(vendorId: vendorsId);
final isDuplicate = existingModels.any(
(model) => model.name.toLowerCase() == name.toLowerCase(),
);
if (isDuplicate) {
throw Exception('동일한 제조사에 이미 존재하는 모델명입니다');
}
// 모델 생성
final request = ModelRequestDto(
vendorsId: vendorsId,
name: name.trim(),
);
return await _repository.createModel(request);
} catch (e) {
if (e.toString().contains('이미 존재하는')) {
rethrow;
}
throw Exception('모델 생성에 실패했습니다: $e');
}
}
/// 모델 정보 수정
Future<ModelDto> updateModel({
required int id,
required int vendorsId,
required String name,
}) async {
try {
// 입력값 검증
if (name.trim().isEmpty) {
throw Exception('모델명을 입력해주세요');
}
// 중복 검사 (자기 자신 제외)
final existingModels = await _repository.getModels(vendorId: vendorsId);
final isDuplicate = existingModels.any(
(model) => model.id != id &&
model.name.toLowerCase() == name.toLowerCase(),
);
if (isDuplicate) {
throw Exception('동일한 제조사에 이미 존재하는 모델명입니다');
}
// 모델 수정
final request = ModelUpdateRequestDto(
vendorsId: vendorsId,
name: name.trim(),
);
return await _repository.updateModel(id, request);
} catch (e) {
if (e.toString().contains('이미 존재하는')) {
rethrow;
}
throw Exception('모델 수정에 실패했습니다: $e');
}
}
/// 모델 삭제 (Hard Delete - 백엔드 API 사용)
Future<void> deleteModel(int id) async {
try {
await _repository.deleteModel(id);
} catch (e) {
throw Exception('모델 삭제에 실패했습니다: $e');
}
}
/// 모델 검색
Future<List<ModelDto>> searchModels(String query) async {
try {
if (query.trim().isEmpty) {
return await getModels();
}
final models = await _repository.searchModels(query);
// 활성 모델만 필터링
return models.where((model) => model.isActive).toList()
..sort((a, b) => a.name.compareTo(b.name));
} catch (e) {
throw Exception('모델 검색에 실패했습니다: $e');
}
}
/// Vendor별 모델 그룹핑
Future<Map<int, List<ModelDto>>> getModelsByVendorGrouped() async {
try {
final models = await getModels();
final grouped = <int, List<ModelDto>>{};
for (final model in models) {
grouped.putIfAbsent(model.vendorsId, () => []).add(model);
}
return grouped;
} catch (e) {
throw Exception('모델 그룹핑에 실패했습니다: $e');
}
}
/// Vendor 삭제 시 관련 모델 처리
Future<void> handleVendorDeletion(int vendorId) async {
try {
final models = await _repository.getModels(vendorId: vendorId);
// 모든 관련 모델 삭제
for (final model in models) {
if (model.id != null) {
await _repository.deleteModel(model.id!);
}
}
} catch (e) {
throw Exception('Vendor 삭제 처리에 실패했습니다: $e');
}
}
}