Move serialization and deserialization out of AccessQueueRepo

This commit is contained in:
henry 2025-07-15 23:39:56 -04:00
parent f72eb323ec
commit ce9d0cdb25
4 changed files with 17 additions and 11 deletions

View File

@ -179,19 +179,18 @@ namespace AccessQueueService.Data
_nextUnusedTicket = newIndex;
}
public string ToState()
public TakeANumberAccessQueueRepoState ToState()
{
var state = new TakeANumberAccessQueueRepoState
{
AccessTickets = new Dictionary<string, AccessTicket>(_accessTickets),
AccessQueue = new Dictionary<ulong, AccessTicket>(_accessQueue),
};
return JsonSerializer.Serialize(state);
return state;
}
public static AccessQueueRepository FromState(string stateJson)
public static AccessQueueRepository FromState(TakeANumberAccessQueueRepoState state)
{
var state = JsonSerializer.Deserialize<TakeANumberAccessQueueRepoState?>(stateJson);
if (state?.AccessTickets == null || state?.AccessQueue == null)
{
return new();

View File

@ -1,4 +1,6 @@
using System.Text.Json;
using AccessQueueService.Data;
using AccessQueueService.Models;
using AccessQueueService.Services;
using Serilog;
@ -24,8 +26,14 @@ builder.Services.AddSingleton<AccessQueueRepository>(sp =>
{
try
{
var json = File.ReadAllText(filePath);
return AccessQueueRepository.FromState(json);
string json = File.ReadAllText(filePath);
var state = JsonSerializer.Deserialize<TakeANumberAccessQueueRepoState>(json);
if (state == null)
{
Console.WriteLine($"Failed to load state from {filePath}. Deserialized object was null.");
return new AccessQueueRepository();
}
return AccessQueueRepository.FromState(state);
}
catch (Exception ex)
{

View File

@ -30,7 +30,7 @@ namespace AccessQueueService.Services
{
_logger.LogInformation($"Writing backup to {backupPath}");
var stateJson = _accessRepo.ToState();
File.WriteAllText(backupPath, stateJson);
File.WriteAllText(backupPath, JsonSerializer.Serialize(stateJson));
}
catch (Exception ex)
{

View File

@ -287,8 +287,7 @@ namespace AccessQueueServiceTests
_repo.UpsertTicket(ticketWithAccess);
_repo.Enqueue(ticketWithoutAccess);
string stateJson = _repo.ToState();
var state = JsonSerializer.Deserialize<TakeANumberAccessQueueRepoState>(stateJson);
var state = _repo.ToState();
Assert.NotNull(state?.AccessQueue);
Assert.NotNull(state?.AccessTickets);
@ -312,8 +311,8 @@ namespace AccessQueueServiceTests
_repo.UpsertTicket(ticketWithAccess);
_repo.Enqueue(ticketWithoutAccess);
string stateJson = _repo.ToState();
var deserializedRepo = AccessQueueRepository.FromState(stateJson);
var state = _repo.ToState();
var deserializedRepo = AccessQueueRepository.FromState(state);
Assert.Equal(1, deserializedRepo.GetUnexpiredTicketsCount());
Assert.Equal(1, deserializedRepo.GetQueueCount());