import 'package:dio/dio.dart'; import '../../../core/config/api_config.dart'; import '../../../core/storage/token_storage.dart'; import '../domain/models/auth_data.dart'; import '../domain/models/login_request.dart'; import '../domain/models/register_request.dart'; import '../domain/models/totp_setup_data.dart'; class AuthApi { final Dio _dio; final TokenStorage _tokenStorage; AuthApi(this._dio, this._tokenStorage); Future register(RegisterRequest request) async { final response = await _dio.post( '${ApiConfig.apiPrefix}/auth/register', data: request.toJson(), ); final data = AuthData.fromJson( (response.data as Map)['data'] as Map, ); await _tokenStorage.saveTokens( accessToken: data.accessToken, sessionToken: data.sessionToken, ); return data; } Future login(LoginRequest request) async { final response = await _dio.post( '${ApiConfig.apiPrefix}/auth/login', data: request.toJson(), ); final data = AuthData.fromJson( (response.data as Map)['data'] as Map, ); await _tokenStorage.saveTokens( accessToken: data.accessToken, sessionToken: data.sessionToken, ); return data; } Future logout() async { final sessionToken = await _tokenStorage.getSessionToken(); if (sessionToken != null) { await _dio.post( '${ApiConfig.apiPrefix}/auth/logout', options: Options(headers: {'X-Session-Token': sessionToken}), ); } await _tokenStorage.clearTokens(); } Future refresh() async { final sessionToken = await _tokenStorage.getSessionToken(); final response = await _dio.post( '${ApiConfig.apiPrefix}/auth/refresh', options: Options(headers: {'X-Session-Token': sessionToken}), ); final data = AuthData.fromJson( (response.data as Map)['data'] as Map, ); await _tokenStorage.saveTokens( accessToken: data.accessToken, sessionToken: data.sessionToken, ); return data; } Future sendMagicLink(String email) async { await _dio.post( '${ApiConfig.apiPrefix}/auth/magic-link', data: {'email': email}, ); } Future setupTotp() async { final response = await _dio.post('${ApiConfig.apiPrefix}/auth/2fa/setup'); return TotpSetupData.fromJson( (response.data as Map)['data'] as Map, ); } Future verifyTotp(String code) async { await _dio.post( '${ApiConfig.apiPrefix}/auth/2fa/verify', data: {'code': code}, ); } Future disableTotp(String code) async { await _dio.delete( '${ApiConfig.apiPrefix}/auth/2fa', data: {'code': code}, ); } }