import 'package:logging/logging.dart'; import 'package:pshared/api/errors/upload_failed.dart'; import 'package:pshared/api/requests/login.dart'; import 'package:pshared/api/responses/account.dart'; import 'package:pshared/api/responses/login.dart'; import 'package:pshared/config/constants.dart'; import 'package:pshared/data/mapper/account/account.dart'; import 'package:pshared/models/account/account.dart'; import 'package:pshared/service/authorization/storage.dart'; import 'package:pshared/service/authorization/token.dart'; import 'package:pshared/service/device_id.dart'; import 'package:pshared/utils/http/requests.dart' as httpr; class AuthorizationService { static final _logger = Logger('service.authorization'); static Future _updateAccessToken(AccountResponse response) async { await AuthorizationStorage.updateToken(response.accessToken); } static Future _updateTokens(LoginResponse response) async { await _updateAccessToken(response); return AuthorizationStorage.updateRefreshToken(response.refreshToken); } static Future _completeLogin(Map response) async { final LoginResponse lr = LoginResponse.fromJson(response); await _updateTokens(lr); return lr; } static Future login(String service, String email, String password, String locale) async { _logger.fine('Logging in $email with $locale locale'); final deviceId = await DeviceIdManager.getDeviceId(); final response = await httpr.getPOSTResponse( service, '/login', LoginRequest( login: email.toLowerCase(), password: password, locale: locale, deviceId: deviceId, clientId: Constants.clientId, ).toJson()); return (await _completeLogin(response)).account.toDomain(); } static Future restore() async { return (await TokenService.rotateRefreshToken()).account.toDomain(); } static Future logout() async { return AuthorizationStorage.removeTokens(); } static Future> _authenticatedRequest( String service, String url, Future> Function(String, String, Map, {String? authToken}) requestType, {Map? body}) async { final accessToken = await TokenService.getAccessToken(); return requestType(service, url, body ?? {}, authToken: accessToken); } static Future> getPOSTResponse(String service, String url, Map body) async => _authenticatedRequest(service, url, httpr.getPOSTResponse, body: body); static Future> getGETResponse(String service, String url) async { final accessToken = await TokenService.getAccessToken(); return httpr.getGETResponse(service, url, authToken: accessToken); } static Future> getPUTResponse(String service, String url, Map body) async => _authenticatedRequest(service, url, httpr.getPUTResponse, body: body); static Future> getPATCHResponse(String service, String url, Map body) async => _authenticatedRequest(service, url, httpr.getPATCHResponse, body: body); static Future> getDELETEResponse(String service, String url, Map body) async => _authenticatedRequest(service, url, httpr.getDELETEResponse, body: body); static Future getFileUploadResponseAuth(String service, String url, String fileName, String fileType, String mediaType, List bytes) async { final accessToken = await TokenService.getAccessToken(); final res = await httpr.getFileUploadResponse(service, url, fileName, fileType, mediaType, bytes, authToken: accessToken); if (res == null) { throw ErrorUploadFailed(); } return res.url; } }