backup: 사용하지 않는 파일 삭제 전 복구 지점
- 전체 371개 파일 중 82개 미사용 파일 식별 - Phase 1: 33개 파일 삭제 예정 (100% 안전) - Phase 2: 30개 파일 삭제 검토 예정 - Phase 3: 19개 파일 수동 검토 예정 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import '../../core/constants/app_constants.dart';
|
||||
import '../../core/errors/failures.dart';
|
||||
import '../../domain/repositories/company_repository.dart';
|
||||
import '../../models/company_model.dart';
|
||||
@@ -30,7 +31,7 @@ class CompanyRepositoryImpl implements CompanyRepository {
|
||||
try {
|
||||
final result = await remoteDataSource.getCompanies(
|
||||
page: page ?? 1,
|
||||
perPage: limit ?? 20,
|
||||
perPage: limit ?? AppConstants.companyPageSize,
|
||||
search: search,
|
||||
isActive: null, // companyType에 따른 필터링 로직 필요 시 추가
|
||||
);
|
||||
@@ -154,6 +155,26 @@ class CompanyRepositoryImpl implements CompanyRepository {
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, Company>> restoreCompany(int id) async {
|
||||
try {
|
||||
final result = await remoteDataSource.restoreCompany(id);
|
||||
final restoredCompany = _mapResponseToDomain(result);
|
||||
return Right(restoredCompany);
|
||||
} catch (e) {
|
||||
if (e.toString().contains('404')) {
|
||||
return Left(NotFoundFailure(
|
||||
message: '복구할 회사를 찾을 수 없습니다.',
|
||||
resourceType: 'Company',
|
||||
resourceId: id.toString(),
|
||||
));
|
||||
}
|
||||
return Left(ServerFailure(
|
||||
message: '회사 복구 중 오류가 발생했습니다: ${e.toString()}',
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, Company>> toggleCompanyStatus(int id) async {
|
||||
try {
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'package:dio/dio.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:superport/core/constants/api_endpoints.dart';
|
||||
import 'package:superport/data/models/equipment_history_dto.dart';
|
||||
import 'package:superport/data/models/stock_status_dto.dart';
|
||||
|
||||
abstract class EquipmentHistoryRepository {
|
||||
Future<EquipmentHistoryListResponse> getEquipmentHistories({
|
||||
@@ -21,6 +22,9 @@ abstract class EquipmentHistoryRepository {
|
||||
|
||||
Future<List<EquipmentHistoryDto>> getEquipmentHistoriesByWarehouseId(int warehouseId);
|
||||
|
||||
// 재고 현황 조회 (핵심 기능)
|
||||
Future<List<StockStatusDto>> getStockStatus();
|
||||
|
||||
// InventoryStatusDto 관련 메서드들 제거 (백엔드에 해당 개념 없음)
|
||||
|
||||
Future<EquipmentHistoryDto> createEquipmentHistory(
|
||||
@@ -139,6 +143,21 @@ class EquipmentHistoryRepositoryImpl implements EquipmentHistoryRepository {
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<StockStatusDto>> getStockStatus() async {
|
||||
try {
|
||||
final response = await _dio.get(ApiEndpoints.equipmentHistoryStockStatus);
|
||||
|
||||
final List<dynamic> data = response.data is List
|
||||
? response.data
|
||||
: response.data['data'] ?? [];
|
||||
|
||||
return data.map((json) => StockStatusDto.fromJson(json)).toList();
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
// InventoryStatusDto 관련 메서드들 제거 (백엔드에 해당 개념 없음)
|
||||
|
||||
@override
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import '../../core/constants/app_constants.dart';
|
||||
import '../../core/errors/failures.dart';
|
||||
import '../../core/errors/exceptions.dart';
|
||||
import '../../domain/repositories/equipment_repository.dart';
|
||||
@@ -24,14 +25,14 @@ class EquipmentRepositoryImpl implements EquipmentRepository {
|
||||
try {
|
||||
final result = await remoteDataSource.getEquipments(
|
||||
page: page ?? 1,
|
||||
perPage: limit ?? 20,
|
||||
perPage: limit ?? AppConstants.equipmentPageSize,
|
||||
search: search,
|
||||
);
|
||||
|
||||
final paginatedResult = PaginatedResponse<EquipmentDto>(
|
||||
items: result.items,
|
||||
page: result.currentPage,
|
||||
size: result.pageSize ?? 20,
|
||||
size: result.pageSize ?? AppConstants.equipmentPageSize,
|
||||
totalElements: result.totalCount,
|
||||
totalPages: result.totalPages,
|
||||
first: result.currentPage == 1,
|
||||
@@ -93,4 +94,52 @@ class EquipmentRepositoryImpl implements EquipmentRepository {
|
||||
return Left(ServerFailure(message: '장비 삭제 실패: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, EquipmentDto>> restoreEquipment(int id) async {
|
||||
try {
|
||||
final result = await remoteDataSource.restoreEquipment(id);
|
||||
return Right(result);
|
||||
} on ServerException catch (e) {
|
||||
return Left(ServerFailure(message: e.message));
|
||||
} catch (e) {
|
||||
return Left(ServerFailure(message: '장비 복구 실패: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, EquipmentDto>> getEquipmentBySerial(String serial) async {
|
||||
try {
|
||||
final result = await remoteDataSource.getEquipmentBySerial(serial);
|
||||
return Right(result);
|
||||
} on ServerException catch (e) {
|
||||
return Left(ServerFailure(message: e.message));
|
||||
} catch (e) {
|
||||
return Left(ServerFailure(message: '시리얼 번호로 장비 검색 실패: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, EquipmentDto>> getEquipmentByBarcode(String barcode) async {
|
||||
try {
|
||||
final result = await remoteDataSource.getEquipmentByBarcode(barcode);
|
||||
return Right(result);
|
||||
} on ServerException catch (e) {
|
||||
return Left(ServerFailure(message: e.message));
|
||||
} catch (e) {
|
||||
return Left(ServerFailure(message: '바코드로 장비 검색 실패: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, List<EquipmentDto>>> getEquipmentsByCompany(int companyId) async {
|
||||
try {
|
||||
final result = await remoteDataSource.getEquipmentsByCompany(companyId);
|
||||
return Right(result);
|
||||
} on ServerException catch (e) {
|
||||
return Left(ServerFailure(message: e.message));
|
||||
} catch (e) {
|
||||
return Left(ServerFailure(message: '회사별 장비 조회 실패: $e'));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,214 +1,24 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import '../models/maintenance_dto.dart';
|
||||
import '../../utils/constants.dart';
|
||||
import 'package:superport/data/models/maintenance_dto.dart';
|
||||
|
||||
class MaintenanceRepository {
|
||||
final Dio _dio;
|
||||
static const String _baseEndpoint = '/maintenances';
|
||||
|
||||
MaintenanceRepository({required Dio dio}) : _dio = dio;
|
||||
|
||||
// 유지보수 목록 조회
|
||||
abstract class MaintenanceRepository {
|
||||
Future<MaintenanceListResponse> getMaintenances({
|
||||
int page = 1,
|
||||
int pageSize = PaginationConstants.defaultPageSize,
|
||||
String? sortBy,
|
||||
String? sortOrder,
|
||||
String? search,
|
||||
int? equipmentHistoryId,
|
||||
int perPage = 20,
|
||||
int? equipmentId,
|
||||
String? maintenanceType,
|
||||
String? status, // MaintenanceStatus enum 제거, String으로 단순화
|
||||
}) async {
|
||||
try {
|
||||
final queryParams = {
|
||||
'page': page,
|
||||
'page_size': pageSize,
|
||||
if (sortBy != null) 'sort_by': sortBy,
|
||||
if (sortOrder != null) 'sort_order': sortOrder,
|
||||
if (search != null) 'search': search,
|
||||
if (equipmentHistoryId != null) 'equipment_history_id': equipmentHistoryId,
|
||||
if (maintenanceType != null) 'maintenance_type': maintenanceType,
|
||||
if (status != null) 'status': status,
|
||||
};
|
||||
|
||||
final response = await _dio.get(
|
||||
_baseEndpoint,
|
||||
queryParameters: queryParams,
|
||||
);
|
||||
|
||||
return MaintenanceListResponse.fromJson(response.data);
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 특정 유지보수 조회
|
||||
Future<MaintenanceDto> getMaintenance(int id) async {
|
||||
try {
|
||||
final response = await _dio.get('$_baseEndpoint/$id');
|
||||
return MaintenanceDto.fromJson(response.data);
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 장비 이력별 유지보수 조회
|
||||
Future<List<MaintenanceDto>> getMaintenancesByEquipmentHistory(int equipmentHistoryId) async {
|
||||
try {
|
||||
final response = await _dio.get(
|
||||
_baseEndpoint,
|
||||
queryParameters: {'equipment_history_id': equipmentHistoryId},
|
||||
);
|
||||
|
||||
final data = response.data;
|
||||
if (data is Map && data.containsKey('maintenances')) {
|
||||
return (data['maintenances'] as List)
|
||||
.map((json) => MaintenanceDto.fromJson(json))
|
||||
.toList();
|
||||
}
|
||||
return (data as List).map((json) => MaintenanceDto.fromJson(json)).toList();
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 만료 예정 유지보수 조회
|
||||
Future<List<MaintenanceDto>> getUpcomingMaintenances({
|
||||
int daysAhead = 30,
|
||||
}) async {
|
||||
try {
|
||||
final response = await _dio.get(
|
||||
'$_baseEndpoint/upcoming',
|
||||
queryParameters: {'days_ahead': daysAhead},
|
||||
);
|
||||
|
||||
final data = response.data;
|
||||
if (data is Map && data.containsKey('maintenances')) {
|
||||
return (data['maintenances'] as List)
|
||||
.map((json) => MaintenanceDto.fromJson(json))
|
||||
.toList();
|
||||
}
|
||||
return (data as List).map((json) => MaintenanceDto.fromJson(json)).toList();
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 만료된 유지보수 조회
|
||||
Future<List<MaintenanceDto>> getOverdueMaintenances() async {
|
||||
try {
|
||||
final response = await _dio.get('$_baseEndpoint/overdue');
|
||||
|
||||
final data = response.data;
|
||||
if (data is Map && data.containsKey('maintenances')) {
|
||||
return (data['maintenances'] as List)
|
||||
.map((json) => MaintenanceDto.fromJson(json))
|
||||
.toList();
|
||||
}
|
||||
return (data as List).map((json) => MaintenanceDto.fromJson(json)).toList();
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 유지보수 생성
|
||||
Future<MaintenanceDto> createMaintenance(MaintenanceRequestDto request) async {
|
||||
try {
|
||||
final response = await _dio.post(
|
||||
_baseEndpoint,
|
||||
data: request.toJson(),
|
||||
);
|
||||
|
||||
return MaintenanceDto.fromJson(response.data);
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 유지보수 수정
|
||||
Future<MaintenanceDto> updateMaintenance(int id, MaintenanceUpdateRequestDto request) async {
|
||||
try {
|
||||
final response = await _dio.put(
|
||||
'$_baseEndpoint/$id',
|
||||
data: request.toJson(),
|
||||
);
|
||||
|
||||
return MaintenanceDto.fromJson(response.data);
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 유지보수 삭제
|
||||
Future<void> deleteMaintenance(int id) async {
|
||||
try {
|
||||
await _dio.delete('$_baseEndpoint/$id');
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 유지보수 상태 변경 (활성/비활성)
|
||||
Future<MaintenanceDto> toggleMaintenanceStatus(int id, bool isActive) async {
|
||||
try {
|
||||
final response = await _dio.patch(
|
||||
'$_baseEndpoint/$id/status',
|
||||
data: {'is_active': isActive},
|
||||
);
|
||||
|
||||
return MaintenanceDto.fromJson(response.data);
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 다음 유지보수 날짜 계산
|
||||
Future<String> calculateNextMaintenanceDate(int id) async {
|
||||
try {
|
||||
final response = await _dio.post(
|
||||
'$_baseEndpoint/$id/calculate-next-date',
|
||||
);
|
||||
|
||||
return response.data['next_maintenance_date'];
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
// 에러 처리
|
||||
String _handleError(DioException e) {
|
||||
if (e.response != null) {
|
||||
final statusCode = e.response!.statusCode;
|
||||
final data = e.response!.data;
|
||||
|
||||
if (data is Map && data.containsKey('message')) {
|
||||
return data['message'];
|
||||
}
|
||||
|
||||
switch (statusCode) {
|
||||
case 400:
|
||||
return '잘못된 요청입니다.';
|
||||
case 401:
|
||||
return '인증이 필요합니다.';
|
||||
case 403:
|
||||
return '권한이 없습니다.';
|
||||
case 404:
|
||||
return '유지보수 정보를 찾을 수 없습니다.';
|
||||
case 409:
|
||||
return '중복된 유지보수 정보가 존재합니다.';
|
||||
case 500:
|
||||
return '서버 오류가 발생했습니다.';
|
||||
default:
|
||||
return '오류가 발생했습니다. (코드: $statusCode)';
|
||||
}
|
||||
}
|
||||
|
||||
if (e.type == DioExceptionType.connectionTimeout) {
|
||||
return '연결 시간이 초과되었습니다.';
|
||||
} else if (e.type == DioExceptionType.connectionError) {
|
||||
return '네트워크 연결을 확인해주세요.';
|
||||
}
|
||||
|
||||
return '알 수 없는 오류가 발생했습니다.';
|
||||
}
|
||||
bool? isExpired,
|
||||
int? expiringDays,
|
||||
bool includeDeleted = false,
|
||||
});
|
||||
|
||||
Future<MaintenanceDto> getMaintenanceDetail(int id);
|
||||
|
||||
Future<MaintenanceDto> createMaintenance(MaintenanceRequestDto request);
|
||||
|
||||
Future<MaintenanceDto> updateMaintenance(int id, MaintenanceUpdateRequestDto request);
|
||||
|
||||
Future<void> deleteMaintenance(int id);
|
||||
|
||||
// 만료 예정 유지보수 조회 (백엔드 전용 API)
|
||||
Future<List<MaintenanceDto>> getExpiringMaintenances({int days = 30});
|
||||
}
|
||||
115
lib/data/repositories/maintenance_repository_impl.dart
Normal file
115
lib/data/repositories/maintenance_repository_impl.dart
Normal file
@@ -0,0 +1,115 @@
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:superport/core/errors/exceptions.dart';
|
||||
import 'package:superport/core/errors/failures.dart';
|
||||
import 'package:superport/data/datasources/remote/maintenance_remote_datasource.dart';
|
||||
import 'package:superport/data/models/maintenance_dto.dart';
|
||||
import 'package:superport/data/repositories/maintenance_repository.dart';
|
||||
|
||||
@LazySingleton(as: MaintenanceRepository)
|
||||
class MaintenanceRepositoryImpl implements MaintenanceRepository {
|
||||
final MaintenanceRemoteDataSource _remoteDataSource;
|
||||
|
||||
MaintenanceRepositoryImpl({
|
||||
required MaintenanceRemoteDataSource remoteDataSource,
|
||||
}) : _remoteDataSource = remoteDataSource;
|
||||
|
||||
@override
|
||||
Future<MaintenanceListResponse> getMaintenances({
|
||||
int page = 1,
|
||||
int perPage = 20,
|
||||
int? equipmentId,
|
||||
String? maintenanceType,
|
||||
bool? isExpired,
|
||||
int? expiringDays,
|
||||
bool includeDeleted = false,
|
||||
}) async {
|
||||
try {
|
||||
return await _remoteDataSource.getMaintenances(
|
||||
page: page,
|
||||
perPage: perPage,
|
||||
equipmentId: equipmentId,
|
||||
maintenanceType: maintenanceType,
|
||||
isExpired: isExpired,
|
||||
expiringDays: expiringDays,
|
||||
includeDeleted: includeDeleted,
|
||||
);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(
|
||||
message: e.message,
|
||||
statusCode: e.statusCode,
|
||||
);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: '유지보수 목록 조회 중 오류가 발생했습니다');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MaintenanceDto> getMaintenanceDetail(int id) async {
|
||||
try {
|
||||
return await _remoteDataSource.getMaintenanceDetail(id);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(
|
||||
message: e.message,
|
||||
statusCode: e.statusCode,
|
||||
);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: '유지보수 상세 조회 중 오류가 발생했습니다');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MaintenanceDto> createMaintenance(MaintenanceRequestDto request) async {
|
||||
try {
|
||||
return await _remoteDataSource.createMaintenance(request);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(
|
||||
message: e.message,
|
||||
statusCode: e.statusCode,
|
||||
);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: '유지보수 생성 중 오류가 발생했습니다');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MaintenanceDto> updateMaintenance(int id, MaintenanceUpdateRequestDto request) async {
|
||||
try {
|
||||
return await _remoteDataSource.updateMaintenance(id, request);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(
|
||||
message: e.message,
|
||||
statusCode: e.statusCode,
|
||||
);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: '유지보수 수정 중 오류가 발생했습니다');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> deleteMaintenance(int id) async {
|
||||
try {
|
||||
return await _remoteDataSource.deleteMaintenance(id);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(
|
||||
message: e.message,
|
||||
statusCode: e.statusCode,
|
||||
);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: '유지보수 삭제 중 오류가 발생했습니다');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<MaintenanceDto>> getExpiringMaintenances({int days = 30}) async {
|
||||
try {
|
||||
return await _remoteDataSource.getExpiringMaintenances(days: days);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(
|
||||
message: e.message,
|
||||
statusCode: e.statusCode,
|
||||
);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: '만료 예정 유지보수 조회 중 오류가 발생했습니다');
|
||||
}
|
||||
}
|
||||
}
|
||||
113
lib/data/repositories/model_repository_impl.dart
Normal file
113
lib/data/repositories/model_repository_impl.dart
Normal file
@@ -0,0 +1,113 @@
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import '../../core/errors/failures.dart';
|
||||
import '../../core/errors/exceptions.dart';
|
||||
import '../../domain/repositories/model_repository.dart';
|
||||
import '../datasources/remote/model_remote_datasource.dart';
|
||||
import '../models/model/model_dto.dart';
|
||||
|
||||
/// Models 관리 Repository 구현체
|
||||
/// 모델 정보 CRUD 작업을 처리하며 도메인 모델과 API DTO 간 변환을 담당
|
||||
@Injectable(as: ModelRepository)
|
||||
class ModelRepositoryImpl implements ModelRepository {
|
||||
final ModelRemoteDataSource remoteDataSource;
|
||||
|
||||
ModelRepositoryImpl({required this.remoteDataSource});
|
||||
|
||||
@override
|
||||
Future<Either<Failure, ModelListDto>> getModels({
|
||||
int? page,
|
||||
int? perPage,
|
||||
String? search,
|
||||
int? vendorId,
|
||||
bool? includeDeleted,
|
||||
}) async {
|
||||
try {
|
||||
final result = await remoteDataSource.getModels(
|
||||
page: page ?? 1,
|
||||
perPage: perPage ?? 10,
|
||||
search: search,
|
||||
vendorId: vendorId,
|
||||
includeDeleted: includeDeleted ?? false,
|
||||
);
|
||||
|
||||
return Right(result);
|
||||
} on ServerException catch (e) {
|
||||
return Left(ServerFailure(message: e.message));
|
||||
} catch (e) {
|
||||
return Left(ServerFailure(message: '모델 목록 조회 실패: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, ModelDto>> getModelDetail(int id) async {
|
||||
try {
|
||||
final result = await remoteDataSource.getModelDetail(id);
|
||||
return Right(result);
|
||||
} on ServerException catch (e) {
|
||||
return Left(ServerFailure(message: e.message));
|
||||
} catch (e) {
|
||||
return Left(ServerFailure(message: '모델 상세 조회 실패: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, ModelDto>> createModel(CreateModelRequest request) async {
|
||||
try {
|
||||
final result = await remoteDataSource.createModel(request);
|
||||
return Right(result);
|
||||
} on ServerException catch (e) {
|
||||
return Left(ServerFailure(message: e.message));
|
||||
} catch (e) {
|
||||
return Left(ServerFailure(message: '모델 생성 실패: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, ModelDto>> updateModel(int id, UpdateModelRequest request) async {
|
||||
try {
|
||||
final result = await remoteDataSource.updateModel(id, request);
|
||||
return Right(result);
|
||||
} on ServerException catch (e) {
|
||||
return Left(ServerFailure(message: e.message));
|
||||
} catch (e) {
|
||||
return Left(ServerFailure(message: '모델 수정 실패: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, void>> deleteModel(int id) async {
|
||||
try {
|
||||
await remoteDataSource.deleteModel(id);
|
||||
return const Right(null);
|
||||
} on ServerException catch (e) {
|
||||
return Left(ServerFailure(message: e.message));
|
||||
} catch (e) {
|
||||
return Left(ServerFailure(message: '모델 삭제 실패: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, ModelDto>> restoreModel(int id) async {
|
||||
try {
|
||||
final result = await remoteDataSource.restoreModel(id);
|
||||
return Right(result);
|
||||
} on ServerException catch (e) {
|
||||
return Left(ServerFailure(message: e.message));
|
||||
} catch (e) {
|
||||
return Left(ServerFailure(message: '모델 복구 실패: $e'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, List<ModelDto>>> getModelsByVendor(int vendorId) async {
|
||||
try {
|
||||
final result = await remoteDataSource.getModelsByVendor(vendorId);
|
||||
return Right(result);
|
||||
} on ServerException catch (e) {
|
||||
return Left(ServerFailure(message: e.message));
|
||||
} catch (e) {
|
||||
return Left(ServerFailure(message: '제조사별 모델 조회 실패: $e'));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import '../../core/constants/api_endpoints.dart';
|
||||
import '../../core/constants/app_constants.dart';
|
||||
import '../../core/errors/exceptions.dart';
|
||||
import '../../domain/repositories/rent_repository.dart';
|
||||
import '../models/rent_dto.dart';
|
||||
@@ -14,27 +15,37 @@ class RentRepositoryImpl implements RentRepository {
|
||||
@override
|
||||
Future<RentListResponse> getRents({
|
||||
int page = 1,
|
||||
int pageSize = 10,
|
||||
String? search,
|
||||
String? status,
|
||||
int? equipmentHistoryId,
|
||||
int perPage = AppConstants.rentPageSize,
|
||||
int? equipmentId,
|
||||
int? companyId,
|
||||
bool? isActive,
|
||||
DateTime? dateFrom,
|
||||
DateTime? dateTo,
|
||||
}) async {
|
||||
try {
|
||||
final queryParameters = <String, dynamic>{
|
||||
'page': page,
|
||||
'page_size': pageSize,
|
||||
'per_page': perPage,
|
||||
};
|
||||
|
||||
if (search != null && search.isNotEmpty) {
|
||||
queryParameters['search'] = search;
|
||||
if (equipmentId != null) {
|
||||
queryParameters['equipment_id'] = equipmentId;
|
||||
}
|
||||
|
||||
if (status != null && status.isNotEmpty) {
|
||||
queryParameters['status'] = status;
|
||||
if (companyId != null) {
|
||||
queryParameters['company_id'] = companyId;
|
||||
}
|
||||
|
||||
if (equipmentHistoryId != null) {
|
||||
queryParameters['equipment_history_id'] = equipmentHistoryId;
|
||||
if (isActive != null) {
|
||||
queryParameters['is_active'] = isActive;
|
||||
}
|
||||
|
||||
if (dateFrom != null) {
|
||||
queryParameters['date_from'] = dateFrom.toIso8601String().split('T')[0];
|
||||
}
|
||||
|
||||
if (dateTo != null) {
|
||||
queryParameters['date_to'] = dateTo.toIso8601String().split('T')[0];
|
||||
}
|
||||
|
||||
final response = await dio.get(
|
||||
@@ -103,34 +114,40 @@ class RentRepositoryImpl implements RentRepository {
|
||||
}
|
||||
}
|
||||
|
||||
Future<RentListResponse> getActiveRents({
|
||||
int page = 1,
|
||||
int pageSize = 10,
|
||||
}) async {
|
||||
// 백엔드 호환: status 필터로 진행 중인 임대 조회
|
||||
return getRents(
|
||||
page: page,
|
||||
pageSize: pageSize,
|
||||
status: 'active',
|
||||
);
|
||||
@override
|
||||
Future<List<RentDto>> getActiveRents() async {
|
||||
try {
|
||||
final response = await dio.get('${ApiEndpoints.rents}/active');
|
||||
|
||||
// Backend returns List<RentDto> directly for /active endpoint
|
||||
final List<dynamic> dataList = response.data as List<dynamic>;
|
||||
return dataList.map((json) => RentDto.fromJson(json)).toList();
|
||||
} on DioException catch (e) {
|
||||
throw ServerException(message: _handleError(e));
|
||||
} catch (e) {
|
||||
throw ServerException(message: '진행중인 임대를 가져오는 중 오류가 발생했습니다: $e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<RentListResponse> getOverdueRents({
|
||||
Future<List<RentDto>> getOverdueRents({
|
||||
int page = 1,
|
||||
int pageSize = 10,
|
||||
int perPage = AppConstants.rentPageSize,
|
||||
}) async {
|
||||
// 백엔드 호환: status 필터로 연체된 임대 조회
|
||||
return getRents(
|
||||
page: page,
|
||||
pageSize: pageSize,
|
||||
status: 'overdue',
|
||||
// 백엔드 호환: 비활성 임대 중 만료일이 과거인 것들
|
||||
final response = await getRents(
|
||||
page: page,
|
||||
perPage: perPage,
|
||||
isActive: false, // 비활성 임대
|
||||
dateTo: DateTime.now(), // 오늘까지의 날짜
|
||||
);
|
||||
|
||||
return response.items;
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> getRentStats() async {
|
||||
try {
|
||||
// 백엔드 호환: 클라이언트 측에서 통계 계산
|
||||
final allRents = await getRents(pageSize: 1000); // 충분히 큰 페이지 사이즈
|
||||
final allRents = await getRents(perPage: AppConstants.maxBulkPageSize); // 충분히 큰 페이지 사이즈
|
||||
|
||||
int totalRents = allRents.totalCount ?? 0;
|
||||
int activeRents = 0;
|
||||
@@ -159,23 +176,7 @@ class RentRepositoryImpl implements RentRepository {
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<RentDto> returnRent(int id, String returnDate) async {
|
||||
try {
|
||||
final response = await dio.put(
|
||||
'${ApiEndpoints.rents}/$id',
|
||||
data: {
|
||||
'actual_return_date': returnDate,
|
||||
'status': 'returned',
|
||||
},
|
||||
);
|
||||
return RentDto.fromJson(response.data);
|
||||
} on DioException catch (e) {
|
||||
throw ServerException(message: _handleError(e));
|
||||
} catch (e) {
|
||||
throw ServerException(message: '장비 반납 처리 중 오류가 발생했습니다: $e');
|
||||
}
|
||||
}
|
||||
// returnRent() 메서드 제거 - 백엔드에 해당 API 엔드포인트 없음
|
||||
|
||||
// 에러 처리 메서드
|
||||
String _handleError(DioException e) {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import '../../core/constants/app_constants.dart';
|
||||
import '../models/rent_dto.dart';
|
||||
import '../../domain/repositories/rent_repository.dart';
|
||||
|
||||
@@ -11,18 +12,22 @@ class RentRepositoryImpl implements RentRepository {
|
||||
@override
|
||||
Future<RentListResponse> getRents({
|
||||
int page = 1,
|
||||
int pageSize = 10,
|
||||
String? search,
|
||||
String? status,
|
||||
int? equipmentHistoryId,
|
||||
int perPage = AppConstants.rentPageSize,
|
||||
int? equipmentId,
|
||||
int? companyId,
|
||||
bool? isActive,
|
||||
DateTime? dateFrom,
|
||||
DateTime? dateTo,
|
||||
}) async {
|
||||
try {
|
||||
final queryParams = {
|
||||
'page': page,
|
||||
'page_size': pageSize,
|
||||
if (search != null) 'search': search,
|
||||
if (status != null) 'status': status,
|
||||
if (equipmentHistoryId != null) 'equipment_history_id': equipmentHistoryId,
|
||||
'per_page': perPage,
|
||||
if (equipmentId != null) 'equipment_id': equipmentId,
|
||||
if (companyId != null) 'company_id': companyId,
|
||||
if (isActive != null) 'is_active': isActive,
|
||||
if (dateFrom != null) 'date_from': dateFrom.toIso8601String().split('T')[0],
|
||||
if (dateTo != null) 'date_to': dateTo.toIso8601String().split('T')[0],
|
||||
};
|
||||
|
||||
final response = await _dio.get(
|
||||
@@ -85,14 +90,13 @@ class RentRepositoryImpl implements RentRepository {
|
||||
|
||||
|
||||
@override
|
||||
Future<RentDto> returnRent(int id, String returnDate) async {
|
||||
Future<List<RentDto>> getActiveRents() async {
|
||||
try {
|
||||
final response = await _dio.patch(
|
||||
'$_baseEndpoint/$id/return',
|
||||
data: {'return_date': returnDate},
|
||||
);
|
||||
|
||||
return RentDto.fromJson(response.data);
|
||||
final response = await _dio.get('$_baseEndpoint/active');
|
||||
|
||||
// Backend returns List<RentDto> directly for /active endpoint
|
||||
final List<dynamic> dataList = response.data as List<dynamic>;
|
||||
return dataList.map((json) => RentDto.fromJson(json)).toList();
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import '../../core/constants/app_constants.dart';
|
||||
import '../../core/errors/failures.dart';
|
||||
import '../../core/errors/exceptions.dart';
|
||||
import '../../domain/repositories/user_repository.dart';
|
||||
@@ -28,7 +29,7 @@ class UserRepositoryImpl implements UserRepository {
|
||||
try {
|
||||
final result = await _remoteDataSource.getUsers(
|
||||
page: page ?? 1,
|
||||
perPage: perPage ?? 20,
|
||||
perPage: perPage ?? AppConstants.userPageSize,
|
||||
isActive: isActive,
|
||||
role: role?.name, // UserRole enum을 문자열로 변환
|
||||
);
|
||||
|
||||
@@ -3,12 +3,12 @@ import 'package:injectable/injectable.dart';
|
||||
import 'package:superport/core/constants/api_endpoints.dart';
|
||||
import 'package:superport/data/datasources/remote/api_client.dart';
|
||||
import 'package:superport/data/models/vendor_dto.dart';
|
||||
import 'package:superport/utils/constants.dart';
|
||||
import 'package:superport/core/constants/app_constants.dart';
|
||||
|
||||
abstract class VendorRepository {
|
||||
Future<VendorListResponse> getAll({
|
||||
int page = 1,
|
||||
int limit = PaginationConstants.defaultPageSize,
|
||||
int limit = AppConstants.vendorPageSize,
|
||||
String? search,
|
||||
bool? isActive,
|
||||
});
|
||||
@@ -28,7 +28,7 @@ class VendorRepositoryImpl implements VendorRepository {
|
||||
@override
|
||||
Future<VendorListResponse> getAll({
|
||||
int page = 1,
|
||||
int limit = PaginationConstants.defaultPageSize,
|
||||
int limit = AppConstants.vendorPageSize,
|
||||
String? search,
|
||||
bool? isActive,
|
||||
}) async {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import '../../core/constants/app_constants.dart';
|
||||
import '../../core/errors/failures.dart';
|
||||
import '../../domain/repositories/warehouse_location_repository.dart';
|
||||
import '../../models/warehouse_location_model.dart';
|
||||
@@ -29,7 +30,7 @@ class WarehouseLocationRepositoryImpl implements WarehouseLocationRepository {
|
||||
try {
|
||||
final result = await remoteDataSource.getWarehouseLocations(
|
||||
page: page ?? 1,
|
||||
perPage: limit ?? 20,
|
||||
perPage: limit ?? AppConstants.warehousePageSize,
|
||||
search: search,
|
||||
filters: {
|
||||
if (locationType != null) 'location_type': locationType,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:superport/core/constants/api_endpoints.dart';
|
||||
import 'package:superport/core/constants/app_constants.dart';
|
||||
import 'package:superport/data/datasources/remote/api_client.dart';
|
||||
import 'package:superport/data/models/zipcode_dto.dart';
|
||||
|
||||
@@ -8,20 +9,17 @@ abstract class ZipcodeRepository {
|
||||
/// 우편번호 검색 (페이지네이션 지원)
|
||||
Future<ZipcodeListResponse> search({
|
||||
int page = 1,
|
||||
int limit = 20,
|
||||
int limit = AppConstants.defaultPageSize,
|
||||
String? search,
|
||||
String? sido,
|
||||
String? gu,
|
||||
});
|
||||
|
||||
/// 우편번호로 정확한 주소 조회
|
||||
Future<ZipcodeDto?> getByZipcode(int zipcode);
|
||||
|
||||
/// 시도별 구 목록 조회
|
||||
Future<List<String>> getGuBySido(String sido);
|
||||
|
||||
/// 전체 시도 목록 조회
|
||||
Future<List<String>> getAllSido();
|
||||
|
||||
/// Hierarchy API - 시도 목록 조회
|
||||
Future<HierarchyResponse> getHierarchySidos();
|
||||
|
||||
/// Hierarchy API - 특정 시도의 구/군 목록 조회
|
||||
Future<HierarchyResponse> getHierarchyGusBySido(String sido);
|
||||
}
|
||||
|
||||
@Injectable(as: ZipcodeRepository)
|
||||
@@ -33,7 +31,7 @@ class ZipcodeRepositoryImpl implements ZipcodeRepository {
|
||||
@override
|
||||
Future<ZipcodeListResponse> search({
|
||||
int page = 1,
|
||||
int limit = 20,
|
||||
int limit = AppConstants.defaultPageSize,
|
||||
String? search,
|
||||
String? sido,
|
||||
String? gu,
|
||||
@@ -82,111 +80,43 @@ class ZipcodeRepositoryImpl implements ZipcodeRepository {
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<ZipcodeDto?> getByZipcode(int zipcode) async {
|
||||
try {
|
||||
final response = await _apiClient.dio.get(
|
||||
ApiEndpoints.zipcodes,
|
||||
queryParameters: {
|
||||
'zipcode': zipcode,
|
||||
'limit': 1,
|
||||
},
|
||||
);
|
||||
|
||||
if (response.data is Map<String, dynamic>) {
|
||||
final listResponse = ZipcodeListResponse.fromJson(response.data);
|
||||
return listResponse.items.isNotEmpty ? listResponse.items.first : null;
|
||||
}
|
||||
|
||||
return null;
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getGuBySido(String sido) async {
|
||||
Future<HierarchyResponse> getHierarchySidos() async {
|
||||
try {
|
||||
final response = await _apiClient.dio.get(
|
||||
ApiEndpoints.zipcodes,
|
||||
queryParameters: {
|
||||
'page': 1,
|
||||
'sido': sido,
|
||||
'limit': 1000, // 충분히 큰 값으로 모든 구 가져오기
|
||||
},
|
||||
ApiEndpoints.zipcodeHierarchySidos,
|
||||
);
|
||||
|
||||
if (response.data is Map<String, dynamic>) {
|
||||
final listResponse = ZipcodeListResponse.fromJson(response.data);
|
||||
|
||||
// 중복 제거하고 구 목록만 추출
|
||||
final guSet = <String>{};
|
||||
for (final zipcode in listResponse.items) {
|
||||
guSet.add(zipcode.gu);
|
||||
}
|
||||
|
||||
final guList = guSet.toList()..sort();
|
||||
return guList;
|
||||
}
|
||||
|
||||
return [];
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getAllSido() async {
|
||||
try {
|
||||
final response = await _apiClient.dio.get(
|
||||
ApiEndpoints.zipcodes,
|
||||
queryParameters: {
|
||||
'page': 1,
|
||||
'limit': 1000, // 충분히 큰 값으로 모든 시도 가져오기
|
||||
},
|
||||
);
|
||||
|
||||
print('=== getAllSido API 응답 ===');
|
||||
print('Status Code: ${response.statusCode}');
|
||||
print('Response Type: ${response.data.runtimeType}');
|
||||
|
||||
if (response.data is Map<String, dynamic>) {
|
||||
print('Response Data Keys: ${(response.data as Map).keys.toList()}');
|
||||
final listResponse = ZipcodeListResponse.fromJson(response.data);
|
||||
print('총 우편번호 데이터 개수: ${listResponse.items.length}');
|
||||
print('전체 카운트: ${listResponse.totalCount}');
|
||||
print('현재 페이지: ${listResponse.currentPage}');
|
||||
print('총 페이지: ${listResponse.totalPages}');
|
||||
|
||||
// 첫 3개 아이템 출력
|
||||
if (listResponse.items.isNotEmpty) {
|
||||
print('첫 3개 우편번호 데이터:');
|
||||
for (int i = 0; i < 3 && i < listResponse.items.length; i++) {
|
||||
final item = listResponse.items[i];
|
||||
print(' [$i] 우편번호: ${item.zipcode}, 시도: "${item.sido}", 구: "${item.gu}", 기타: "${item.etc}"');
|
||||
}
|
||||
}
|
||||
|
||||
// 중복 제거하고 시도 목록만 추출
|
||||
final sidoSet = <String>{};
|
||||
for (final zipcode in listResponse.items) {
|
||||
sidoSet.add(zipcode.sido);
|
||||
}
|
||||
|
||||
final sidoList = sidoSet.toList()..sort();
|
||||
print('추출된 시도 목록: $sidoList');
|
||||
print('시도 개수: ${sidoList.length}');
|
||||
return sidoList;
|
||||
return HierarchyResponse.fromJson(response.data);
|
||||
} else {
|
||||
throw Exception('예상치 못한 응답 형식입니다.');
|
||||
}
|
||||
|
||||
print('예상치 못한 응답 형식');
|
||||
return [];
|
||||
} on DioException catch (e) {
|
||||
print('getAllSido API 오류: ${e.message}');
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<HierarchyResponse> getHierarchyGusBySido(String sido) async {
|
||||
try {
|
||||
final response = await _apiClient.dio.get(
|
||||
ApiEndpoints.zipcodeHierarchyGus,
|
||||
queryParameters: {'sido': sido},
|
||||
);
|
||||
|
||||
if (response.data is Map<String, dynamic>) {
|
||||
return HierarchyResponse.fromJson(response.data);
|
||||
} else {
|
||||
throw Exception('예상치 못한 응답 형식입니다.');
|
||||
}
|
||||
} on DioException catch (e) {
|
||||
throw _handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Exception _handleError(DioException e) {
|
||||
switch (e.type) {
|
||||
case DioExceptionType.connectionTimeout:
|
||||
|
||||
Reference in New Issue
Block a user