Parcourir la source

Actualizacion de permisos, usuarios y usuarios permisos cuando la fecha de modificado sea mas reciente

OscarGil03 il y a 7 mois
Parent
commit
db2b9090e7
1 fichiers modifiés avec 58 ajouts et 5 suppressions
  1. 58 5
      lib/services/repo_service.dart

+ 58 - 5
lib/services/repo_service.dart

@@ -994,8 +994,8 @@ class RepoService<T> {
         await RepoService().guardar(productoApi);
       } else {
         // Producto sin cambios
-        print(
-            "Producto sin cambios o datos insuficientes: ${productoApi.nombre}");
+        // print(
+        //     "Producto sin cambios o datos insuficientes: ${productoApi.nombre}");
       }
     }
   }
@@ -1036,10 +1036,17 @@ class RepoService<T> {
         orElse: () => Permiso(),
       );
 
-      if (permisoLocal.id != null && permisoApi.modificado != null) {
+      if (permisoLocal.id != null &&
+          permisoApi.modificado != null &&
+          (permisoLocal.modificado == null ||
+              permisoApi.modificado!.isAfter(permisoLocal.modificado!))) {
+        print('Actualizando permiso con ID: ${permisoApi.id}');
         await RepoService().guardar(permisoApi);
       } else if (permisoLocal.id == null) {
+        print('Insertando nuevo permiso con ID: ${permisoApi.id}');
         await RepoService().guardar(permisoApi);
+      } else {
+        //print('Permiso sin cambios: ${permisoApi.id}');
       }
     }
   }
@@ -1057,24 +1064,60 @@ class RepoService<T> {
         orElse: () => Usuario(),
       );
 
+      // Comprobar si realmente se necesita actualizar el usuario basado en la fecha de modificado
       if (usuarioLocal.id != 0 &&
           usuarioApi.modificado != null &&
           (usuarioLocal.modificado == null ||
               usuarioApi.modificado!.isAfter(usuarioLocal.modificado!))) {
+        print('Actualizando usuario con ID: ${usuarioApi.id}');
         await RepoService().guardar(usuarioApi);
-        await _guardarPermisosUsuario(db, usuarioApi.id!, usuarioApi.permisos!);
-      } else {
+
+        // Comparar permisos antes de actualizarlos
+        await _actualizarPermisosUsuario(
+            db, usuarioApi.id!, usuarioApi.permisos!);
+      } else if (usuarioLocal.id == 0) {
+        print('Insertando nuevo usuario con ID: ${usuarioApi.id}');
         await RepoService().guardar(usuarioApi);
+
+        // Insertar los permisos correspondientes
         await _guardarPermisosUsuario(db, usuarioApi.id!, usuarioApi.permisos!);
+      } else {
+        //print('Usuario sin cambios: ${usuarioApi.id}');
       }
     }
   }
 
+  Future<void> _actualizarPermisosUsuario(
+      Database db, int idUsuario, List<String> permisosApi) async {
+    // Obtener los permisos actuales del usuario
+    var permisosLocalesQuery = await db.query(
+      'UsuarioPermiso',
+      where: 'idUsuario = ?',
+      whereArgs: [idUsuario],
+    );
+    List<String> permisosLocales = permisosLocalesQuery
+        .map((permiso) => permiso['idPermiso'] as String)
+        .toList();
+
+    // Comparar los permisos del API con los locales
+    bool sonIguales = _listasIguales(permisosLocales, permisosApi);
+
+    if (!sonIguales) {
+      // Si los permisos no son iguales, actualizarlos
+      print('Actualizando permisos del usuario con ID: $idUsuario');
+      await _guardarPermisosUsuario(db, idUsuario, permisosApi);
+    } else {
+      print('Permisos del usuario con ID: $idUsuario no han cambiado.');
+    }
+  }
+
   Future<void> _guardarPermisosUsuario(
       Database db, int idUsuario, List<String> permisos) async {
+    // Eliminar los permisos actuales solo si hay cambios
     await db.delete('UsuarioPermiso',
         where: 'idUsuario = ?', whereArgs: [idUsuario]);
 
+    // Insertar los nuevos permisos
     for (var idPermiso in permisos) {
       await db.insert('UsuarioPermiso', {
         'idUsuario': idUsuario,
@@ -1082,4 +1125,14 @@ class RepoService<T> {
       });
     }
   }
+
+  bool _listasIguales(List<String> lista1, List<String> lista2) {
+    if (lista1.length != lista2.length) return false;
+    lista1.sort();
+    lista2.sort();
+    for (int i = 0; i < lista1.length; i++) {
+      if (lista1[i] != lista2[i]) return false;
+    }
+    return true;
+  }
 }