From eceb8dbcca0666ab844acb6d64e8e88a4797de01 Mon Sep 17 00:00:00 2001 From: "dmit.b" Date: Sat, 9 May 2026 09:35:31 +0300 Subject: [PATCH] Fix: link share_id to geo_id so /watch returns correct position --- bin/database/database_provider.dart | 32 ++++++++++++++++++++++++----- bin/routes/auth_routes.dart | 5 +++-- bin/routes/geo_routes.dart | 2 +- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/bin/database/database_provider.dart b/bin/database/database_provider.dart index a22d8b1..31de68f 100644 --- a/bin/database/database_provider.dart +++ b/bin/database/database_provider.dart @@ -12,7 +12,7 @@ import '../models/log.dart'; class DatabaseProvider { late Connection _dbConnection; - final Map _shareLinks = {}; + final Map _shareLinks = {}; final _uuid = const Uuid(); Future initialize() async { @@ -284,6 +284,28 @@ Future getLatestPosition() async { ); } + Future getPositionById(String id) async { + final results = await _dbConnection.execute( + Sql.named(''' + SELECT id, x_value, y_value, last_update, expires_at + FROM geopositions + WHERE id = @id AND expires_at > NOW() + '''), + parameters: {'id': id}, + ); + + if (results.isEmpty) return null; + + final row = results.first; + return Geoposition( + id: row[0].toString(), + xValue: double.parse(row[1].toString()), + yValue: double.parse(row[2].toString()), + lastUpdate: DateTime.parse(row[3].toString()), + expiresAt: DateTime.parse(row[4].toString()), + ); + } + Future cleanupExpired() async { await _dbConnection.execute( Sql.named('DELETE FROM geopositions WHERE expires_at < NOW()'), @@ -292,14 +314,14 @@ Future getLatestPosition() async { // ==================== Share operations ==================== - String createShareId() { + String createShareId(String geoId) { final uniqueId = _uuid.v4(); - _shareLinks[uniqueId] = true; + _shareLinks[uniqueId] = geoId; return uniqueId; } - bool isValidShareId(String uniqueId) { - return _shareLinks[uniqueId] == true; + String? getGeoIdByShareId(String uniqueId) { + return _shareLinks[uniqueId]; } // ==================== Log operations ==================== diff --git a/bin/routes/auth_routes.dart b/bin/routes/auth_routes.dart index fa3d8ea..59e910e 100644 --- a/bin/routes/auth_routes.dart +++ b/bin/routes/auth_routes.dart @@ -61,13 +61,14 @@ class AuthRoutes { Future _watch(Request request, String login) async { final uniqueId = request.url.queryParameters['unique_id']; + final geoId = database.getGeoIdByShareId(uniqueId!); - if (!database.isValidShareId(uniqueId!)) { + if (geoId == null) { await database.createLog(login, 'Accessed invalid share link'); return Response(404, body: jsonEncode({'error': 'Share link not found'}), headers: {'Content-Type': 'application/json'}); } - final position = await database.getLatestPosition(); + final position = await database.getPositionById(geoId); if (position == null) { await database.createLog(login, 'Accessed share link - no position'); diff --git a/bin/routes/geo_routes.dart b/bin/routes/geo_routes.dart index 31cb4c7..4da292c 100644 --- a/bin/routes/geo_routes.dart +++ b/bin/routes/geo_routes.dart @@ -37,7 +37,7 @@ class GeoRoutes { final y = data['y']; final position = await database.createPosition(x, y); - final shareId = database.createShareId(); + final shareId = database.createShareId(position.id); await database.createLog(login, 'Created share link geo_id=${position.id}'); return Response(201, body: jsonEncode({