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:
JiWoong Sul
2025-09-02 19:51:40 +09:00
parent 650cd4be55
commit c419f8f458
149 changed files with 12934 additions and 3644 deletions

View File

@@ -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 {

View File

@@ -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

View File

@@ -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'));
}
}
}

View File

@@ -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});
}

View 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: '만료 예정 유지보수 조회 중 오류가 발생했습니다');
}
}
}

View 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'));
}
}
}

View File

@@ -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) {

View File

@@ -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);
}

View File

@@ -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을 문자열로 변환
);

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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: