90 lines
3.8 KiB
Dart
90 lines
3.8 KiB
Dart
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<void> _updateAccessToken(AccountResponse response) async {
|
|
await AuthorizationStorage.updateToken(response.accessToken);
|
|
}
|
|
|
|
static Future<void> _updateTokens(LoginResponse response) async {
|
|
await _updateAccessToken(response);
|
|
return AuthorizationStorage.updateRefreshToken(response.refreshToken);
|
|
}
|
|
|
|
static Future<LoginResponse> _completeLogin(Map<String, dynamic> response) async {
|
|
final LoginResponse lr = LoginResponse.fromJson(response);
|
|
await _updateTokens(lr);
|
|
return lr;
|
|
}
|
|
|
|
static Future<Account> 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<Account> restore() async {
|
|
return (await TokenService.rotateRefreshToken()).account.toDomain();
|
|
}
|
|
|
|
static Future<void> logout() async {
|
|
return AuthorizationStorage.removeTokens();
|
|
}
|
|
|
|
static Future<Map<String, dynamic>> _authenticatedRequest(
|
|
String service,
|
|
String url,
|
|
Future<Map<String, dynamic>> Function(String, String, Map<String, dynamic>, {String? authToken}) requestType,
|
|
{Map<String, dynamic>? body}) async {
|
|
final accessToken = await TokenService.getAccessToken();
|
|
return requestType(service, url, body ?? {}, authToken: accessToken);
|
|
}
|
|
|
|
static Future<Map<String, dynamic>> getPOSTResponse(String service, String url, Map<String, dynamic> body) async => _authenticatedRequest(service, url, httpr.getPOSTResponse, body: body);
|
|
|
|
static Future<Map<String, dynamic>> getGETResponse(String service, String url) async {
|
|
final accessToken = await TokenService.getAccessToken();
|
|
return httpr.getGETResponse(service, url, authToken: accessToken);
|
|
}
|
|
|
|
static Future<Map<String, dynamic>> getPUTResponse(String service, String url, Map<String, dynamic> body) async => _authenticatedRequest(service, url, httpr.getPUTResponse, body: body);
|
|
|
|
static Future<Map<String, dynamic>> getPATCHResponse(String service, String url, Map<String, dynamic> body) async => _authenticatedRequest(service, url, httpr.getPATCHResponse, body: body);
|
|
|
|
static Future<Map<String, dynamic>> getDELETEResponse(String service, String url, Map<String, dynamic> body) async => _authenticatedRequest(service, url, httpr.getDELETEResponse, body: body);
|
|
|
|
static Future<String> getFileUploadResponseAuth(String service, String url, String fileName, String fileType, String mediaType, List<int> 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;
|
|
}
|
|
}
|