Files
flux/lib/features/tracking/data/tracking_repository.dart
2026-05-20 11:03:33 +02:00

56 lines
1.9 KiB
Dart

import 'package:flux/core/enums_and_consts/consts.dart';
import 'package:flux/features/tracking/models/tracking_model.dart';
import 'package:get_it/get_it.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
class TrackingRepository {
final SupabaseClient _supabase = GetIt.I.get<SupabaseClient>();
TrackingRepository();
/// Recupera la cronologia di un'entità (Ticket o Operazione)
Future<List<TrackingModel>> getTrackingsByParent({
required String parentId, // <-- Reso obbligatorio
required TrackingParentType parentType, // <-- Reso obbligatorio
}) async {
// Facciamo la query con la JOIN per recuperare il nome dello staff al volo
final response = await _supabase
.from(Tables.trackings)
.select('*, ${Tables.staffMembers}(name)')
.eq('parent_id', parentId)
.eq('parent_type', parentType.name)
.order('created_at', ascending: false);
return response.map((map) => TrackingModel.fromMap(map)).toList();
}
/// Inserisce un nuovo evento di tracking
Future<void> logEvent(TrackingModel tracking) async {
await _supabase.from(Tables.trackings).insert(tracking.toMap());
}
/// Metodo helper rapido per loggare un cambio di stato o una nota
Future<void> logQuickEvent({
required String companyId,
required String message,
required TrackingType type,
required String parentId, // <-- Reso obbligatorio
required TrackingParentType parentType, // <-- Reso obbligatorio
String? staffId,
bool isInternal = true,
}) async {
final log = TrackingModel(
createdAt:
DateTime.now(), // Questo verrà ignorato dal toMap in fase di insert, ma serve al modello
companyId: companyId,
staffId: staffId,
parentId: parentId,
parentType: parentType,
eventType: type,
isInternal: isInternal,
message: message,
);
await logEvent(log);
}
}