mnemo_cards/lib/managers/repository/http_repository.dart

156 lines
4 KiB
Dart
Raw Normal View History

2024-05-22 20:48:44 +00:00
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:mnemo_cards/managers/repository/repository.dart';
import 'package:mnemo_cards/managers/user_manager.dart';
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
import 'api.dart';
class HttpRepository extends Repository with Api {
final Dio _dio;
HttpRepository(this._dio);
@override
Future<UserDto> get user async => UserDto.empty;
@override
Stream<UserDto> get userStream =>
Stream.periodic(const Duration(seconds: 5)).map((event) => UserDto.empty);
@override
Future<void> updateUser(UserDto dto) async {}
2024-06-16 19:01:33 +00:00
@override
Future<PromoCodeDto> applyPromocode(String code) async {
try {
final r = await _dio.post<String>(
'$path/user/promocode',
data: PromoCodeDto(code: code).encode(),
);
return (r.data as String).decode(PromoCodeDto.fromJson);
} on DioException catch (e, s) {
log('User create error', error: e, stackTrace: s);
rethrow;
}
}
2024-05-22 20:48:44 +00:00
@override
Future<(UserDto, String)> createOrGetUser(
String externalId,
ExternalIdType idType,
2024-07-25 07:47:46 +00:00
String email,
2024-05-22 20:48:44 +00:00
String? name,
) async {
2024-06-05 02:41:14 +00:00
try {
final r = await _dio.post<String>('$path/user/create', data: {
'token': externalId,
'tokenType': idType.name,
2024-07-25 07:47:46 +00:00
'email': email,
2024-06-05 02:41:14 +00:00
'name': name,
});
//todo add client header encryption ??
final authToken = r.headers[HttpHeaders.authorizationHeader]!.last;
2024-06-12 23:00:13 +00:00
return ((r.data as String).decode(UserDto.fromJson), authToken);
2024-06-05 02:41:14 +00:00
} on DioException catch (e, s) {
log('User create error', error: e, stackTrace: s);
rethrow;
}
2024-05-22 20:48:44 +00:00
}
2024-07-03 20:56:13 +00:00
@override
2024-05-22 20:48:44 +00:00
void setAuthToken(String? authToken) {
_dio.interceptors.add(
InterceptorsWrapper(onRequest: (options, handler) {
2024-06-21 19:12:29 +00:00
options.headers[AppHeaders.userToken] = authToken;
2024-05-22 20:48:44 +00:00
handler.next(options);
}),
);
}
@override
Future<UserDto?> getUser() async {
final r = await _dio.get<String>('$path/user');
if (r.statusCode == 200) {
2024-06-12 23:00:13 +00:00
return (r.data as String).decode(UserDto.fromJson);
2024-05-22 20:48:44 +00:00
}
return null;
}
@override
2024-06-12 23:00:13 +00:00
Future<void> updateUserData(UserDataDto data) async {
final r = await _dio.post('$path/user/data', data: data.encode());
}
@override
Future<void> updateUserSettings(UserSettingsDto settings) async {
final r = await _dio.post('$path/user/settings', data: settings.encode());
}
@override
Future<void> addTestStatistics(TestStatisticsDto testStatistics) async {
final r = await _dio.post(
'$path/user/data/add/test-statistics',
data: testStatistics.encode(),
);
}
2024-05-22 20:48:44 +00:00
@override
2024-06-12 23:00:13 +00:00
Future<List<TestDto>> getTests({String packId = ''}) async {
2024-05-22 20:48:44 +00:00
final r = await _dio.get<String>(
'$path/tests/$packId',
);
2024-06-12 23:00:13 +00:00
return (r.data as String).decodeList(TestDto.fromJson);
2024-05-22 20:48:44 +00:00
}
@override
Future<TestDto?> getTest(String id) async {
final r = await _dio.get<String>(
'$path/test/$id',
);
try {
2024-06-12 23:00:13 +00:00
return (r.data as String).decode(TestDto.fromJson);
2024-05-22 20:48:44 +00:00
} catch (e, s) {
log(e.toString(), stackTrace: s);
return null;
}
}
@override
2024-08-03 22:37:10 +00:00
Future<bool> checkPayment({
required String itemId,
required String key,
required PaymentSystem paymentSystem,
}) async {
2024-05-22 20:48:44 +00:00
final r = await _dio.get<String>(
'$path/check_payment/',
queryParameters: {
'id': itemId,
'token': key,
'system': paymentSystem.name,
},
);
return jsonDecode(r.data ?? '{}')['result'] ?? false;
}
@override
Future<bool> checkUserPayment() async {
final r = await _dio.get<String>('$path/check_payments/');
final result = jsonDecode(r.data ?? '{}')?['result'] ?? false;
return result;
}
Future<String?> createPayment(String id, PaymentSystem paymentSystem) async {
final r = await _dio.get(
'$path/create_payment/',
queryParameters: {
'id': id,
'system': paymentSystem.name,
},
);
return jsonDecode(r.data)?['url'] as String?;
}
}