From 07908ecaa14bb693e88179a47db228d64f86ff2f Mon Sep 17 00:00:00 2001 From: "torok.istvan" Date: Tue, 7 Jul 2026 03:25:51 +0200 Subject: [PATCH] =?UTF-8?q?Adatb=C3=A1zis=20=C3=A9s=20szinkroniz=C3=A1ci?= =?UTF-8?q?=C3=B3s=20hibajav=C3=ADt=C3=A1sok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...otlin-compiler-14046800171960427801.salive | 0 lib/main.dart | 2 ++ lib/services/app_database.dart | 36 ++++++++++++++++--- lib/services/device_identity_service.dart | 2 ++ lib/services/layer_sync_service.dart | 10 +++--- lib/services/stakeout_sync_service.dart | 4 +-- lib/services/ts_sync_service.dart | 5 +++ 7 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 android/.kotlin/sessions/kotlin-compiler-14046800171960427801.salive diff --git a/android/.kotlin/sessions/kotlin-compiler-14046800171960427801.salive b/android/.kotlin/sessions/kotlin-compiler-14046800171960427801.salive new file mode 100644 index 0000000..e69de29 diff --git a/lib/main.dart b/lib/main.dart index 585a3b4..96b786e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -23,6 +23,7 @@ import 'package:terepi_seged/services/note_photo_service.dart'; import 'package:terepi_seged/services/ntrip_service.dart'; import 'package:terepi_seged/services/project_service.dart'; import 'package:terepi_seged/services/stakeout_service.dart'; +import 'package:terepi_seged/services/stakeout_sync_service.dart'; import 'package:terepi_seged/services/tilt_service.dart'; import 'package:terepi_seged/services/track_sync_service.dart'; import 'package:terepi_seged/services/ts_sync_service.dart'; @@ -67,6 +68,7 @@ Future main() async { Get.put(LayerImportService(), permanent: true); Get.put(TrackSyncService(), permanent: true); Get.put(LayerSyncService()); + Get.put(StakeoutSyncService()); Get.put(TsSyncService()); Get.put(TiltService()); diff --git a/lib/services/app_database.dart b/lib/services/app_database.dart index 877b942..24dbfdd 100644 --- a/lib/services/app_database.dart +++ b/lib/services/app_database.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:get/get.dart'; import 'package:path_provider/path_provider.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart' as p; @@ -482,7 +483,10 @@ class AppDatabase { Future insertTrack(Track track) async { final db = await database; final map = _withSyncColumns(track.toMap()); - map['device_id'] ??= DeviceIdentityService.to.deviceId; + map['device_id'] ??= Get.isRegistered() && + DeviceIdentityService.to.isReady + ? DeviceIdentityService.to.appInstanceId + : null; return db.insert('tracks', map); } @@ -859,7 +863,10 @@ class AppDatabase { Future insertMeasuredPoint(MeasuredPoint point) async { final db = await database; final map = _withSyncColumns(point.toMap()); - map['device_id'] ??= DeviceIdentityService.to.deviceId; + map['device_id'] ??= Get.isRegistered() && + DeviceIdentityService.to.isReady + ? DeviceIdentityService.to.appInstanceId + : null; return db.insert('measured_points', map); } @@ -951,7 +958,11 @@ class AppDatabase { Future insertStakeoutPoint(StakeoutPoint p) async { final db = await database; final map = p.toMap(); - map['device_id'] ??= DeviceIdentityService.to.deviceId; + map['device_id'] ??= Get.isRegistered() && + DeviceIdentityService.to.isReady + ? DeviceIdentityService.to.appInstanceId + : null; + ; return db.insert('stakeout_points', map); } @@ -971,7 +982,10 @@ class AppDatabase { limit: 1); if (dup.isNotEmpty) continue; final map = p.toMap(); - map['device_id'] ??= DeviceIdentityService.to.deviceId; + map['device_id'] ??= Get.isRegistered() && + DeviceIdentityService.to.isReady + ? DeviceIdentityService.to.appInstanceId + : null; await txn.insert('stakeout_points', map); inserted++; } @@ -1249,4 +1263,18 @@ class AppDatabase { await db.insert('imported_layers', map, conflictAlgorithm: ConflictAlgorithm.replace); } + + /// Egyszeri javítás: a korábban ANDROID_ID-vel (vagy üresen) beírt + /// device_id-k cseréje az appInstanceId-re. A sorok ezen az eszközön + /// keletkeztek, így a csere helyes; a sync_status visszaáll pending-re, + /// hogy a helyes érték felmenjen. + Future repairDeviceIds(String correctId) async { + final db = await database; + for (final t in ['measured_points', 'tracks', 'stakeout_points']) { + await db.rawUpdate( + "UPDATE $t SET device_id = ?, sync_status = 'pending' " + "WHERE device_id IS NOT NULL AND length(device_id) <> 36", + [correctId]); + } + } } diff --git a/lib/services/device_identity_service.dart b/lib/services/device_identity_service.dart index c8dc103..9591e4e 100644 --- a/lib/services/device_identity_service.dart +++ b/lib/services/device_identity_service.dart @@ -15,6 +15,7 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:get/get.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; +import 'package:terepi_seged/services/app_database.dart'; import 'package:terepi_seged/services/app_logger.dart'; import 'package:terepi_seged/services/firebase_logger.dart'; import 'package:uuid/uuid.dart'; @@ -61,6 +62,7 @@ class DeviceIdentityService extends GetxService { // Háttérben regisztrálás — nem blokkolja az UI-t _isReady = true; unawaited(registerDevice()); + unawaited(AppDatabase.instance.repairDeviceIds(info.appInstanceId)); FirebaseLogger.setDeviceIdentifier(info.deviceId, deviceLabel.value); FirebaseLogger.setKey('model', model); diff --git a/lib/services/layer_sync_service.dart b/lib/services/layer_sync_service.dart index faf8cdd..a76301b 100644 --- a/lib/services/layer_sync_service.dart +++ b/lib/services/layer_sync_service.dart @@ -25,7 +25,7 @@ import '../models/imported_layer_meta.dart'; class LayerSyncService extends GetxService { static LayerSyncService get to => Get.find(); - static const bucket = 'ts-layers'; + static const bucket = 'terepi_seged-layers'; final isSyncing = false.obs; @@ -64,7 +64,7 @@ class LayerSyncService extends GetxService { Future _pullProjectLayers( int localProjectId, String projectUuid) async { final rows = await _client - .from('ts_layers') + .from('terepi_seged_layers') .select() .eq('project_id', projectUuid) .filter('deleted_at', 'is', null); @@ -126,13 +126,13 @@ class LayerSyncService extends GetxService { // 2. Verzió léptetése, ha már létezik a sor. final existing = await _client - .from('ts_layers') + .from('terepi_seged_layers') .select('version') .eq('id', id) .maybeSingle(); final newVersion = ((existing?['version'] as int?) ?? 0) + 1; - await _client.from('ts_layers').upsert({ + await _client.from('terepi_seged_layers').upsert({ 'id': id, 'project_id': projectUuid, 'name': layer.name, @@ -154,7 +154,7 @@ class LayerSyncService extends GetxService { /// Réteg visszavonása a megosztásból (soft delete a szerveren; /// a lokális cache-példányok megmaradnak az eszközökön). Future unpublishLayer(String layerId) async { - await _client.from('ts_layers').update({ + await _client.from('terepi_seged_layers').update({ 'deleted_at': DateTime.now().toUtc().toIso8601String(), }).eq('id', layerId); } diff --git a/lib/services/stakeout_sync_service.dart b/lib/services/stakeout_sync_service.dart index 2c9617d..454cba3 100644 --- a/lib/services/stakeout_sync_service.dart +++ b/lib/services/stakeout_sync_service.dart @@ -98,7 +98,7 @@ class StakeoutSyncService extends GetxService { }) .toList(); - await _client.from('ts_stakeout_points').upsert(payload); + await _client.from('terepi_seged_stakeout_points').upsert(payload); await _db.markSyncedByUuid( 'stakeout_points', rows.map((r) => r['uuid'] as String).toList()); } @@ -116,7 +116,7 @@ class StakeoutSyncService extends GetxService { var maxSeen = cursor; final rows = await _client - .from('ts_stakeout_points') + .from('terepi_seged_stakeout_points') .select() .eq('project_id', project.uuid) .gt('updated_at', cursor) diff --git a/lib/services/ts_sync_service.dart b/lib/services/ts_sync_service.dart index eb3e9d4..aade8fd 100644 --- a/lib/services/ts_sync_service.dart +++ b/lib/services/ts_sync_service.dart @@ -5,6 +5,7 @@ import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:get/get.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:terepi_seged/services/device_identity_service.dart'; +import 'package:terepi_seged/services/stakeout_sync_service.dart'; import 'app_database.dart'; import 'layer_sync_service.dart'; @@ -93,6 +94,10 @@ class TsSyncService extends GetxService { await LayerSyncService.to.pullAll(); } + if (Get.isRegistered()) { + await StakeoutSyncService.to.sync(); + } + lastSyncedAt.value = DateTime.now(); } catch (e) { lastError.value = e.toString();