Sfoglia il codice sorgente

aggiunto credit score e invalidazione cache

Fabio Dalle Ave 2 mesi fa
parent
commit
d7f39644a3

+ 28 - 0
lib/providers/sync_provider.dart

@@ -6,7 +6,13 @@ import '../services/sync/ordine_sync_service.dart';
 import '../services/sync/filiale_sync_service.dart';
 import '../services/sync/reference_sync_service.dart';
 import '../services/image_service.dart';
+import 'article_provider.dart';
+import 'auth_provider.dart';
+import 'customer_provider.dart';
+import 'dashboard_provider.dart';
 import 'database_provider.dart';
+import 'order_provider.dart';
+import '../ui/pages/payments/payments_page.dart';
 
 final apiServiceProvider = Provider<ApiService>((ref) {
   final parametriDao = ref.read(parametriDaoProvider);
@@ -83,6 +89,15 @@ class SyncNotifier extends Notifier<SyncState> {
   Future<void> startFullSync(int idAgente, String codAgente, {bool forceFullSync = false}) async {
     state = const SyncState(isSyncing: true, message: 'Avvio sincronizzazione...');
     try {
+      final agentiDao = ref.read(agentiDaoProvider);
+      final agente = await agentiDao.findByCode(codAgente);
+      if (agente?.pwd != null) {
+        final authService = ref.read(authServiceProvider);
+        final token = await authService.loginRemote(codAgente, agente!.pwd!);
+        ref.read(apiServiceProvider).token = token;
+      }
+      _update('Token JWT acquisito', 0.02);
+
       final parametriDao = ref.read(parametriDaoProvider);
       final ordineSync = ref.read(ordineSyncServiceProvider);
       final filialeSync = ref.read(filialeSyncServiceProvider);
@@ -133,6 +148,19 @@ class SyncNotifier extends Notifier<SyncState> {
       await parametriDao.set('lastUpdate', newLastUpdate);
 
       state = const SyncState(message: 'Sincronizzazione completata!', progress: 1.0);
+
+      ref.invalidate(articleSearchProvider);
+      ref.invalidate(activeArticleSearchProvider);
+      ref.invalidate(priceCodesProvider);
+      ref.invalidate(customerListProvider);
+      ref.invalidate(customerSearchProvider);
+      ref.invalidate(customerDestinationsProvider);
+      ref.invalidate(customerPaymentsProvider);
+      ref.invalidate(ordersViewProvider);
+      ref.invalidate(ordersSearchViewProvider);
+      ref.invalidate(orderStatsProvider);
+      ref.invalidate(dashboardProvider);
+      ref.invalidate(paymentsProvider);
     } catch (e) {
       state = SyncState(error: e.toString(), message: 'Errore durante la sincronizzazione');
     }

+ 14 - 5
lib/services/api_service.dart

@@ -8,6 +8,8 @@ class ApiService {
 
   ApiService(this._parametriDao);
 
+  String? token;
+
   Future<String> getBaseUrl() async {
     final url = await _parametriDao.read(AppConstants.kUrlParam);
     return url ?? '';
@@ -50,14 +52,21 @@ class ApiService {
     final uri = Uri.parse('$base$path');
     final response = await http.post(
       uri,
-      headers: {'Content-Type': 'application/json'},
+      headers: _headers,
       body: body,
     ).timeout(const Duration(minutes: 5));
     return jsonDecode(response.body) as Map<String, dynamic>;
   }
 
-  Map<String, String> get _headers => {
-    'Content-Type': 'application/json',
-    'Accept': 'application/json',
-  };
+  Map<String, String> get _headers {
+    final headers = <String, String>{
+      'Content-Type': 'application/json',
+      'Accept': 'application/json',
+    };
+    final t = token;
+    if (t != null && t.isNotEmpty) {
+      headers['Authorization'] = 'Bearer $t';
+    }
+    return headers;
+  }
 }

+ 33 - 7
lib/services/auth_service.dart

@@ -1,8 +1,9 @@
+import 'dart:convert';
 import 'package:drift/drift.dart';
+import 'package:http/http.dart' as http;
 import '../database/daos/agenti_dao.dart';
 import '../database/daos/parametri_dao.dart';
 import '../database/database.dart';
-import '../database/tables/parametri.dart';
 import '../core/constants.dart';
 import 'api_service.dart';
 
@@ -17,6 +18,29 @@ class AuthService {
     return _agentiDao.authenticate(code, password);
   }
 
+  Future<String> loginRemote(String code, String password) async {
+    final url = await _parametriDao.read(AppConstants.kUrlParam);
+    if (url == null || url.isEmpty) {
+      throw Exception('URL del backend non configurato');
+    }
+    final uri = Uri.parse('$url/rest/auth/agent-login');
+    final response = await http
+        .post(
+          uri,
+          headers: {
+            'Content-Type': 'application/json',
+            'Accept': 'application/json',
+          },
+          body: jsonEncode({'codAgente': code, 'password': password}),
+        )
+        .timeout(const Duration(seconds: 30));
+    final resp = jsonDecode(response.body) as Map<String, dynamic>;
+    if (resp['token'] != null) {
+      return resp['token'] as String;
+    }
+    throw Exception(resp['message'] ?? 'Autenticazione remota fallita');
+  }
+
   Future<bool> checkRemoteAgent(String code) async {
     try {
       final resp = await _apiService.get('/rest/agente/esisteNew/$code');
@@ -33,12 +57,14 @@ class AuthService {
     required String url,
   }) async {
     await _parametriDao.set(AppConstants.kUrlParam, url);
-    await _agentiDao.insertAgente(AgentiCompanion(
-      codAgente: Value(codAgente),
-      pwd: Value(pwd),
-      ragioneSociale: Value(ragioneSociale ?? codAgente),
-      attivo: const Value(1),
-    ));
+    await _agentiDao.insertAgente(
+      AgentiCompanion(
+        codAgente: Value(codAgente),
+        pwd: Value(pwd),
+        ragioneSociale: Value(ragioneSociale ?? codAgente),
+        attivo: const Value(1),
+      ),
+    );
   }
 
   Future<String?> getSavedUrl() => _parametriDao.read(AppConstants.kUrlParam);

+ 17 - 2
lib/services/image_service.dart

@@ -10,8 +10,21 @@ class ImageService {
 
   ImageService(this._parametriDao);
 
+  String? token;
+
   Future<String?> getBaseUrl() => _parametriDao.read(AppConstants.kUrlParam);
 
+  Map<String, String> get _headers {
+    final headers = <String, String>{
+      'Accept': 'application/json',
+    };
+    final t = token;
+    if (t != null && t.isNotEmpty) {
+      headers['Authorization'] = 'Bearer $t';
+    }
+    return headers;
+  }
+
   String get _imageDir => 'PowerAge/images';
 
   Future<File?> getImage(String codArticolo, {bool thumb = true}) async {
@@ -29,8 +42,10 @@ class ImageService {
       final endpoint = thumb
           ? '/rest/articoli/image/thumb/$codArticolo'
           : '/rest/articoli/image/$codArticolo';
-      final response = await http.get(Uri.parse('$baseUrl$endpoint'))
-          .timeout(const Duration(seconds: 30));
+      final response = await http.get(
+        Uri.parse('$baseUrl$endpoint'),
+        headers: _headers,
+      ).timeout(const Duration(seconds: 30));
       if (response.statusCode == 200 && response.bodyBytes.isNotEmpty) {
         await localFile.writeAsBytes(response.bodyBytes);
         return localFile;