|
import 'dart:convert';
|
|
|
|
import 'package:sunnex/core/constants/constants.dart';
|
|
import 'package:sunnex/core/utils/client.dart';
|
|
import 'package:sunnex/data/contracts/database_contract.dart';
|
|
import 'package:sunnex/model/requests/login.dart';
|
|
import 'package:sunnex/model/responses/login_result.dart';
|
|
import 'package:sunnex/model/shared_pref.dart';
|
|
import 'base_repository.dart';
|
|
|
|
class AuthRepository extends ApiClient implements BaseRepository {
|
|
final String verifyTokenURL, refreshTokenURL, loginURL;
|
|
final DatabaseContract databaseService;
|
|
|
|
AuthRepository({
|
|
required this.loginURL,
|
|
required this.verifyTokenURL,
|
|
required this.refreshTokenURL,
|
|
required this.databaseService,
|
|
});
|
|
|
|
Future<void> savePhoneNumber(String phone) async {
|
|
await SharedPref.saveString('phone_number', phone);
|
|
}
|
|
|
|
Future<String> login(String phoneNumber, String password) async {
|
|
phoneNumber = Constants.globalPhoneNumberFormat(phoneNumber);
|
|
Login login = Login(phone: phoneNumber, password: password);
|
|
|
|
try {
|
|
final response = await super.post(loginURL, json.encode(login.toJson()));
|
|
|
|
final result = LoginResult.fromRawJson(response.body);
|
|
|
|
if (!result.success || result.data == null) {
|
|
return result.error?.toString() ?? 'Login failed';
|
|
}
|
|
|
|
// Save tokens directly to database
|
|
await databaseService.saveTokens(
|
|
accessToken: result.data!.accessToken,
|
|
refreshToken: result.data!.refreshToken,
|
|
);
|
|
|
|
await savePhoneNumber(result.data!.user.phone);
|
|
return '';
|
|
} catch (e) {
|
|
return e.toString();
|
|
}
|
|
}
|
|
|
|
Future<void> refreshTokens() async {
|
|
final refreshToken = await databaseService.getRefreshToken();
|
|
|
|
if (refreshToken == null || refreshToken.isEmpty) {
|
|
throw Exception('No refresh token available');
|
|
}
|
|
|
|
final response = await super.post(
|
|
refreshTokenURL,
|
|
json.encode({'refreshToken': refreshToken}),
|
|
);
|
|
|
|
if (!Constants.isSuccessCode(response.statusCode)) {
|
|
await databaseService.clearTokens();
|
|
throw Exception('Refresh token expired');
|
|
}
|
|
|
|
final data = jsonDecode(response.body);
|
|
|
|
// Save new tokens directly to database
|
|
await databaseService.saveTokens(
|
|
accessToken: data['access_token'],
|
|
refreshToken: data['refresh_token'],
|
|
);
|
|
}
|
|
|
|
Future<bool> verifyToken() async {
|
|
final accessToken = await databaseService.getAccessToken();
|
|
|
|
if (accessToken == null || accessToken.isEmpty) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
final response = await super.post(
|
|
verifyTokenURL,
|
|
json.encode({'token': accessToken}),
|
|
);
|
|
|
|
return Constants.isSuccessCode(response.statusCode);
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|