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,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) =>

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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