Project

General

Profile

Task #28 » auth_repository.dart

Milad Khnefes, 02/01/2026 12:07 PM

 
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;
}
}
}
(6-6/12)