From e2cedaf2356e85f6fba8ddb3a209b1b01818ba62 Mon Sep 17 00:00:00 2001 From: "torok.istvan" Date: Mon, 10 Aug 2026 00:11:41 +0200 Subject: [PATCH] =?UTF-8?q?Felh=C5=91=20projekt=20l=C3=A9trehoz=C3=A1sakor?= =?UTF-8?q?=20keletkett=20hiba=20jav=C3=ADt=C3=A1sa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/services/app_database.dart | 10 ++++++ lib/services/project_service.dart | 59 +++++++++++++++---------------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/lib/services/app_database.dart b/lib/services/app_database.dart index 1751ec0..1d2d9d5 100644 --- a/lib/services/app_database.dart +++ b/lib/services/app_database.dart @@ -1581,4 +1581,14 @@ class AppDatabase { 'Projekt helyi törlése: "$name" (id=$localProjectId) — a szerveren ' 'már nem szerepel a tagsági listában (törölve vagy kikerültünk).'); } + + /// Egy projekt aktuális szinkron-állapota — nyers oszlop-lekérdezés, + /// hogy a Project modellt ne kelljen ezért bővíteni. + Future getProjectSyncStatus(int id) async { + final db = await database; + final rows = await db.query('projects', + columns: ['sync_status'], where: 'id = ?', whereArgs: [id], limit: 1); + if (rows.isEmpty) return null; + return rows.first['sync_status'] as String?; + } } diff --git a/lib/services/project_service.dart b/lib/services/project_service.dart index b79297c..d4dad76 100644 --- a/lib/services/project_service.dart +++ b/lib/services/project_service.dart @@ -103,39 +103,38 @@ class ProjectService extends GetxService { }); throw ProjectRequiresLoginException(); } - // Felhős projektnél: AZONNALI, élő ellenőrzés — nem várjuk meg a - // háttér-reconcile 3 ciklusos türelmi idejét. Az azért van, hogy egy - // ÁTMENETI hálózati/RLS-hiccup ne váltson ki téves törlést — itt - // viszont egyetlen, konkrét projektet kérdezünk le frissen, ahol - // nincs ilyen bizonytalanság: a deleted_at vagy ki van töltve, vagy - // nincs. Egy már bizonyítottan törölt projekthez való csatlakozás - // komoly félreértések forrása lenne (adatrögzítés egy halott - // projektbe), ezt nem érdemes kockáztatni pár perc türelmi idő - // kedvéért. if (!project.isLocalOnly) { - try { - final row = await Supabase.instance.client - .from('terepi_seged_projects') - .select('deleted_at') - .eq('id', project.uuid) - .maybeSingle() - .timeout(const Duration(seconds: 6)); + // Az élő ellenőrzés CSAK olyan projektnél fusson, ami már egyszer + // BIZONYÍTOTTAN felkerült a szerverre (sync_status == 'synced'). + // Egy ÉPP MOST létrehozott, még feltöltés alatt álló projektnél a + // szerveren természetesen még nem létezik a sor — ez NEM törlést + // jelent, csak azt, hogy a háttér-feltöltés még fut/nem futott le, + // és tévesen "törölve" hibát adna, ha itt is lefutna a check. + final syncStatus = + await AppDatabase.instance.getProjectSyncStatus(project.id!); + if (syncStatus == 'synced') { + try { + final row = await Supabase.instance.client + .from('terepi_seged_projects') + .select('deleted_at') + .eq('id', project.uuid) + .maybeSingle() + .timeout(const Duration(seconds: 6)); - if (row == null || row['deleted_at'] != null) { - AppLogger.event('project_activate_blocked_deleted', '', { - 'project_id': project.id, - 'device_id': DeviceIdentityService.to.deviceId, - 'device_name': DeviceIdentityService.to.deviceLabel.value, - 'user_id': Supabase.instance.client.auth.currentUser?.id, - }); - throw ProjectNoLongerExistsException(); + if (row == null || row['deleted_at'] != null) { + AppLogger.event('project_activate_blocked_deleted', '', { + 'project_id': project.id, + 'device_id': DeviceIdentityService.to.deviceId, + 'device_name': DeviceIdentityService.to.deviceLabel.value, + 'user_id': Supabase.instance.client.auth.currentUser?.id, + }); + throw ProjectNoLongerExistsException(); + } + } on ProjectNoLongerExistsException { + rethrow; + } catch (_) { + // Hálózati hiba/időtúllépés → NEM blokkolunk emiatt (fail-open). } - } on ProjectNoLongerExistsException { - rethrow; - } catch (_) { - // Hálózati hiba/időtúllépés → NEM blokkolunk emiatt (fail-open, - // offline-first elv) — ha tényleg törölve van, a háttér-reconcile - // úgyis elkapja hamarosan. } }