diff --git a/lib/features/services/data/services_repository.dart b/lib/features/services/data/services_repository.dart new file mode 100644 index 0000000..aae513f --- /dev/null +++ b/lib/features/services/data/services_repository.dart @@ -0,0 +1,83 @@ +import 'package:supabase_flutter/supabase_flutter.dart'; +import '../models/service_model.dart'; +// Importa gli altri modelli se sono in file separati + +class ServicesRepository { + final _supabase = Supabase.instance.client; + + // --- RECUPERO TUTTI I SERVIZI --- + Future> fetchAllServices() async { + try { + // La stringa di selezione tira giù il padre e TUTTI i record correlati dalle tabelle figlie + final response = await _supabase + .from('service') + .select(''' + *, + energy_service(*), + fin_service(*), + entertainment_service(*) + ''') + .order('created_at', ascending: false); + + return (response as List) + .map((map) => ServiceModel.fromMap(map)) + .toList(); + } catch (e) { + throw Exception('Errore nel recupero servizi: $e'); + } + } + + // --- SALVATAGGIO COMPLETO (A CASCATA) --- + Future saveFullService(ServiceModel service) async { + try { + // 1. Inserimento Padre + final serviceData = await _supabase + .from('service') + .insert(service.toMap()) + .select() + .single(); + + final String newId = serviceData['id']; + + // 2. Inserimento Energy (se presenti) + if (service.energyServices.isNotEmpty) { + final List> energyToInsert = []; + for (var item in service.energyServices) { + energyToInsert.add(item.copyWith(serviceId: newId).toMap()); + } + await _supabase.from('energy_service').insert(energyToInsert); + } + + // 3. Inserimento Finanziamenti (se presenti) + if (service.finServices.isNotEmpty) { + final List> finToInsert = []; + for (var item in service.finServices) { + finToInsert.add(item.copyWith(serviceId: newId).toMap()); + } + await _supabase.from('fin_service').insert(finToInsert); + } + + // 4. Inserimento Entertainment (se presenti) + if (service.entertainmentServices.isNotEmpty) { + final List> entToInsert = []; + for (var item in service.entertainmentServices) { + entToInsert.add(item.copyWith(serviceId: newId).toMap()); + } + await _supabase.from('entertainment_service').insert(entToInsert); + } + } catch (e) { + throw Exception('Errore durante il salvataggio: $e'); + } + } + + // --- ELIMINAZIONE --- + // Grazie ai "ON DELETE CASCADE" che hai messo nell'SQL, + // cancellando il padre Supabase pialla automaticamente i figli. Top! + Future deleteService(String id) async { + try { + await _supabase.from('service').delete().eq('id', id); + } catch (e) { + throw Exception('Errore durante l\'eliminazione: $e'); + } + } +} diff --git a/lib/features/services/models/energy_service_model.dart b/lib/features/services/models/energy_service_model.dart index a0e8547..9cf9b54 100644 --- a/lib/features/services/models/energy_service_model.dart +++ b/lib/features/services/models/energy_service_model.dart @@ -7,7 +7,7 @@ class EnergyServiceModel extends Equatable { final DateTime? createdAt; final EnergyType type; final DateTime expiration; - final String gestoreId; + final String providerId; final String? serviceId; const EnergyServiceModel({ @@ -15,7 +15,7 @@ class EnergyServiceModel extends Equatable { this.createdAt, required this.type, required this.expiration, - required this.gestoreId, + required this.providerId, this.serviceId, }); @@ -24,7 +24,7 @@ class EnergyServiceModel extends Equatable { DateTime? createdAt, EnergyType? type, DateTime? expiration, - String? gestoreId, + String? providerId, String? serviceId, }) { return EnergyServiceModel( @@ -32,7 +32,7 @@ class EnergyServiceModel extends Equatable { createdAt: createdAt ?? this.createdAt, type: type ?? this.type, expiration: expiration ?? this.expiration, - gestoreId: gestoreId ?? this.gestoreId, + providerId: providerId ?? this.providerId, serviceId: serviceId ?? this.serviceId, ); } @@ -43,7 +43,7 @@ class EnergyServiceModel extends Equatable { createdAt, type, expiration, - gestoreId, + providerId, serviceId, ]; @@ -55,7 +55,7 @@ class EnergyServiceModel extends Equatable { : null, type: map['type'] == 'gas' ? EnergyType.gas : EnergyType.luce, expiration: DateTime.parse(map['expiration']), - gestoreId: map['gestore_id'], + providerId: map['provider_id'], serviceId: map['service_id'], ); } @@ -65,7 +65,7 @@ class EnergyServiceModel extends Equatable { if (id != null) 'id': id, 'type': type.name, // .name trasforma l'enum in 'luce' o 'gas' 'expiration': expiration.toIso8601String(), - 'gestore_id': gestoreId, + 'provider_id': providerId, 'service_id': serviceId, }; } diff --git a/lib/features/services/models/entertainment_service_model.dart b/lib/features/services/models/entertainment_service_model.dart index f52de08..f34743a 100644 --- a/lib/features/services/models/entertainment_service_model.dart +++ b/lib/features/services/models/entertainment_service_model.dart @@ -7,6 +7,7 @@ class EntertainmentServiceModel extends Equatable { final bool constrained; // Vincolato? final DateTime constrainExpiration; final String? serviceId; + final String? providerId; const EntertainmentServiceModel({ this.id, @@ -15,6 +16,7 @@ class EntertainmentServiceModel extends Equatable { required this.constrained, required this.constrainExpiration, this.serviceId, + this.providerId, }); EntertainmentServiceModel copyWith({ @@ -24,6 +26,7 @@ class EntertainmentServiceModel extends Equatable { bool? constrained, DateTime? constrainExpiration, String? serviceId, + String? providerId, }) { return EntertainmentServiceModel( id: id ?? this.id, @@ -32,6 +35,7 @@ class EntertainmentServiceModel extends Equatable { constrained: constrained ?? this.constrained, constrainExpiration: constrainExpiration ?? this.constrainExpiration, serviceId: serviceId ?? this.serviceId, + providerId: providerId ?? this.providerId, ); } @@ -43,6 +47,7 @@ class EntertainmentServiceModel extends Equatable { constrained, constrainExpiration, serviceId, + providerId, ]; factory EntertainmentServiceModel.fromMap(Map map) { @@ -55,6 +60,7 @@ class EntertainmentServiceModel extends Equatable { constrained: map['constrained'] ?? false, constrainExpiration: DateTime.parse(map['constrain_expiration']), serviceId: map['service_id'], + providerId: map['provider_id'], ); } @@ -65,6 +71,7 @@ class EntertainmentServiceModel extends Equatable { 'constrained': constrained, 'constrain_expiration': constrainExpiration.toIso8601String(), 'service_id': serviceId, + 'provider_id': providerId, }; } } diff --git a/lib/features/services/models/fin_service_model.dart b/lib/features/services/models/fin_service_model.dart index 9a0f776..9cdaa5a 100644 --- a/lib/features/services/models/fin_service_model.dart +++ b/lib/features/services/models/fin_service_model.dart @@ -6,6 +6,7 @@ class FinServiceModel extends Equatable { final DateTime expiration; final String? serviceId; final String? modelId; // FK verso model (es. iPhone, Samsung, ecc.) + final String? providerId; const FinServiceModel({ this.id, @@ -13,6 +14,7 @@ class FinServiceModel extends Equatable { required this.expiration, this.serviceId, this.modelId, + this.providerId, }); FinServiceModel copyWith({ @@ -21,6 +23,7 @@ class FinServiceModel extends Equatable { DateTime? expiration, String? serviceId, String? modelId, + String? providerId, }) { return FinServiceModel( id: id ?? this.id, @@ -28,6 +31,7 @@ class FinServiceModel extends Equatable { expiration: expiration ?? this.expiration, serviceId: serviceId ?? this.serviceId, modelId: modelId ?? this.modelId, + providerId: providerId ?? this.providerId, ); } @@ -43,6 +47,7 @@ class FinServiceModel extends Equatable { expiration: DateTime.parse(map['expiration']), serviceId: map['service_id'], modelId: map['model_id'], + providerId: map['provider_id'], ); } @@ -52,6 +57,7 @@ class FinServiceModel extends Equatable { 'expiration': expiration.toIso8601String(), 'service_id': serviceId, 'model_id': modelId, + 'provider_id': providerId, }; } }