Aidra Driver 1.3.5+68
Aidra Driver - Your path to green energy
Loading...
Searching...
No Matches
offline_sync_service.dart
Go to the documentation of this file.
1import 'dart:convert';
2import 'package:internet_connection_checker_plus/internet_connection_checker_plus.dart';
3import 'package:isar/isar.dart';
4import '../../features/collections/data/models/req/req_collection_confirmation_model.dart';
5import '../../features/collections/data/models/req/req_collection_information_model.dart';
6import '../../features/collections/data/models/req/req_collection_payment_model.dart';
7import '../../features/collections/data/models/req/req_collection_rating_model.dart';
8import '../../features/collections/data/models/req/req_collection_validation_model.dart';
9import '../isar/isar_local_database.dart';
10import '../isar/models/collections/pending_collection_operation_isar_model.dart';
11import '../../features/collections/data/datasources/collection_remote_datasource.dart';
12import '../../core/services/service_locator.dart';
13
17
18 Future<bool> isAllOperationsSynced() async {
19 final pendingOperations = await _localDatabase
21 .where()
22 .filter()
23 .isSyncedEqualTo(false)
24 .count();
25
26 return pendingOperations == 0;
27 }
28
29 Future<bool> isOperationsSynced(int collectionId) async {
30 final pendingOperations = await _localDatabase
32 .where()
33 .filter()
34 .collectionIdEqualTo(collectionId)
35 .isSyncedEqualTo(false)
36 .count();
37
38 return pendingOperations == 0;
39 }
40
41 Future<CollectionStep> getOperationCurrentStep(int collectionId) async {
42 final latestOperation = await _localDatabase
44 .where()
45 .filter()
46 .collectionIdEqualTo(collectionId)
47 .isSyncedEqualTo(false)
48 .sortByTimestampDesc()
49 .findFirst();
50
51 return latestOperation?.step ?? CollectionStep.statusUpdate;
52 }
53
54 Future<void> addPendingOperation({
55 required int collectionId,
56 required CollectionStep step,
57 required Map<String, dynamic> data,
58 required int operationOrder,
59 }) async {
60 // Check if operation already exists
61 final existingOperation = await _localDatabase
63 .where()
64 .filter()
65 .collectionIdEqualTo(collectionId)
66 .stepEqualTo(step)
67 .findFirst();
68
69 if (existingOperation != null && existingOperation.isSynced) return;
70
71 if (existingOperation != null) {
72 // Update existing operation
73 existingOperation.payload = jsonEncode(data);
74 existingOperation.operationOrder = operationOrder;
75 existingOperation.timestamp = DateTime.now();
76 existingOperation.isSynced = false;
77
78 await _localDatabase.put<PendingCollectionOperationIsarModel>(existingOperation);
79 } else {
80 // Create new operation
83 step: step,
84 payload: jsonEncode(data),
85 operationOrder: operationOrder,
86 timestamp: DateTime.now(),
87 isSynced: false
88 );
89
91 }
92 }
93
94 Future<void> syncPendingOperations() async {
95 final hasInternet = await InternetConnection().hasInternetAccess;
96 if (!hasInternet) return;
97
98 // Get all unique collection IDs that have pending operations
99 final pendingCollections = await _localDatabase
101 .where()
102 .filter()
103 .isSyncedEqualTo(false)
104 .collectionIdProperty()
105 .findAll();
106
107 final uniqueCollections = pendingCollections.toSet().toList();
108
109 // Process each collection's operations in order
110 for (final collectionId in uniqueCollections) {
111 final operations = await _localDatabase
113 .where()
114 .filter()
115 .collectionIdEqualTo(collectionId)
116 .isSyncedEqualTo(false)
117 .sortByOperationOrder()
118 .findAll();
119
120 // Process operations sequentially
121 for (final operation in operations) {
122 try {
123 final success = await _processPendingOperation(operation);
124 if (!success) {
125 break;
126 }
127
128 operation.isSynced = true;
130 } catch (e) {
131 break;
132 }
133 }
134 }
135 }
136
138 final data = jsonDecode(operation.payload);
139
140 switch (operation.step) {
141 case CollectionStep.statusUpdate:
142 return await _processStatusUpdate(data);
143 case CollectionStep.validation:
144 return await _processValidation(data);
145 case CollectionStep.information:
146 return await _processInformation(data);
147 case CollectionStep.confirmation:
148 return await _processConfirmation(data);
149 case CollectionStep.payment:
150 return await _processPayment(data);
151 case CollectionStep.rating:
152 return await _processRating(data);
153 }
154 }
155
156 Future<bool> _processStatusUpdate(Map<String, dynamic> data) async {
157 try {
158 final String id = data['id'] as String;
159 final int idToInt = int.parse(id);
160 final String status = data['status'];
161 final int? cancelationReasonId = data['cancellationReason']?['id'];
162
163 await _remoteDataSource.updateCollectionStatus(
164 collectionId: idToInt,
165 status: status,
166 cancelationReasonId: cancelationReasonId?.toString(),
167 );
168 return true;
169 } catch (e) {
170 return false;
171 }
172 }
173
174 Future<bool> _processValidation(Map<String, dynamic> data) async {
175 try {
176 await _remoteDataSource.validateCollection(
177 reqValidationCollectionModel: ReqCollectionValidationModel.fromJson(data),
178 );
179 return true;
180 } catch (e) {
181 return false;
182 }
183 }
184
185 Future<bool> _processInformation(Map<String, dynamic> data) async {
186 try {
187 await _remoteDataSource.sendCollectionsInformation(
188 reqInformationCollectionModel: ReqCollectionInformationModel.fromJson(data),
189 );
190 return true;
191 } catch (e) {
192 return false;
193 }
194 }
195
196 Future<bool> _processConfirmation(Map<String, dynamic> data) async {
197 try {
198 await _remoteDataSource.sendCollectionConfirmation(
199 reqCollectionConfirmationModel: ReqCollectionConfirmationModel.fromJson(data),
200 );
201 return true;
202 } catch (e) {
203 return false;
204 }
205 }
206
207 Future<bool> _processPayment(Map<String, dynamic> data) async {
208 try {
209 await _remoteDataSource.sendCollectionPayment(
210 reqCollectionPaymentModel: ReqCollectionPaymentModel.fromJson(data),
211 );
212 return true;
213 } catch (e) {
214 return false;
215 }
216 }
217
218 Future<bool> _processRating(Map<String, dynamic> data) async {
219 try {
220 await _remoteDataSource.sendCollectionRating(
221 reqCollectionRatingModel: ReqCollectionRatingModel.fromJson(data),
222 );
223 return true;
224 } catch (e) {
225 return false;
226 }
227 }
228}
static IsarLocalDatabase get instance
Future< void > syncPendingOperations() async
Future< bool > _processConfirmation(Map< String, dynamic > data) async
Future< void > addPendingOperation({ required int collectionId, required CollectionStep step, required Map< String, dynamic > data, required int operationOrder, }) async
Future< bool > _processPendingOperation(PendingCollectionOperationIsarModel operation) async
Future< bool > _processRating(Map< String, dynamic > data) async
Future< bool > _processValidation(Map< String, dynamic > data) async
Future< bool > _processPayment(Map< String, dynamic > data) async
Future< bool > isOperationsSynced(int collectionId) async
Future< CollectionStep > getOperationCurrentStep(int collectionId) async
Future< bool > _processStatusUpdate(Map< String, dynamic > data) async
Future< bool > isAllOperationsSynced() async
Future< bool > _processInformation(Map< String, dynamic > data) async
class UpdateCollectionStatusEvent extends CollectionsEvent collectionId
class Partner String
PendingCollectionOperationIsarModel({ required this.collectionId, required this.step, required this.operationOrder, required this.payload, required this.timestamp, this.isSynced=false, })
final sl