Line data Source code
1 : import 'dart:convert';
2 :
3 : import 'package:app_pym/core/error/exceptions.dart';
4 : import 'package:app_pym/data/models/app_pym/booking_model.dart';
5 : import 'package:app_pym/data/models/app_pym/contact_categorie_model.dart';
6 : import 'package:app_pym/data/models/app_pym/contact_model.dart';
7 : import 'package:app_pym/data/models/app_pym/post_model.dart';
8 : import 'package:app_pym/data/models/app_pym/service_categorie_model.dart';
9 : import 'package:app_pym/data/models/app_pym/service_model.dart';
10 : import 'package:app_pym/data/models/authentication/app_user_model.dart';
11 : import 'package:app_pym/data/models/map_pym/batiment_model.dart';
12 : import 'package:app_pym/data/models/map_pym/entreprise_model.dart';
13 : import 'package:flutter/foundation.dart';
14 : import 'package:hive/hive.dart';
15 : import 'package:injectable/injectable.dart';
16 : import 'package:shared_preferences/shared_preferences.dart';
17 :
18 : abstract class MapPymLocalDataSource {
19 : Future<void> cacheAllBatiment(Iterable<BatimentModel> batimentModels);
20 :
21 : Future<void> cacheAllBookings(Iterable<BookingModel> bookings);
22 :
23 : Future<void> cacheAllContactCategories(
24 : Iterable<ContactCategorieModel> categories);
25 :
26 : Future<void> cacheAllEntreprise(Iterable<EntrepriseModel> entreprises);
27 :
28 : Future<void> cacheAllPosts(Iterable<PostModel> posts);
29 :
30 : Future<void> cacheAllServiceCategories(
31 : Iterable<ServiceCategorieModel> categories);
32 :
33 : Future<void> cacheAllServices(Iterable<ServiceModel> services);
34 :
35 : Future<void> cacheBatiment(BatimentModel batiment);
36 :
37 : Future<void> cacheBooking(BookingModel booking);
38 :
39 : Future<void> cacheContact(ContactModel contact);
40 :
41 : Future<void> cacheUser(AppUserModel user);
42 :
43 : /// Delete Booking. Do nothing if not found.
44 : Future<void> deleteBooking(int booking_id);
45 :
46 : List<BatimentModel> fetchAllBatiment();
47 :
48 : /// Fetch Services from cache. Filtered by [categorie_id].
49 : ///
50 : /// Empty list if not found.
51 : List<BookingModel> fetchAllBookingsOf(int service_id);
52 :
53 : List<ContactCategorieModel> fetchAllContactCategories();
54 :
55 : List<EntrepriseModel> fetchAllEntreprises();
56 :
57 : List<PostModel> fetchAllPosts();
58 :
59 : List<ServiceCategorieModel> fetchAllServiceCategories();
60 :
61 : /// Fetch a Batiment from cache.
62 : ///
63 : /// Throws [CacheException] if not found.
64 : BatimentModel fetchBatiment(int id);
65 :
66 : /// Fetch a Contact from cache.
67 : ///
68 : /// Throws [CacheException] if not found.
69 : ContactModel fetchContact(int id);
70 :
71 : /// Fetch Entreprises from cache. Filtered by [idBatiment].
72 : ///
73 : /// Empty list if not found.
74 : List<EntrepriseModel> fetchEntreprisesOfBatiment(int idBatiment);
75 :
76 : /// Fetch Services from cache. Filtered by [categorie_id].
77 : ///
78 : /// Empty list if not found.
79 : List<ServiceModel> fetchServicesOf(int categorie_id);
80 :
81 : /// Fetch a user from cache.
82 : ///
83 : /// Throws [CacheException] if not found.
84 : AppUserModel fetchUser();
85 : }
86 :
87 : @prod
88 : @LazySingleton(as: MapPymLocalDataSource)
89 : class MapPymLocalDataSourceImpl implements MapPymLocalDataSource {
90 : final Box<BatimentModel> batimentsBox;
91 : final Box<EntrepriseModel> entreprisesBox;
92 : final Box<PostModel> postsBox;
93 : final Box<ServiceCategorieModel> serviceCategoriesBox;
94 : final Box<ServiceModel> servicesBox;
95 : final Box<ContactCategorieModel> contactCategoriesBox;
96 : final Box<ContactModel> contactsBox;
97 : final Box<BookingModel> bookingsBox;
98 : final SharedPreferences prefs;
99 :
100 1 : const MapPymLocalDataSourceImpl({
101 : @required this.serviceCategoriesBox,
102 : @required this.servicesBox,
103 : @required this.contactCategoriesBox,
104 : @required this.batimentsBox,
105 : @required this.entreprisesBox,
106 : @required this.postsBox,
107 : @required this.contactsBox,
108 : @required this.bookingsBox,
109 : @required this.prefs,
110 : });
111 :
112 : @override
113 1 : Future<void> cacheAllBatiment(Iterable<BatimentModel> batiments) async {
114 2 : return batiments.forEach(cacheBatiment);
115 : }
116 :
117 : @override
118 1 : Future<void> cacheAllBookings(Iterable<BookingModel> bookings) async {
119 2 : return bookings.forEach(cacheBooking);
120 : }
121 :
122 : @override
123 1 : Future<void> cacheAllContactCategories(
124 : Iterable<ContactCategorieModel> categories) async {
125 2 : return categories.forEach(_cacheContactCategorie);
126 : }
127 :
128 : @override
129 1 : Future<void> cacheAllEntreprise(Iterable<EntrepriseModel> entreprises) async {
130 2 : return entreprises.forEach(_cacheEntreprise);
131 : }
132 :
133 : @override
134 1 : Future<void> cacheAllPosts(Iterable<PostModel> posts) async {
135 2 : return posts.forEach(_cachePost);
136 : }
137 :
138 : @override
139 1 : Future<void> cacheAllServiceCategories(
140 : Iterable<ServiceCategorieModel> categories) async {
141 2 : return categories.forEach(_cacheServiceCategory);
142 : }
143 :
144 : @override
145 1 : Future<void> cacheAllServices(Iterable<ServiceModel> services) async {
146 2 : return services.forEach(_cacheService);
147 : }
148 :
149 1 : @override
150 : Future<void> cacheBatiment(BatimentModel batiment) {
151 2 : return batimentsBox.put(
152 2 : '/batiments/${batiment.id}',
153 : batiment,
154 : );
155 : }
156 :
157 1 : @override
158 : Future<void> cacheBooking(BookingModel booking) {
159 4 : return bookingsBox.put('/bookings/${booking.id}', booking);
160 : }
161 :
162 1 : @override
163 : Future<void> cacheContact(ContactModel contact) {
164 2 : return contactsBox.put(
165 2 : '/contacts/${contact.id}',
166 : contact,
167 : );
168 : }
169 :
170 1 : @override
171 : Future<void> cacheUser(AppUserModel user) {
172 4 : return prefs.setString('user', json.encode(user.toJson()));
173 : }
174 :
175 1 : @override
176 : Future<void> deleteBooking(int booking_id) {
177 3 : return bookingsBox.delete('/bookings/${booking_id}');
178 : }
179 :
180 1 : @override
181 : List<BatimentModel> fetchAllBatiment() {
182 : final List<BatimentModel> batimentModels =
183 3 : batimentsBox?.values?.toList() ?? [];
184 : return batimentModels;
185 : }
186 :
187 1 : @override
188 : List<BookingModel> fetchAllBookingsOf(int service_id) {
189 2 : final models = bookingsBox?.values
190 4 : ?.where((e) => e.service_id == service_id)
191 1 : ?.toList() ??
192 0 : [];
193 : return models;
194 : }
195 :
196 1 : @override
197 : List<ContactCategorieModel> fetchAllContactCategories() {
198 3 : final data = contactCategoriesBox?.values?.toList() ?? [];
199 :
200 : return data;
201 : }
202 :
203 1 : @override
204 : List<PostModel> fetchAllPosts() {
205 3 : final models = postsBox?.values?.toList() ?? [];
206 : return models;
207 : }
208 :
209 1 : @override
210 : List<ServiceCategorieModel> fetchAllServiceCategories() {
211 3 : final data = serviceCategoriesBox?.values?.toList() ?? [];
212 :
213 : return data;
214 : }
215 :
216 1 : @override
217 : BatimentModel fetchBatiment(int id) {
218 3 : final BatimentModel batimentModel = batimentsBox.get('/batiments/${id}');
219 : if (batimentModel != null) {
220 : return batimentModel;
221 : } else {
222 1 : throw CacheException('No Batiment in cache.');
223 : }
224 : }
225 :
226 1 : @override
227 : ContactModel fetchContact(int id) {
228 3 : final ContactModel contactModel = contactsBox.get('/contacts/${id}');
229 : if (contactModel != null) {
230 : return contactModel;
231 : } else {
232 2 : throw CacheException('No Contact $id in cache.');
233 : }
234 : }
235 :
236 1 : @override
237 : List<EntrepriseModel> fetchEntreprisesOfBatiment(int idBatiment) {
238 2 : final entreprisesOfBatiment = entreprisesBox?.values
239 4 : ?.where((element) => element.idBatiment == idBatiment)
240 1 : ?.toList() ??
241 1 : [];
242 : return entreprisesOfBatiment;
243 : }
244 :
245 1 : @override
246 : List<ServiceModel> fetchServicesOf(int categorie_id) {
247 2 : final models = servicesBox?.values
248 4 : ?.where((element) => element.categorie_id == categorie_id)
249 1 : ?.toList() ??
250 1 : [];
251 : return models;
252 : }
253 :
254 1 : @override
255 : AppUserModel fetchUser() {
256 2 : final user = prefs.getString('user');
257 : if (user != null) {
258 2 : return AppUserModel.fromJson(json.decode(user) as Map<String, dynamic>);
259 : } else {
260 1 : throw CacheException('No Users in cache');
261 : }
262 : }
263 :
264 1 : Future<void> _cacheContactCategorie(ContactCategorieModel category) {
265 2 : return contactCategoriesBox.put(
266 2 : '/contact_categories/${category.id}',
267 : category,
268 : );
269 : }
270 :
271 1 : Future<void> _cacheEntreprise(EntrepriseModel entreprise) {
272 2 : return entreprisesBox.put(
273 2 : '/entreprises/${entreprise.id}',
274 : entreprise,
275 : );
276 : }
277 :
278 1 : Future<void> _cachePost(PostModel post) {
279 4 : return postsBox.put('/posts/${post.id}', post);
280 : }
281 :
282 1 : Future<void> _cacheService(ServiceModel service) {
283 4 : return servicesBox.put('/services/${service.id}', service);
284 : }
285 :
286 1 : Future<void> _cacheServiceCategory(ServiceCategorieModel category) {
287 2 : return serviceCategoriesBox.put(
288 2 : '/service_categories/${category.id}',
289 : category,
290 : );
291 : }
292 :
293 0 : @override
294 : List<EntrepriseModel> fetchAllEntreprises() {
295 0 : final entreprisesOfBatiment = entreprisesBox?.values?.toList() ?? [];
296 : return entreprisesOfBatiment;
297 : }
298 : }
|