From 95c8ac7f63f19012611706872f2745b0aff7a7cd Mon Sep 17 00:00:00 2001 From: Syed Mustafa Ahmed Naqvi Date: Tue, 2 Jun 2026 14:35:10 +0500 Subject: [PATCH] Normalize Backend Scan Device Context Ensures backend scan requests use a resolved Device ID and logs backend startup Device ID details. --- Api/CanteenBackendHost.cs | 8 +++--- Services/ConfigService.cs | 27 ++++++++++++------- .../BackendHostConfigService.cs | 27 +++++++++++++++++-- .../CanteenBackendWorker.cs | 3 +++ ViewModels/ScannerDashboardViewModel.cs | 11 +++++--- 5 files changed, 58 insertions(+), 18 deletions(-) diff --git a/Api/CanteenBackendHost.cs b/Api/CanteenBackendHost.cs index 0cf5035..7b99ccd 100644 --- a/Api/CanteenBackendHost.cs +++ b/Api/CanteenBackendHost.cs @@ -111,7 +111,7 @@ public static class CanteenBackendHost if (method == "POST" && path.Equals("/api/rfid/scan", StringComparison.OrdinalIgnoreCase)) { - await HandleScanAsync(ctx, rfid).ConfigureAwait(false); + await HandleScanAsync(ctx, rfid, backend).ConfigureAwait(false); return; } @@ -310,7 +310,7 @@ public static class CanteenBackendHost } } - private static async Task HandleScanAsync(HttpListenerContext ctx, RfidService rfid) + private static async Task HandleScanAsync(HttpListenerContext ctx, RfidService rfid, CanteenBackendServices backend) { ScanRequest? dto; using (var reader = new StreamReader(ctx.Request.InputStream, ctx.Request.ContentEncoding)) @@ -339,7 +339,9 @@ public static class CanteenBackendHost var clientCtx = new RfidScanClientContext { - DeviceId = dto.DeviceId?.Trim() ?? string.Empty, + DeviceId = string.IsNullOrWhiteSpace(dto.DeviceId) + ? backend.Config.GetDeviceId() + : dto.DeviceId.Trim(), SiteId = dto.SiteId?.Trim() ?? string.Empty, IpAddress = ip }; diff --git a/Services/ConfigService.cs b/Services/ConfigService.cs index c995cfc..e95c545 100644 --- a/Services/ConfigService.cs +++ b/Services/ConfigService.cs @@ -129,23 +129,30 @@ public class ConfigService : IConfigService public string GetDeviceId() { - //var id = _config.DeviceId ?? string.Empty; - var id = Environment.MachineName; - if (string.IsNullOrWhiteSpace(id)) - { - id = Guid.NewGuid().ToString("N"); - _config.DeviceId = id; - SaveConfig(); - } - return id; + if (!string.IsNullOrWhiteSpace(_config.DeviceId)) + return _config.DeviceId.Trim(); + + _config.DeviceId = ResolveMachineDeviceId(); + SaveConfig(); + return _config.DeviceId; } public void SetDeviceId(string deviceId) { - _config.DeviceId = deviceId ?? string.Empty; + _config.DeviceId = string.IsNullOrWhiteSpace(deviceId) + ? ResolveMachineDeviceId() + : deviceId.Trim(); SaveConfig(); } + private static string ResolveMachineDeviceId() + { + var machineName = Environment.MachineName; + return string.IsNullOrWhiteSpace(machineName) + ? Guid.NewGuid().ToString("N") + : machineName.Trim(); + } + public bool GetRememberAdminCredentials() => _config.RememberAdminCredentials; public void SetRememberAdminCredentials(bool remember) diff --git a/UtopiaCanteen.BackendService/BackendHostConfigService.cs b/UtopiaCanteen.BackendService/BackendHostConfigService.cs index 6dd4eea..449bb3c 100644 --- a/UtopiaCanteen.BackendService/BackendHostConfigService.cs +++ b/UtopiaCanteen.BackendService/BackendHostConfigService.cs @@ -55,8 +55,23 @@ public sealed class BackendHostConfigService : IConfigService public void ApplyLocationSiteIdFromAuth(string? locationSiteId) { } - public string GetDeviceId() => _persisted.DeviceId ?? string.Empty; - public void SetDeviceId(string deviceId) { _persisted.DeviceId = deviceId ?? string.Empty; SavePersisted(); } + public string GetDeviceId() + { + if (!string.IsNullOrWhiteSpace(_persisted.DeviceId)) + return _persisted.DeviceId.Trim(); + + _persisted.DeviceId = ResolveMachineDeviceId(); + SavePersisted(); + return _persisted.DeviceId; + } + + public void SetDeviceId(string deviceId) + { + _persisted.DeviceId = string.IsNullOrWhiteSpace(deviceId) + ? ResolveMachineDeviceId() + : deviceId.Trim(); + SavePersisted(); + } public bool GetRememberAdminCredentials() => false; public void SetRememberAdminCredentials(bool remember) { } @@ -110,6 +125,14 @@ public sealed class BackendHostConfigService : IConfigService public string GetLocalServerListenUrls() => GetListenUrls(); public void SetLocalServerListenUrls(string urls) { } + private static string ResolveMachineDeviceId() + { + var machineName = Environment.MachineName; + return string.IsNullOrWhiteSpace(machineName) + ? Guid.NewGuid().ToString("N") + : machineName.Trim(); + } + private void MergeFromAppSettingsIfNeeded() { var mysql = _configuration["MySqlConnectionString"]; diff --git a/UtopiaCanteen.BackendService/CanteenBackendWorker.cs b/UtopiaCanteen.BackendService/CanteenBackendWorker.cs index 3c8a503..90ee0d6 100644 --- a/UtopiaCanteen.BackendService/CanteenBackendWorker.cs +++ b/UtopiaCanteen.BackendService/CanteenBackendWorker.cs @@ -44,6 +44,9 @@ public sealed class CanteenBackendWorker : BackgroundService db.EnsureDatabaseCreated(); FileLogger.Info("BackendService", $"Configuration loaded. SQLite DB path={DatabasePath.GetDbPath()}"); + FileLogger.Info( + "BackendService", + $"Device ID resolved. MachineName={Environment.MachineName}, DeviceId={_config.GetDeviceId()}"); FileLogger.Info("BackendService", $"ListenUrls={_config.GetLocalServerListenUrls()}"); FileLogger.Info( "BackendService", diff --git a/ViewModels/ScannerDashboardViewModel.cs b/ViewModels/ScannerDashboardViewModel.cs index 014aa63..bd9c5f5 100644 --- a/ViewModels/ScannerDashboardViewModel.cs +++ b/ViewModels/ScannerDashboardViewModel.cs @@ -928,10 +928,14 @@ public partial class ScannerDashboardViewModel : ObservableObject private static string BuildCsvFromScanRecords(IReadOnlyList records) { var sb = new StringBuilder(); - sb.AppendLine("Id,CardId,ScanTime,IsSynced,SiteId,DeviceId,IpAddress,EmployeeId,EmployeeName,Department,Meal,Price"); + sb.AppendLine("Id,CardId,ScanTime,IsSynced,SiteId,DeviceId,IpAddress,EmployeeId,EmployeeName,Department,Meal Session,Meal,Price"); foreach (var r in records) { var localScanTime = r.ScanTime.ToLocalTime(); + var mealSession = r.MealLabel ?? string.Empty; + var meal = !string.IsNullOrWhiteSpace(r.MealItems) + ? r.MealItems + : mealSession; sb.Append(r.Id); sb.Append(','); sb.Append(ToExcelText(r.CardId)); @@ -952,7 +956,9 @@ public partial class ScannerDashboardViewModel : ObservableObject sb.Append(','); sb.Append(EscapeCsv(r.Department ?? string.Empty)); sb.Append(','); - sb.Append(EscapeCsv(r.MealItems ?? string.Empty)); + sb.Append(EscapeCsv(mealSession)); + sb.Append(','); + sb.Append(EscapeCsv(meal)); sb.Append(','); sb.Append(r.TotalPrice.ToString("0.##", CultureInfo.InvariantCulture)); sb.AppendLine(); @@ -1047,4 +1053,3 @@ public partial class ScannerDashboardViewModel : ObservableObject _debounceTimer.Stop(); } } -