Aidra Driver 1.3.5+68
Aidra Driver - Your path to green energy
Loading...
Searching...
No Matches
authentication_repository_impl.dart
Go to the documentation of this file.
1import 'dart:developer';
2
3import 'package:aidra_drive/features/auth/domain/entities/session_entity.dart';
4import 'package:dartz/dartz.dart';
5import 'package:flutter_secure_storage/flutter_secure_storage.dart';
6
7import '../../../../core/isar/isar_local_database.dart';
8import '../../../../core/isar/models/collections/cancellation_reason_isar_model.dart';
9import '../../../../core/isar/models/collections/collection_rating_reason_isar_model.dart';
10import '../../../../core/isar/models/collections/completed_collection_isar_model.dart';
11import '../../../../core/isar/models/collections/restaurant_collection_contacts_isar_model.dart';
12import '../../../../core/isar/models/collections/restaurant_partner_payments_isar_model.dart';
13import '../../../../core/isar/models/history/pending_collection_isar_model.dart';
14import '../../../../core/isar/models/collections/todo_collection_isar_model.dart';
15import '../../../../core/isar/models/history/this_month_collection_isar_model.dart';
16import '../../../../core/isar/models/history/this_week_collection_isar_model.dart';
17import '../../../../core/services/user_info_service.dart';
18import '../../domain/entities/credentials_entity.dart';
19import '../datasources/remote_datasource/authentication_remote_datasource.dart';
20import '../datasources/local_datasource/credentials_local_datasource.dart';
21import '../datasources/local_datasource/session_local_datasource.dart';
22import '../datasources/local_datasource/token_local_datasource.dart';
23import '../../domain/repository/authentication_repository.dart';
24import '../../../../core/error/exception_failure_adapter.dart';
25import '../../../../core/services/service_locator.dart';
26import '../../../../core/ui/theme/color_palette.dart';
27import '../../../../core/error/failures.dart';
28import '../datasources/remote_datasource/check_in_out_remote_datasource.dart';
29import '../models/credentials_model.dart';
30import '../models/session_model.dart';
31import '../models/vehicle_check_model.dart';
32import '../models/vehicle_model.dart';
33
34class AuthenticationReposiptyImpl extends AuthenticationRepository {
41
42 @override
43 Future<Either<Failure, SessionModel>> singIn({
45 }) async {
46 try {
47 final credentials = CredentialsModel(
48 email: reqEntity.email,
49 password: reqEntity.password,
50 );
51 final response = await _remoteDataSource.signInWithCredentials(
53 );
54 final session = SessionModel.fromJson(response);
55 final token = session.token;
56 await _sessionLocalDataSource.saveSession(session: session);
57 await _tokenLocaldataDource.saveToken(token: token!);
58 await _credentialsLocalDataSource.saveCredentials(
60 );
61
63 await isar.clear<TodoCollectionIsarModel>();
64 await isar.clear<CompletedCollectionIsarModel>();
65 await isar.clear<PendingCollectionIsarModel>();
66 await isar.clear<CancellationReasonIsarModel>();
67 await isar.clear<RestaurantPartnerPaymentsIsarModel>();
68 await isar.clear<RestaurantCollectionContactsIsarModel>();
69 await isar.clear<CollectionRatingReasonIsarModel>();
70 await isar.clear<ThisMonthCollectionIsarModel>();
71 await isar.clear<ThisWeekCollectionIsarModel>();
72
73 final isTodoCollectionsSavedInLocalDatabase = await saveTodoCollectionToLocalDatabase(
74 userId: session.userContext?.uid ?? 0,
75 type: 'todo'
76 );
77
78 final isCompletedCollectionsSavedInLocalDatabase = await saveCompletedCollectionToLocalDatabase(
79 userId: session.userContext?.uid ?? 0,
80 );
81
82 final isPendingCollectionsSavedInLocalDatabase = await savePendingCollectionToLocalDatabase(
83 userId: session.userContext?.uid ?? 0,
84 );
85
86 final isCollectionCancelationReasonsSavedInLocalDatabase = await saveCollectionCancelationReasonsToLocalDatabase();
87
88 final isPartnerPaymentsSavedInLocalDatabase = await savePartnerPaymentsToLocalDatabase();
89
90 final isPartnerContactsSavedInLocalDatabase = await savePartnerContactsToLocalDatabase();
91
92 final isCollectionRatingReasonsSavedInLocalDatabase = await saveCollectionRatingReasonsToLocalDatabase();
93
94 final isThisWeekHistorySavedInLocalDatabase = await saveThisWeekHistoryToLocalDatabase(
95 userId: session.userContext?.uid ?? 0,
96 );
97
98 final isThisMonthHistorySavedInLocalDatabase = await saveThisMonthHistoryToLocalDatabase(
99 userId: session.userContext?.uid ?? 0,
100 );
101
103
104 final test = isTodoCollectionsSavedInLocalDatabase;
105 final test2 = isCompletedCollectionsSavedInLocalDatabase;
106 final test3 = isPendingCollectionsSavedInLocalDatabase;
107 final test4 = isCollectionCancelationReasonsSavedInLocalDatabase;
108 final test5 = isPartnerPaymentsSavedInLocalDatabase;
109 final test6 = isPartnerContactsSavedInLocalDatabase;
110 final test7 = isCollectionRatingReasonsSavedInLocalDatabase;
111 final test8 = isThisWeekHistorySavedInLocalDatabase;
112 final test9 = isThisMonthHistorySavedInLocalDatabase;
113
114 log("========= DATA DOWNLOADING =========");
115 log("Todo Collections Saved In LocalDatabase: ${test.toString()}");
116 log("Completed Collections Saved In LocalDatabase: ${test2.toString()}");
117 log("Pending Collections Saved In LocalDatabase: ${test3.toString()}");
118 log("Collection Cancelation Reasons Saved In LocalDatabase: ${test4.toString()}");
119 log("Partner Payments Saved In LocalDatabase: ${test5.toString()}");
120 log("Partner Contacts Saved In LocalDatabase: ${test6.toString()}");
121 log("Collection Rating Reasons Saved In LocalDatabase: ${test7.toString()}");
122 log("This Week-History Saved In LocalDatabase: ${test8.toString()}");
123 log("This Month-History Saved In LocalDatabase: ${test9.toString()}");
124 log("====================================");
125
126 if (isTodoCollectionsSavedInLocalDatabase &&
127 isCompletedCollectionsSavedInLocalDatabase &&
128 isPendingCollectionsSavedInLocalDatabase &&
129 isCollectionCancelationReasonsSavedInLocalDatabase &&
130 isPartnerPaymentsSavedInLocalDatabase &&
131 isPartnerContactsSavedInLocalDatabase &&
132 isCollectionRatingReasonsSavedInLocalDatabase &&
133 isThisWeekHistorySavedInLocalDatabase &&
134 isThisMonthHistorySavedInLocalDatabase){
135 return right(session);
136 } else {
137 await signOut();
138 return left(
140 color: ColorPalette.red,
141 message: "Please, try again",
142 ),
143 );
144 }
145 } catch (e) {
146 return left(ExceptionFailureAdapter.adapt(e));
147 }
148 }
149
150
151
152 @override
153 Future<Either<Failure, void>> signOut() async {
154 try {
155 await isar.clear<TodoCollectionIsarModel>();
156 await isar.clear<CompletedCollectionIsarModel>();
157 await isar.clear<PendingCollectionIsarModel>();
158 await isar.clear<CancellationReasonIsarModel>();
162 await isar.clear<ThisMonthCollectionIsarModel>();
163 await isar.clear<ThisWeekCollectionIsarModel>();
164 await _sessionLocalDataSource.deleteSession();
165 await _tokenLocaldataDource.deleteToken();
166 return right(null);
167 } catch (e) {
168 return left(ExceptionFailureAdapter.adapt(e));
169 }
170 }
171
172 @override
173 Future<Either<Failure, SessionModel?>> loadSession() async {
174 try {
175 final user = await _sessionLocalDataSource.fetchSession();
176 return right(user);
177 } catch (e) {
178 return left(ExceptionFailureAdapter.adapt(e));
179 }
180 }
181
182 @override
183 Future<Either<Failure, CredentialsModel?>> loadCredentials() async {
184 try {
185 final credentials = await _credentialsLocalDataSource.fetchCredentials();
186 return right(credentials);
187 } catch (e) {
188 return left(ExceptionFailureAdapter.adapt(e));
189 }
190 }
191
192 @override
193 Future<Either<Failure, List<VehicleModel>>> getAvailableVehicles({required int userId}) async {
194 try {
195 final vehicles = await _checkInOutDataSource.getAvailableVehicles(userId: userId);
196 return right(vehicles);
197 } catch (e) {
198 return left(ExceptionFailureAdapter.adapt(e));
199 }
200 }
201
202 @override
203 Future<Either<Failure, bool>> vehicleCheck({required VehicleCheckModel vehicleCheckModel}) async {
204 try {
205 await _checkInOutDataSource.vehicleCheck(
206 vehicleCheckModel: vehicleCheckModel,
207 );
208
209 final storage = const FlutterSecureStorage(
210 aOptions: AndroidOptions(
211 encryptedSharedPreferences: true,
212 ),
213 iOptions: IOSOptions(
214 accessibility: KeychainAccessibility.first_unlock,
215 ),
216 );
217
218
219 if (vehicleCheckModel.type == 'checkin') {
220 await storage.write(key: 'is_checked_in', value: 'true');
221 } else if (vehicleCheckModel.type == 'checkout') {
222 await storage.delete(key: 'is_checked_in');
223 }
224
225 return right(true);
226 } catch (e) {
227 return left(ExceptionFailureAdapter.adapt(e));
228 }
229 }
230
231 @override
232 Future<Either<Failure, bool>> checkBiometricAuthAvailability() async {
233 try {
234 final credentials = await _credentialsLocalDataSource.fetchCredentials();
235 return right(credentials != null ? true : false);
236 } catch (e) {
237 return left(ExceptionFailureAdapter.adapt(e));
238 }
239 }
240
242 required int userId,
243 required String? type,
244 }) async {
245 try {
246 final todoCollection = await _remoteDataSource.getCollections(
247 userId: userId,
248 notForToday: false,
249 type: type,
250 );
251 final isarTodoCollectionList = todoCollection.map(
253 ).toList();
254 await isar.putAll<TodoCollectionIsarModel>(isarTodoCollectionList);
255 return true;
256 } catch (e) {
257 return false;
258 }
259 }
260
262 required int userId,
263 }) async {
264 try {
265 final todoCollection = await _remoteDataSource.getCollections(
266 userId: userId,
267 notForToday: false,
268 type: null,
269 );
270 final isarCompletedCollectionList = todoCollection.map(
272 ).toList();
273 await isar.putAll<CompletedCollectionIsarModel>(isarCompletedCollectionList);
274 return true;
275 } catch (e) {
276 return false;
277 }
278 }
279
281 required int userId,
282 }) async {
283 try {
284 final pendingCollection = await _remoteDataSource.getCollections(
285 userId: userId,
286 notForToday: true,
287 type: 'pending',
288 );
289 final isarPendingCollectionList = pendingCollection.map(
291 ).toList();
292 await isar.putAll<PendingCollectionIsarModel>(isarPendingCollectionList);
293 return true;
294 } catch (e) {
295 return false;
296 }
297 }
298
300 required int userId,
301 }) async {
302 try {
303 final thisWeekHistory = await _remoteDataSource.getHistoryCollections(
304 userId: userId,
305 period: 'week'
306 );
307 final isarThisWeekCollectionList = thisWeekHistory.map(
309 ).toList();
310 await isar.putAll<ThisWeekCollectionIsarModel>(isarThisWeekCollectionList);
311 return true;
312 } catch (e) {
313 return false;
314 }
315 }
316
318 required int userId,
319 }) async {
320 try {
321 final thisMonthHistory = await _remoteDataSource.getHistoryCollections(
322 userId: userId,
323 period: 'month'
324 );
325 final isarThisMonthCollectionList = thisMonthHistory.map(
327 ).toList();
328 await isar.putAll<ThisMonthCollectionIsarModel>(isarThisMonthCollectionList);
329 return true;
330 } catch (e) {
331 return false;
332 }
333 }
334
336 try {
337 final cancelationReasons = await _remoteDataSource.getCollectionCancelationReasons();
338 final isarCancelationReasonsList = cancelationReasons.map(
340 ).toList();
341 await isar.putAll<CancellationReasonIsarModel>(isarCancelationReasonsList);
342 return true;
343 } catch (e) {
344 return false;
345 }
346 }
347
349 try {
350 final collections = await isar.getAll<TodoCollectionIsarModel>();
351
352 for (final e in collections) {
353 final paymentModeList = await _remoteDataSource.getCollectionPaymentModeList(
354 restaurentId: e.restaurantId ?? 0,
355 );
357 restaurantId: e.restaurantId ?? 0,
358 payments: paymentModeList,
359 );
361 }
362
363 return true;
364 } catch (e) {
365 return false;
366 }
367 }
368
370 try {
371 final collections = await isar.getAll<TodoCollectionIsarModel>();
372
373 for (final e in collections) {
374 final contactsList = await _remoteDataSource.getCollectionContactList(
375 restaurentId: e.restaurantId ?? 0,
376 );
378 restaurantId: e.restaurantId ?? 0,
379 contacts: contactsList,
380 );
382 }
383
384 return true;
385 } catch (e) {
386 return false;
387 }
388 }
389
391 try {
392 final ratingReasons = await _remoteDataSource.getCollectionRatingReasons();
393 final isarRatingReasonsList = ratingReasons.map(
395 ).toList();
396 await isar.putAll<CollectionRatingReasonIsarModel>(isarRatingReasonsList);
397 return true;
398 } catch (e) {
399 return false;
400 }
401 }
402
403 @override
404 Future<Either<Failure, SessionEntity>> fastSingIn({required CredentialsEntity reqEntity}) async {
405 try {
406 final credentials = CredentialsModel(
407 email: reqEntity.email,
408 password: reqEntity.password,
409 );
410 final response = await _remoteDataSource.signInWithCredentials(
412 );
413 final session = SessionModel.fromJson(response);
414 final token = session.token;
415 await _sessionLocalDataSource.saveSession(session: session);
416 await _tokenLocaldataDource.saveToken(token: token!);
417 await _credentialsLocalDataSource.saveCredentials(
419 );
420 return right(session);
421 } catch (e) {
422 return left(ExceptionFailureAdapter.adapt(e));
423 }
424 }
425}
final SessionLocalDataSource _sessionLocalDataSource
sealed class AuthenticationEvent extends Equatable reqEntity
final class AuthenticatedState extends AuthenticationState credentials
sealed class CheckInOutEvent extends Equatable userId
override Future< Either< Failure, CredentialsModel?> > loadCredentials() async
Future< bool > savePartnerContactsToLocalDatabase() async
Future< bool > saveThisWeekHistoryToLocalDatabase({ required int userId, }) async
override Future< Either< Failure, SessionModel?> > loadSession() async
override Future< Either< Failure, bool > > checkBiometricAuthAvailability() async
Future< bool > saveCollectionCancelationReasonsToLocalDatabase() async
Future< bool > saveCollectionRatingReasonsToLocalDatabase() async
Future< bool > savePartnerPaymentsToLocalDatabase() async
override Future< Either< Failure, SessionModel > > singIn({ required CredentialsEntity reqEntity, }) async
Future< bool > saveThisMonthHistoryToLocalDatabase({ required int userId, }) async
override Future< Either< Failure, bool > > vehicleCheck({required VehicleCheckModel vehicleCheckModel}) async
Future< bool > savePendingCollectionToLocalDatabase({ required int userId, }) async
override Future< Either< Failure, List< VehicleModel > > > getAvailableVehicles({required int userId}) async
override Future< Either< Failure, SessionEntity > > fastSingIn({required CredentialsEntity reqEntity}) async
override Future< Either< Failure, void > > signOut() async
Future< bool > saveCompletedCollectionToLocalDatabase({ required int userId, }) async
Future< bool > saveTodoCollectionToLocalDatabase({ required int userId, required String? type, }) async
static CancellationReasonIsarModel fromModel(ResCancelationReasonModel model)
static CollectionRatingReasonIsarModel fromModel(ResCollectionRatingReasonModel model)
static CompletedCollectionIsarModel fromModel(CollectionModel model)
static Failure adapt(dynamic exception)
static IsarLocalDatabase get instance
static PendingCollectionIsarModel fromModel(CollectionModel model)
static RestaurantCollectionContactsIsarModel() RestaurantCollectionContactsIsarModel fromModel({ required int restaurantId, required List< ResCollectionContactModel > contacts, })
static RestaurantPartnerPaymentsIsarModel() RestaurantPartnerPaymentsIsarModel fromModel({ required int restaurantId, required List< ResPartnerPaymentModel > payments, })
static ThisMonthCollectionIsarModel fromModel(CollectionModel model)
static ThisWeekCollectionIsarModel fromModel(CollectionModel model)
static TodoCollectionIsarModel fromModel(CollectionModel model)
static final UserInfoService instance
Future< UserInfo?> fetchAndSaveUserInfo(int userId) async
Future< void > deleteUserInfo() async
final String type
final bool notForToday
final int restaurantId
class GetCollectionContactListEvent extends CollectionsInformationEvent restaurentId
class CollectionPaymentError extends CollectionsInformationState contacts
sealed class CollectionsState extends Equatable collections
class Partner String
final Color color
Definition failures.dart:1
abstract class Failure extends Equatable ServerFailure({ required super.message, required super.color, })
final String message
Definition failures.dart:0
abstract class PeriodEvent extends Equatable period
final sl
const SessionModel({ super.id, super.jsonrpc, super.processType, super.db, super.isAdmin, super.isSystem, super.name, super.partnerId, super.statusCode, super.supportUrl, super.uid, super.userContext, super.username, super.token, super.role, })