Kml parser utf-8 támogatás, induláskor minimum app verzió ellenőrzése

This commit is contained in:
2026-07-09 03:43:06 +02:00
parent 1e5601a10b
commit fc31acb80f
8 changed files with 301 additions and 29 deletions
+53 -27
View File
@@ -4,6 +4,7 @@ import 'package:get/get.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:terepi_seged/services/app_logger.dart';
import 'package:terepi_seged/services/layer_import_service.dart';
import 'package:uuid/uuid.dart';
@@ -29,6 +30,7 @@ class LayerSyncService extends GetxService {
static const bucket = 'terepi_seged-layers';
final isSyncing = false.obs;
final lastError = Rxn<String>();
SupabaseClient get _client => Supabase.instance.client;
AppDatabase get _db => AppDatabase.instance;
@@ -55,10 +57,14 @@ class LayerSyncService extends GetxService {
// Csak a szinkronizált (nem lokális) projektek rétegei érdekelnek.
final projects = await _db.listProjects();
for (final project in projects.where((pr) => !pr.isLocalOnly)) {
await _pullProjectLayers(project.id!, project.uuid);
try {
await _pullProjectLayers(project.id!, project.uuid);
} catch (e) {
// EGY projekt rétegeinek hibája ne akassza meg a többi
// projektet (vagy a háttér-szinkron többi lépését).
lastError.value = 'Réteg-szinkron hiba (${project.name}): $e';
}
}
// Ha közben egy csapattárs frissített/megosztott egy réteget, ez
// jelenjen meg a térképen azonnal, újraindítás nélkül.
if (Get.isRegistered<LayerImportService>()) {
await LayerImportService.to.reload();
}
@@ -77,34 +83,54 @@ class LayerSyncService extends GetxService {
for (final r in rows) {
final id = r['id'] as String;
final remoteVersion = (r['version'] as int?) ?? 1;
final localVersion = await _db.getImportedLayerVersion(id);
try {
final remoteVersion = (r['version'] as int?) ?? 1;
final localVersion = await _db.getImportedLayerVersion(id);
// Már megvan a legfrissebb verzió → nincs teendő.
if (localVersion >= remoteVersion) continue;
// Már megvan a legfrissebb verzió → nincs teendő.
if (localVersion >= remoteVersion) continue;
// Letöltés a Storage-ból, lokális cache-be.
final storagePath = r['storage_path'] as String;
final bytes = await _client.storage.from(bucket).download(storagePath);
// Letöltés a Storage-ból, lokális cache-be.
final storagePath = r['storage_path'] as String;
final bytes = await _client.storage.from(bucket).download(storagePath);
final dir = await _layerDir();
final localPath = p.join(dir.path, '$id.geojson');
await File(localPath).writeAsBytes(bytes, flush: true);
// A helyi fájl kiterjesztése kövesse a TÉNYLEGES forrás-típust —
// eddig mindig .geojson-nak mentette, ami a KML/KMZ rétegeket
// a GeoJSON-értelmezőre terelte (nyers zip-bájtok jsonDecode-ra).
final sourceType = (r['source_type'] as String?) ?? 'geojson';
final ext = switch (sourceType) {
'kml' => 'kml',
'kmz' => 'kmz',
_ => 'geojson',
};
// Metaadat upsert a meglévő imported_layers táblába — a térkép
// rétegkezelője innentől ugyanúgy látja, mint a kézi importot.
await _db.upsertImportedLayerRaw({
'id': id,
'name': r['name'],
'source_type': r['source_type'] ?? 'geojson',
'local_path': localPath,
'storage_path': storagePath,
'is_visible': 1,
'project_id': localProjectId,
'imported_at': r['created_at'] ?? DateTime.now().toIso8601String(),
'synced_at': DateTime.now().toIso8601String(),
'version': remoteVersion,
});
final dir = await _layerDir();
final localPath = p.join(dir.path, '$id.$ext');
await File(localPath).writeAsBytes(bytes, flush: true);
// Metaadat upsert a meglévő imported_layers táblába — a térkép
// rétegkezelője innentől ugyanúgy látja, mint a kézi importot.
await _db.upsertImportedLayerRaw({
'id': id,
'name': r['name'],
'source_type': sourceType,
'local_path': localPath,
'storage_path': storagePath,
'is_visible': 1,
'project_id': localProjectId,
'imported_at': r['created_at'] ?? DateTime.now().toIso8601String(),
'synced_at': DateTime.now().toIso8601String(),
'version': remoteVersion,
});
} catch (e) {
// EGY réteg hibája (jogosultság, hiányzó storage-fájl, hálózat)
// ne akassza meg a TÖBBI réteg letöltését — csak ezt hagyjuk ki,
// a következő ciklus újrapróbálja (a verziószám nem lép, tehát
// nem "felejtődik el" a hiba, csak nem blokkol tovább).
lastError.value = 'Réteg letöltési hiba ($id): $e';
print(lastError.value);
AppLogger.e('LAYER_SYNC', lastError.value!);
}
}
}