(Feat) Migration PocketBase
This commit is contained in:
@@ -1,19 +1,19 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import '../models/recompense.dart';
|
||||
import '../supabase_config.dart';
|
||||
import '../pocketbase_config.dart';
|
||||
|
||||
/// Source de vérité du catalogue de récompenses (table `recompenses` Supabase).
|
||||
/// Source de vérité du catalogue de récompenses (collection `recompenses`).
|
||||
class RecompenseRepository extends ChangeNotifier {
|
||||
RecompenseRepository._();
|
||||
static final RecompenseRepository instance = RecompenseRepository._();
|
||||
|
||||
final List<Recompense> _recompenses = [];
|
||||
bool _charge = false;
|
||||
bool _abonne = false;
|
||||
|
||||
List<Recompense> get recompenses => List.unmodifiable(_recompenses);
|
||||
|
||||
/// Uniquement les récompenses proposées (actives), triées par coût croissant.
|
||||
List<Recompense> get actives {
|
||||
final l = _recompenses.where((r) => r.actif).toList()
|
||||
..sort((a, b) => a.coutPoints.compareTo(b.coutPoints));
|
||||
@@ -25,25 +25,53 @@ class RecompenseRepository extends ChangeNotifier {
|
||||
Future<void> charger() async {
|
||||
try {
|
||||
final rows =
|
||||
await supabase.from('recompenses').select().order('cout_points');
|
||||
await pb.collection('recompenses').getFullList(sort: 'cout_points');
|
||||
_recompenses
|
||||
..clear()
|
||||
..addAll((rows as List).map((e) => Recompense.fromMap(e)));
|
||||
..addAll(rows.map((r) => Recompense.fromMap(r.toJson())));
|
||||
_charge = true;
|
||||
notifyListeners();
|
||||
await _sabonner();
|
||||
} catch (_) {
|
||||
// Ignore si non connecté ; sera rechargé après connexion.
|
||||
// Ignoré si non connecté ; rechargé après connexion.
|
||||
}
|
||||
}
|
||||
|
||||
/// Abonnement temps réel au catalogue (synchronisé entre appareils).
|
||||
Future<void> _sabonner() async {
|
||||
if (_abonne) return;
|
||||
_abonne = true;
|
||||
try {
|
||||
await pb.collection('recompenses').subscribe('*', (e) {
|
||||
final rec = e.record;
|
||||
if (rec == null) return;
|
||||
if (e.action == 'delete') {
|
||||
_recompenses.removeWhere((x) => x.id == rec.id);
|
||||
} else {
|
||||
final r = Recompense.fromMap(rec.toJson());
|
||||
final i = _recompenses.indexWhere((x) => x.id == r.id);
|
||||
if (i == -1) {
|
||||
_recompenses.add(r);
|
||||
} else {
|
||||
_recompenses[i] = r;
|
||||
}
|
||||
_trier();
|
||||
}
|
||||
notifyListeners();
|
||||
});
|
||||
} catch (_) {
|
||||
_abonne = false;
|
||||
}
|
||||
}
|
||||
|
||||
Future<Recompense> creer(
|
||||
{required String nom, required double coutPoints}) async {
|
||||
final row = await supabase
|
||||
.from('recompenses')
|
||||
.insert({'nom': nom.trim(), 'cout_points': coutPoints, 'actif': true})
|
||||
.select()
|
||||
.single();
|
||||
final cree = Recompense.fromMap(row);
|
||||
final rec = await pb.collection('recompenses').create(body: {
|
||||
'nom': nom.trim(),
|
||||
'cout_points': coutPoints,
|
||||
'actif': true,
|
||||
});
|
||||
final cree = Recompense.fromMap(rec.toJson());
|
||||
_recompenses.add(cree);
|
||||
_trier();
|
||||
notifyListeners();
|
||||
@@ -51,11 +79,11 @@ class RecompenseRepository extends ChangeNotifier {
|
||||
}
|
||||
|
||||
Future<void> modifier(Recompense r) async {
|
||||
await supabase.from('recompenses').update({
|
||||
await pb.collection('recompenses').update(r.id, body: {
|
||||
'nom': r.nom.trim(),
|
||||
'cout_points': r.coutPoints,
|
||||
'actif': r.actif,
|
||||
}).eq('id', r.id);
|
||||
});
|
||||
final i = _recompenses.indexWhere((e) => e.id == r.id);
|
||||
if (i != -1) _recompenses[i] = r;
|
||||
_trier();
|
||||
@@ -63,7 +91,7 @@ class RecompenseRepository extends ChangeNotifier {
|
||||
}
|
||||
|
||||
Future<void> supprimer(String id) async {
|
||||
await supabase.from('recompenses').delete().eq('id', id);
|
||||
await pb.collection('recompenses').delete(id);
|
||||
_recompenses.removeWhere((e) => e.id == id);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user