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,4 +1,5 @@
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:superport/core/constants/app_constants.dart';
|
||||
import 'package:superport/data/datasources/remote/administrator_remote_datasource.dart';
|
||||
import 'package:superport/data/models/administrator_dto.dart';
|
||||
|
||||
@@ -13,7 +14,7 @@ class AdministratorService {
|
||||
/// 관리자 목록 조회 (페이지네이션 지원)
|
||||
Future<AdministratorListResponse> getAdministrators({
|
||||
int page = 1,
|
||||
int pageSize = 20,
|
||||
int pageSize = AppConstants.adminPageSize,
|
||||
String? search,
|
||||
}) async {
|
||||
try {
|
||||
@@ -141,7 +142,7 @@ class AdministratorService {
|
||||
/// 이메일로 관리자 검색 (단일 결과 기대)
|
||||
Future<AdministratorDto?> findAdministratorByEmail(String email) async {
|
||||
try {
|
||||
final response = await getAdministrators(search: email, pageSize: 10);
|
||||
final response = await getAdministrators(search: email, pageSize: AppConstants.adminPageSize);
|
||||
|
||||
// 정확히 일치하는 이메일 찾기
|
||||
final exactMatch = response.items.where((admin) =>
|
||||
|
||||
@@ -14,6 +14,8 @@ import 'package:superport/data/models/auth/login_response.dart';
|
||||
import 'package:superport/data/models/auth/logout_request.dart';
|
||||
import 'package:superport/data/models/auth/refresh_token_request.dart';
|
||||
import 'package:superport/data/models/auth/token_response.dart';
|
||||
import 'package:superport/data/models/auth/change_password_request.dart';
|
||||
import 'package:superport/data/models/auth/message_response.dart';
|
||||
|
||||
abstract class AuthService {
|
||||
Future<Either<Failure, LoginResponse>> login(LoginRequest request);
|
||||
@@ -21,6 +23,11 @@ abstract class AuthService {
|
||||
Future<Either<Failure, TokenResponse>> refreshToken();
|
||||
Future<bool> isLoggedIn();
|
||||
Future<AuthUser?> getCurrentUser();
|
||||
Future<Either<Failure, AuthUser>> getCurrentAdminFromServer();
|
||||
Future<Either<Failure, MessageResponse>> changePassword({
|
||||
required String oldPassword,
|
||||
required String newPassword,
|
||||
});
|
||||
Future<String?> getAccessToken();
|
||||
Future<String?> getRefreshToken();
|
||||
Future<void> clearSession();
|
||||
@@ -241,6 +248,62 @@ class AuthServiceImpl implements AuthService {
|
||||
await _secureStorage.write(key: _userKey, value: userJson);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, AuthUser>> getCurrentAdminFromServer() async {
|
||||
try {
|
||||
debugPrint('[AuthService] getCurrentAdminFromServer 시작');
|
||||
|
||||
final result = await _authRemoteDataSource.getCurrentAdmin();
|
||||
|
||||
return result.fold(
|
||||
(failure) {
|
||||
debugPrint('[AuthService] getCurrentAdminFromServer 실패: ${failure.message}');
|
||||
return Left(failure);
|
||||
},
|
||||
(authUser) {
|
||||
debugPrint('[AuthService] getCurrentAdminFromServer 성공: ${authUser.name} (${authUser.email})');
|
||||
return Right(authUser);
|
||||
},
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
debugPrint('[AuthService] getCurrentAdminFromServer 예외 발생: $e');
|
||||
debugPrint('[AuthService] Stack trace: $stackTrace');
|
||||
return Left(ServerFailure(message: '관리자 정보 조회 중 오류가 발생했습니다.'));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Either<Failure, MessageResponse>> changePassword({
|
||||
required String oldPassword,
|
||||
required String newPassword,
|
||||
}) async {
|
||||
try {
|
||||
debugPrint('[AuthService] changePassword 시작');
|
||||
|
||||
final request = ChangePasswordRequest(
|
||||
oldPassword: oldPassword,
|
||||
newPassword: newPassword,
|
||||
);
|
||||
|
||||
final result = await _authRemoteDataSource.changePassword(request);
|
||||
|
||||
return result.fold(
|
||||
(failure) {
|
||||
debugPrint('[AuthService] changePassword 실패: ${failure.message}');
|
||||
return Left(failure);
|
||||
},
|
||||
(messageResponse) {
|
||||
debugPrint('[AuthService] changePassword 성공: ${messageResponse.message}');
|
||||
return Right(messageResponse);
|
||||
},
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
debugPrint('[AuthService] changePassword 예외 발생: $e');
|
||||
debugPrint('[AuthService] Stack trace: $stackTrace');
|
||||
return Left(ServerFailure(message: '비밀번호 변경 중 오류가 발생했습니다.'));
|
||||
}
|
||||
}
|
||||
|
||||
void dispose() {
|
||||
_authStateController.close();
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:superport/core/constants/app_constants.dart';
|
||||
import 'package:superport/core/errors/exceptions.dart';
|
||||
import 'package:superport/core/errors/failures.dart';
|
||||
import 'package:superport/data/datasources/remote/company_remote_datasource.dart';
|
||||
@@ -21,17 +22,23 @@ class CompanyService {
|
||||
// 회사 목록 조회
|
||||
Future<PaginatedResponse<Company>> getCompanies({
|
||||
int page = 1,
|
||||
int perPage = 20,
|
||||
int perPage = AppConstants.companyPageSize,
|
||||
String? search,
|
||||
bool? isActive,
|
||||
bool includeInactive = false,
|
||||
}) async {
|
||||
try {
|
||||
// 🔧 백엔드 버그 우회: 검색 시에는 is_active 파라미터 제거
|
||||
// search + is_active 조합에서 빈 결과 반환 버그 존재
|
||||
final effectiveIsActive = search != null && search.isNotEmpty
|
||||
? null // 검색 시에는 is_active 필터 제거
|
||||
: (isActive ?? !includeInactive); // 일반 목록 조회는 기존 로직 유지
|
||||
|
||||
final response = await _remoteDataSource.getCompanies(
|
||||
page: page,
|
||||
perPage: perPage,
|
||||
search: search,
|
||||
isActive: isActive ?? !includeInactive,
|
||||
isActive: effectiveIsActive,
|
||||
);
|
||||
|
||||
return PaginatedResponse<Company>(
|
||||
|
||||
123
lib/services/equipment_history_service.dart
Normal file
123
lib/services/equipment_history_service.dart
Normal file
@@ -0,0 +1,123 @@
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:superport/core/errors/exceptions.dart';
|
||||
import 'package:superport/core/errors/failures.dart';
|
||||
import 'package:superport/data/models/equipment_history_dto.dart';
|
||||
import 'package:superport/data/models/stock_status_dto.dart';
|
||||
import 'package:superport/data/repositories/equipment_history_repository.dart';
|
||||
|
||||
/// Equipment History Service - 입출고 및 재고 관리 비즈니스 로직 담당
|
||||
class EquipmentHistoryService {
|
||||
final EquipmentHistoryRepository _repository = GetIt.instance<EquipmentHistoryRepository>();
|
||||
|
||||
/// 재고 현황 조회 (핵심 기능)
|
||||
Future<List<StockStatusDto>> getStockStatus() async {
|
||||
try {
|
||||
return await _repository.getStockStatus();
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(message: e.message);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: 'Failed to fetch stock status: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 장비별 이력 조회
|
||||
Future<List<EquipmentHistoryDto>> getEquipmentHistoriesByEquipmentId(int equipmentId) async {
|
||||
try {
|
||||
return await _repository.getEquipmentHistoriesByEquipmentId(equipmentId);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(message: e.message);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: 'Failed to fetch equipment histories: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 입고 처리
|
||||
Future<EquipmentHistoryDto> createStockIn({
|
||||
required int equipmentsId,
|
||||
required int warehousesId,
|
||||
required int quantity,
|
||||
DateTime? transactedAt,
|
||||
String? remark,
|
||||
}) async {
|
||||
try {
|
||||
return await _repository.createStockIn(
|
||||
equipmentsId: equipmentsId,
|
||||
warehousesId: warehousesId,
|
||||
quantity: quantity,
|
||||
transactedAt: transactedAt,
|
||||
remark: remark,
|
||||
);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(message: e.message);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: 'Failed to create stock in: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 출고 처리
|
||||
Future<EquipmentHistoryDto> createStockOut({
|
||||
required int equipmentsId,
|
||||
required int warehousesId,
|
||||
required int quantity,
|
||||
DateTime? transactedAt,
|
||||
String? remark,
|
||||
}) async {
|
||||
try {
|
||||
return await _repository.createStockOut(
|
||||
equipmentsId: equipmentsId,
|
||||
warehousesId: warehousesId,
|
||||
quantity: quantity,
|
||||
transactedAt: transactedAt,
|
||||
remark: remark,
|
||||
);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(message: e.message);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: 'Failed to create stock out: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 장비 이력 생성 (범용)
|
||||
Future<EquipmentHistoryDto> createEquipmentHistory(EquipmentHistoryRequestDto request) async {
|
||||
try {
|
||||
return await _repository.createEquipmentHistory(request);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(message: e.message);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: 'Failed to create equipment history: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 장비 이력 수정
|
||||
Future<EquipmentHistoryDto> updateEquipmentHistory(int id, EquipmentHistoryUpdateRequestDto request) async {
|
||||
try {
|
||||
return await _repository.updateEquipmentHistory(id, request);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(message: e.message);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: 'Failed to update equipment history: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 장비 이력 삭제
|
||||
Future<void> deleteEquipmentHistory(int id) async {
|
||||
try {
|
||||
await _repository.deleteEquipmentHistory(id);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(message: e.message);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: 'Failed to delete equipment history: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 장비 이력 상세 조회
|
||||
Future<EquipmentHistoryDto> getEquipmentHistoryById(int id) async {
|
||||
try {
|
||||
return await _repository.getEquipmentHistoryById(id);
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(message: e.message);
|
||||
} catch (e) {
|
||||
throw ServerFailure(message: 'Failed to fetch equipment history detail: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,29 @@
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:superport/core/constants/app_constants.dart';
|
||||
import 'package:superport/core/errors/exceptions.dart';
|
||||
import 'package:superport/core/errors/failures.dart';
|
||||
import 'package:superport/data/datasources/remote/equipment_remote_datasource.dart';
|
||||
import 'package:superport/data/models/common/paginated_response.dart';
|
||||
import 'package:superport/data/models/equipment/equipment_dto.dart';
|
||||
import 'package:superport/data/repositories/equipment_history_repository.dart';
|
||||
|
||||
class EquipmentService {
|
||||
final EquipmentRemoteDataSource _remoteDataSource = GetIt.instance<EquipmentRemoteDataSource>();
|
||||
final EquipmentHistoryRepository _historyRepository = GetIt.instance<EquipmentHistoryRepository>();
|
||||
|
||||
// 장비 목록 조회 (간단한 버전)
|
||||
Future<PaginatedResponse<EquipmentDto>> getEquipments({
|
||||
int page = 1,
|
||||
int perPage = 20,
|
||||
int perPage = AppConstants.equipmentPageSize,
|
||||
String? search,
|
||||
int? companyId,
|
||||
}) async {
|
||||
try {
|
||||
final response = await _remoteDataSource.getEquipments(
|
||||
page: page,
|
||||
perPage: perPage,
|
||||
search: search,
|
||||
companyId: companyId,
|
||||
);
|
||||
|
||||
return PaginatedResponse<EquipmentDto>(
|
||||
@@ -84,15 +89,17 @@ class EquipmentService {
|
||||
// 상태별 장비 조회
|
||||
Future<PaginatedResponse<EquipmentDto>> getEquipmentsWithStatus({
|
||||
int page = 1,
|
||||
int perPage = 20,
|
||||
int perPage = AppConstants.equipmentPageSize,
|
||||
String? search,
|
||||
String? status,
|
||||
int? companyId,
|
||||
}) async {
|
||||
try {
|
||||
final response = await _remoteDataSource.getEquipments(
|
||||
page: page,
|
||||
perPage: perPage,
|
||||
search: search,
|
||||
companyId: companyId,
|
||||
);
|
||||
|
||||
// 간단한 상태 필터링 (백엔드에서 지원하지 않는 경우 클라이언트 측에서)
|
||||
@@ -143,9 +150,9 @@ class EquipmentService {
|
||||
// 장비 이력 조회
|
||||
Future<List<dynamic>> getEquipmentHistory(int equipmentId, {int? page, int? perPage}) async {
|
||||
try {
|
||||
// 장비 이력은 EquipmentHistoryService나 별도 서비스에서 처리해야 하지만
|
||||
// 호환성을 위해 빈 리스트 반환
|
||||
return [];
|
||||
// 실제 EquipmentHistoryRepository를 통한 API 호출
|
||||
final histories = await _historyRepository.getEquipmentHistoriesByEquipmentId(equipmentId);
|
||||
return histories;
|
||||
} on ServerException catch (e) {
|
||||
throw ServerFailure(message: e.message);
|
||||
} catch (e) {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:superport/core/constants/app_constants.dart';
|
||||
import 'package:superport/services/auth_service.dart';
|
||||
import 'package:superport/services/equipment_service.dart';
|
||||
import 'package:superport/services/warehouse_service.dart';
|
||||
@@ -37,7 +38,7 @@ class HealthTestService {
|
||||
try {
|
||||
DebugLogger.log('장비 API 체크 시작', tag: 'HEALTH_TEST');
|
||||
|
||||
final equipments = await _equipmentService.getEquipments(page: 1, perPage: 5);
|
||||
final equipments = await _equipmentService.getEquipments(page: 1, perPage: AppConstants.smallPageSize);
|
||||
results['equipments'] = {
|
||||
'success': true,
|
||||
'count': equipments.items.length,
|
||||
@@ -102,7 +103,7 @@ class HealthTestService {
|
||||
switch (endpoint) {
|
||||
case 'equipments':
|
||||
try {
|
||||
final equipments = await _equipmentService.getEquipments(page: 1, perPage: 10);
|
||||
final equipments = await _equipmentService.getEquipments(page: 1, perPage: AppConstants.defaultPageSize);
|
||||
return {
|
||||
'success': true,
|
||||
'count': equipments.items.length,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:superport/core/constants/app_constants.dart';
|
||||
import 'package:superport/data/datasources/remote/user_remote_datasource.dart';
|
||||
import 'package:superport/data/models/common/paginated_response.dart';
|
||||
import 'package:superport/data/models/user/user_dto.dart';
|
||||
@@ -13,7 +14,7 @@ class UserService {
|
||||
/// 사용자 목록 조회 (레거시 메서드 - 사용 중단됨)
|
||||
Future<PaginatedResponse<User>> getUsers({
|
||||
int page = 1,
|
||||
int perPage = 20,
|
||||
int perPage = AppConstants.userPageSize,
|
||||
bool? isActive,
|
||||
int? companyId,
|
||||
String? role,
|
||||
@@ -30,7 +31,7 @@ class UserService {
|
||||
return PaginatedResponse<User>(
|
||||
items: response.items.map((dto) => _userDtoToModel(dto)).toList(),
|
||||
page: response.currentPage,
|
||||
size: response.pageSize ?? 20,
|
||||
size: response.pageSize ?? AppConstants.userPageSize,
|
||||
totalElements: response.totalCount,
|
||||
totalPages: response.totalPages,
|
||||
first: response.currentPage == 1,
|
||||
@@ -164,7 +165,7 @@ class UserService {
|
||||
String? status,
|
||||
String? permissionLevel,
|
||||
int page = 1,
|
||||
int perPage = 20,
|
||||
int perPage = AppConstants.userPageSize,
|
||||
}) async {
|
||||
throw UnimplementedError('레거시 메서드 - UserRepository 사용');
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:superport/core/constants/app_constants.dart';
|
||||
import 'package:superport/core/errors/exceptions.dart';
|
||||
import 'package:superport/core/errors/failures.dart';
|
||||
import 'package:superport/data/datasources/remote/warehouse_remote_datasource.dart';
|
||||
@@ -15,7 +16,7 @@ class WarehouseService {
|
||||
// 창고 위치 목록 조회
|
||||
Future<PaginatedResponse<WarehouseLocation>> getWarehouseLocations({
|
||||
int page = 1,
|
||||
int perPage = 20,
|
||||
int perPage = AppConstants.warehousePageSize,
|
||||
bool? isActive,
|
||||
String? search,
|
||||
bool includeInactive = false,
|
||||
@@ -65,7 +66,7 @@ class WarehouseService {
|
||||
try {
|
||||
final request = WarehouseRequestDto(
|
||||
name: location.name,
|
||||
zipcodesZipcode: null, // WarehouseRequestDto에는 zipcodes_zipcode만 있음
|
||||
zipcodesZipcode: location.zipcode, // 우편번호 전달
|
||||
remark: location.remark,
|
||||
);
|
||||
|
||||
@@ -83,7 +84,7 @@ class WarehouseService {
|
||||
try {
|
||||
final request = WarehouseUpdateRequestDto(
|
||||
name: location.name,
|
||||
zipcodesZipcode: null, // WarehouseUpdateRequestDto에는 zipcodes_zipcode만 있음
|
||||
zipcodesZipcode: location.zipcode, // 우편번호 전달
|
||||
remark: location.remark,
|
||||
);
|
||||
|
||||
@@ -111,7 +112,7 @@ class WarehouseService {
|
||||
Future<List<Map<String, dynamic>>> getWarehouseEquipment(
|
||||
int warehouseId, {
|
||||
int page = 1,
|
||||
int perPage = 20,
|
||||
int perPage = AppConstants.warehousePageSize,
|
||||
}) async {
|
||||
try {
|
||||
final response = await _remoteDataSource.getWarehouseEquipment(
|
||||
|
||||
Reference in New Issue
Block a user