Chepuhagram/lib/domain/services/api_service.dart

135 lines
3.5 KiB
Dart

import 'package:jwt_decoder/jwt_decoder.dart';
import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:chepuhagram/core/constants.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class ApiService extends ChangeNotifier {
final _client = http.Client();
final _storage = const FlutterSecureStorage();
Future<bool> refreshToken() async {
notifyListeners();
try {
final refreshToken = await _storage.read(key: 'refresh_token');
final response = await _client.post(
Uri.http(AppConstants.baseUrl, 'auth/refresh'),
body: jsonEncode({'refresh_token': refreshToken}),
headers: {'Content-Type': 'application/json'},
);
final decodedResponse =
jsonDecode(utf8.decode(response.bodyBytes)) as Map;
if (response.statusCode == 200) {
await _storage.write(
key: 'access_token',
value: decodedResponse['access_token'],
);
await _storage.write(
key: 'refresh_token',
value: decodedResponse['refresh_token'],
);
notifyListeners();
return true;
} else {
notifyListeners();
return false;
}
} catch (e) {
notifyListeners();
rethrow;
}
}
Future<String?> getAccessToken() async {
String? token = await _storage.read(key: 'access_token');
if (token != null) {
bool isExpiredSoon =
JwtDecoder.isExpired(token) ||
JwtDecoder.getRemainingTime(token).inMinutes < 2;
if (isExpiredSoon) {
bool refreshed = await refreshToken();
if (refreshed) {
token = await _storage.read(key: 'access_token');
} else {
return null;
}
}
}
return token;
}
Future<bool> updateFcmToken(String fcmtoken) async {
notifyListeners();
try {
final token = await getAccessToken();
final response = await _client.post(
Uri.http(AppConstants.baseUrl, 'auth/update-fcm', {'token': fcmtoken}),
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer $token',
},
);
if (response.statusCode == 200) {
return true;
} else {
print("Ошибка установки ключа: ${response.statusCode}");
return false;
}
} catch (e) {
rethrow;
} finally {
notifyListeners();
}
}
Future<bool> setPublicKey(String publicKey) async {
notifyListeners();
try {
final token = await getAccessToken();
final response = await _client.post(
Uri.http(AppConstants.baseUrl, 'auth/set-public-key'),
body: jsonEncode({'public_key': publicKey}),
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer $token',
},
);
if (response.statusCode == 200) {
return true;
} else {
print("Ошибка установки ключа: ${response.statusCode}");
return false;
}
} catch (e) {
rethrow;
} finally {
notifyListeners();
}
}
Future<List<dynamic>> getChatHistory(int contactId) async {
final token = await getAccessToken();
final response = await http.get(
Uri.http(
AppConstants.baseUrl,
'messages/history/${contactId.toString()}',
),
headers: {
'Content-Type': 'application/json',
"Authorization": "Bearer $token",
},
);
return jsonDecode(response.body) as List<dynamic>;
}
}