260 lines
6.6 KiB
Dart
260 lines
6.6 KiB
Dart
// Dart imports:
|
|
import 'dart:async';
|
|
import 'dart:convert';
|
|
import 'dart:core';
|
|
import 'dart:io';
|
|
|
|
// Flutter imports:
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
// Project imports:
|
|
import 'package:invoiceninja_flutter/.env.dart';
|
|
import 'package:invoiceninja_flutter/constants.dart';
|
|
import 'package:invoiceninja_flutter/data/mock/mock_login.dart';
|
|
import 'package:invoiceninja_flutter/data/models/entities.dart';
|
|
import 'package:invoiceninja_flutter/data/web_client.dart';
|
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
|
import 'package:invoiceninja_flutter/utils/formatting.dart';
|
|
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
|
import 'package:invoiceninja_flutter/utils/serialization.dart';
|
|
|
|
class AuthRepository {
|
|
const AuthRepository({
|
|
this.webClient = const WebClient(),
|
|
});
|
|
|
|
final WebClient webClient;
|
|
|
|
Future<LoginResponse> signUp({
|
|
String? url,
|
|
String? secret,
|
|
required String email,
|
|
required String password,
|
|
required String referralCode,
|
|
}) async {
|
|
final credentials = {
|
|
'email': email,
|
|
'password': password,
|
|
'terms_of_service': true,
|
|
'privacy_policy': true,
|
|
'token_name': _tokenName,
|
|
'platform': getPlatformName(),
|
|
};
|
|
|
|
if ((url ?? '').isEmpty) {
|
|
url = Constants.hostedApiUrl;
|
|
}
|
|
|
|
return sendRequest(
|
|
url: formatApiUrl(url) + '/signup?rc=$referralCode',
|
|
data: credentials,
|
|
secret: secret);
|
|
}
|
|
|
|
Future<LoginResponse> oauthSignUp({
|
|
required String url,
|
|
required String? idToken,
|
|
required String? accessToken,
|
|
required String referralCode,
|
|
required String provider,
|
|
String? firstName = '',
|
|
String? lastName = '',
|
|
}) async {
|
|
final credentials = {
|
|
'terms_of_service': true,
|
|
'privacy_policy': true,
|
|
'token_name': _tokenName,
|
|
'id_token': idToken,
|
|
'access_token': accessToken,
|
|
'provider': provider,
|
|
'platform': getPlatformName(),
|
|
'first_name': firstName,
|
|
'last_name': lastName,
|
|
};
|
|
|
|
return sendRequest(
|
|
url: formatApiUrl(url) + '/oauth_login?create=true&rc=$referralCode',
|
|
data: credentials,
|
|
secret: Config.API_SECRET);
|
|
}
|
|
|
|
Future<LoginResponse> login(
|
|
{String? email,
|
|
String? password,
|
|
String? url,
|
|
String? secret,
|
|
String? platform,
|
|
String? oneTimePassword}) async {
|
|
final credentials = {
|
|
'email': email,
|
|
'password': password,
|
|
'one_time_password': oneTimePassword,
|
|
};
|
|
|
|
url = formatApiUrl(url) + '/login';
|
|
|
|
return sendRequest(url: url, data: credentials, secret: secret);
|
|
}
|
|
|
|
Future<dynamic> logout({required Credentials credentials}) async {
|
|
return webClient.post(
|
|
'${credentials.url}/logout',
|
|
credentials.token,
|
|
);
|
|
}
|
|
|
|
Future<LoginResponse> oauthLogin({
|
|
required String? idToken,
|
|
required String? accessToken,
|
|
required String url,
|
|
required String secret,
|
|
required String platform,
|
|
required String provider,
|
|
required String? email,
|
|
required String? authCode,
|
|
}) async {
|
|
final credentials = {
|
|
'id_token': idToken,
|
|
'provider': provider,
|
|
'access_token': accessToken,
|
|
'email': email,
|
|
'auth_code': authCode,
|
|
};
|
|
url = formatApiUrl(url) + '/oauth_login';
|
|
|
|
return sendRequest(url: url, data: credentials, secret: secret);
|
|
}
|
|
|
|
Future<LoginResponse> refresh({
|
|
required String url,
|
|
required String token,
|
|
required int updatedAt,
|
|
required bool currentCompany,
|
|
required bool includeStatic,
|
|
}) async {
|
|
url = formatApiUrl(url) + '/refresh?';
|
|
|
|
if (currentCompany) {
|
|
url += 'current_company=$currentCompany';
|
|
}
|
|
|
|
if (updatedAt > 0) {
|
|
url += '&updated_at=$updatedAt';
|
|
includeStatic = includeStatic ||
|
|
DateTime.now().millisecondsSinceEpoch - (updatedAt * 1000) >
|
|
kMillisecondsToRefreshStaticData;
|
|
} else {
|
|
includeStatic = true;
|
|
}
|
|
|
|
return sendRequest(url: url, token: token, includeStatic: includeStatic);
|
|
}
|
|
|
|
Future<LoginResponse> recoverPassword(
|
|
{String? email, String? url, String? secret, String? platform}) async {
|
|
final credentials = {
|
|
'email': email,
|
|
};
|
|
url = formatApiUrl(url) + '/reset_password';
|
|
|
|
return sendRequest(url: url, data: credentials);
|
|
}
|
|
|
|
Future<void> setDefaultCompany({
|
|
required Credentials credentials,
|
|
required String companyId,
|
|
}) async {
|
|
final url = '${credentials.url}/companies/$companyId/default';
|
|
return webClient.post(url, credentials.token);
|
|
}
|
|
|
|
Future<dynamic> addCompany({
|
|
required Credentials credentials,
|
|
}) async {
|
|
final url = '${credentials.url}/companies';
|
|
final data = {
|
|
'token_name': _tokenName,
|
|
};
|
|
|
|
return webClient.post(url, credentials.token, data: json.encode(data));
|
|
}
|
|
|
|
Future<dynamic> deleteCompany({
|
|
required Credentials credentials,
|
|
required String companyId,
|
|
required String password,
|
|
required String reason,
|
|
}) async {
|
|
final url = '${credentials.url}/companies/$companyId';
|
|
return webClient.delete(
|
|
url,
|
|
credentials.token,
|
|
password: password,
|
|
data: json.encode(
|
|
{'cancellation_message': reason},
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<dynamic> purgeData({
|
|
required Credentials credentials,
|
|
required String companyId,
|
|
required String password,
|
|
required String idToken,
|
|
}) async {
|
|
return webClient.post(
|
|
'${credentials.url}/companies/purge_save_settings/$companyId',
|
|
credentials.token,
|
|
password: password,
|
|
idToken: idToken,
|
|
);
|
|
}
|
|
|
|
Future<dynamic> resendConfirmation(
|
|
{required Credentials credentials, required String userId}) async {
|
|
return webClient.post(
|
|
'${credentials.url}/user/$userId/reconfirm',
|
|
credentials.token,
|
|
);
|
|
}
|
|
|
|
Future<LoginResponse> sendRequest({
|
|
required String url,
|
|
dynamic data,
|
|
String? token,
|
|
String? secret,
|
|
bool includeStatic = true,
|
|
}) async {
|
|
if (url.contains('?')) {
|
|
url += '&';
|
|
} else {
|
|
url += '?';
|
|
}
|
|
|
|
url += 'first_load=true';
|
|
|
|
if (includeStatic) {
|
|
url += '&include_static=true';
|
|
}
|
|
|
|
dynamic response;
|
|
|
|
if (Config.DEMO_MODE) {
|
|
response = json.decode(kMockLogin);
|
|
} else {
|
|
response = await webClient.post(url, token ?? '',
|
|
secret: secret, data: json.encode(data));
|
|
}
|
|
|
|
return await (compute<dynamic, dynamic>(SerializationUtils.deserializeWith,
|
|
<dynamic>[LoginResponse.serializer, response])
|
|
as FutureOr<LoginResponse>);
|
|
}
|
|
|
|
String get _tokenName => kIsWeb
|
|
? 'web_client'
|
|
: Platform.isAndroid
|
|
? 'android_client'
|
|
: 'ios_client';
|
|
}
|