Normalize Backend Scan Device Context

Ensures backend scan requests use a resolved Device ID and logs backend startup Device ID details.
feature/centralized-offline-canteen
SYED MUSTUFA AHMED NAQVI 2026-06-02 14:35:10 +05:00
parent 11ab230d87
commit 95c8ac7f63
5 changed files with 58 additions and 18 deletions

View File

@ -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
};

View File

@ -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;
if (!string.IsNullOrWhiteSpace(_config.DeviceId))
return _config.DeviceId.Trim();
_config.DeviceId = ResolveMachineDeviceId();
SaveConfig();
}
return id;
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)

View File

@ -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"];

View File

@ -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",

View File

@ -928,10 +928,14 @@ public partial class ScannerDashboardViewModel : ObservableObject
private static string BuildCsvFromScanRecords(IReadOnlyList<ScanRecord> 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();
}
}