LCOV - code coverage report
Current view: top level - lib/services - auth_service.dart Coverage Total Hit
Test: lcov.info Lines: 7.1 % 70 5
Test Date: 2025-08-12 03:21:51 Functions: - 0 0

            Line data    Source code
       1              : import 'package:flutter/foundation.dart';
       2              : import 'package:flutter_secure_storage/flutter_secure_storage.dart';
       3              : import 'package:shared_preferences/shared_preferences.dart';
       4              : 
       5              : import '../config/api_config.dart';
       6              : import '../models/user_model.dart';
       7              : import './api_service.dart';
       8              : 
       9              : class AuthService with ChangeNotifier {
      10              :   final FlutterSecureStorage _secureStorage = const FlutterSecureStorage();
      11              :   User? _currentUser;
      12              :   String? _token;
      13              :   bool _isLoading = false;
      14              :   bool _isInitialized = false;
      15              :   final ApiService _apiService = ApiService();
      16              : 
      17            0 :   User? get currentUser => _currentUser;
      18            0 :   String? get token => _token;
      19            2 :   bool get isLoading => _isLoading;
      20            2 :   bool get isAuthenticated => _token != null;
      21            2 :   bool get isInitialized => _isInitialized;
      22              : 
      23              :   // 초기화 함수
      24            1 :   Future<void> initialize() async {
      25            2 :     _token = await _secureStorage.read(key: ApiConfig.tokenKey);
      26            0 :     if (_token != null) {
      27            0 :       await _fetchUserProfile();
      28              :     }
      29            0 :     _isInitialized = true;
      30            0 :     notifyListeners();
      31              :   }
      32              : 
      33              :   // 로그인 함수
      34            0 :   Future<bool> login(String username, String password) async {
      35            0 :     _isLoading = true;
      36            0 :     notifyListeners();
      37              : 
      38              :     try {
      39            0 :       final data = await _apiService.post(
      40              :         ApiConfig.login,
      41            0 :         data: {'username': username, 'password': password},
      42              :       );
      43              : 
      44            0 :       _token = data['token'];
      45            0 :       _currentUser = User.fromJson(data['user']);
      46              : 
      47              :       // 토큰 저장
      48            0 :       await _secureStorage.write(key: ApiConfig.tokenKey, value: _token);
      49              : 
      50              :       // API 서비스에 토큰 설정
      51            0 :       _apiService.setToken(_token!);
      52              : 
      53              :       // 사용자 ID와 역할 저장
      54            0 :       final prefs = await SharedPreferences.getInstance();
      55            0 :       await prefs.setString(ApiConfig.userIdKey, _currentUser!.id);
      56            0 :       await prefs.setString(ApiConfig.userRoleKey, _currentUser!.role);
      57              : 
      58              :       // 클럽 ID가 있으면 저장
      59            0 :       if (_currentUser!.clubId != null) {
      60            0 :         await prefs.setString(ApiConfig.clubIdKey, _currentUser!.clubId!);
      61              :       }
      62              : 
      63            0 :       _isLoading = false;
      64            0 :       notifyListeners();
      65              :       return true;
      66              :     } catch (e) {
      67            0 :       _isLoading = false;
      68            0 :       notifyListeners();
      69              :       return false;
      70              :     }
      71              :   }
      72              : 
      73              :   // 로그아웃 함수
      74            0 :   Future<void> logout() async {
      75            0 :     _token = null;
      76            0 :     _currentUser = null;
      77              : 
      78              :     // 저장된 데이터 삭제
      79            0 :     await _secureStorage.delete(key: ApiConfig.tokenKey);
      80              : 
      81            0 :     final prefs = await SharedPreferences.getInstance();
      82            0 :     await prefs.remove(ApiConfig.userIdKey);
      83            0 :     await prefs.remove(ApiConfig.userRoleKey);
      84            0 :     await prefs.remove(ApiConfig.clubIdKey);
      85              : 
      86            0 :     notifyListeners();
      87              :   }
      88              : 
      89              :   // 사용자 프로필 정보 가져오기
      90            0 :   Future<void> _fetchUserProfile() async {
      91            0 :     if (_token == null) {
      92            0 :       print('프로필 정보 가져오기 실패: 토큰이 없음');
      93              :       return;
      94              :     }
      95              : 
      96              :     try {
      97            0 :       print('프로필 정보 요청 시작: ${ApiConfig.profile}');
      98            0 :       _apiService.setToken(_token!);
      99            0 :       final data = await _apiService.get(ApiConfig.profile);
     100            0 :       print('프로필 API 응답: $data');
     101              : 
     102              :       if (data != null) {
     103              :         try {
     104            0 :           _currentUser = User.fromJson(data);
     105            0 :           print('프로필 정보 파싱 성공: ${_currentUser?.name}');
     106            0 :           notifyListeners();
     107              :         } catch (e) {
     108            0 :           print('프로필 정보 파싱 오류: $e');
     109            0 :           print('파싱 실패한 데이터: $data');
     110              :         }
     111              :       } else {
     112            0 :         print('프로필 정보 가져오기 실패: 응답 데이터가 null');
     113              :       }
     114              :     } catch (e) {
     115            0 :       print('프로필 정보 가져오기 오류: $e');
     116              :     }
     117              :   }
     118              : 
     119              :   // 회원가입 함수
     120            0 :   Future<bool> register(String name, String email, String password) async {
     121            0 :     _isLoading = true;
     122            0 :     notifyListeners();
     123              : 
     124              :     try {
     125            0 :       final data = await _apiService.post(
     126              :         ApiConfig.register,
     127            0 :         data: {'name': name, 'email': email, 'password': password},
     128              :       );
     129              : 
     130            0 :       _isLoading = false;
     131            0 :       notifyListeners();
     132              : 
     133              :       if (data != null) {
     134              :         return true;
     135              :       } else {
     136              :         return false;
     137              :       }
     138              :     } catch (e) {
     139            0 :       _isLoading = false;
     140            0 :       notifyListeners();
     141              :       return false;
     142              :     }
     143              :   }
     144              : 
     145              :   // 비밀번호 재설정 이메일 전송 함수
     146            0 :   Future<bool> sendPasswordResetEmail(String email) async {
     147            0 :     _isLoading = true;
     148            0 :     notifyListeners();
     149              : 
     150              :     try {
     151            0 :       final data = await _apiService.post(
     152              :         ApiConfig.forgotPassword,
     153            0 :         data: {'email': email},
     154              :       );
     155              : 
     156            0 :       _isLoading = false;
     157            0 :       notifyListeners();
     158              : 
     159              :       return data != null;
     160              :     } catch (e) {
     161            0 :       _isLoading = false;
     162            0 :       notifyListeners();
     163              :       return false;
     164              :     }
     165              :   }
     166              : }
        

Generated by: LCOV version 2.3.1-1