ShiftScheduler/Services/ConfigurationService.cs
copilot-swe-agent[bot] 98fc96af90 Complete configuration UI implementation with working dialog, API endpoints, and file import/export
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
2025-08-25 19:32:44 +00:00

111 lines
No EOL
4.3 KiB
C#

using ShiftScheduler.Shared;
using System.Text.Json;
namespace ShiftScheduler.Services
{
public interface IConfigurationService
{
ApplicationConfiguration GetConfiguration();
void UpdateConfiguration(ApplicationConfiguration configuration);
Task<string> ExportConfigurationAsync();
Task ImportConfigurationAsync(string jsonContent);
List<Shift> GetShifts();
TransportConfiguration GetTransportConfiguration();
}
public class ConfigurationService : IConfigurationService
{
private ApplicationConfiguration _configuration;
private readonly object _lock = new object();
public ConfigurationService(ApplicationConfiguration initialConfiguration)
{
_configuration = initialConfiguration;
}
public ApplicationConfiguration GetConfiguration()
{
lock (_lock)
{
return new ApplicationConfiguration
{
Transport = new TransportConfiguration
{
StartStation = _configuration.Transport.StartStation,
EndStation = _configuration.Transport.EndStation,
ApiBaseUrl = _configuration.Transport.ApiBaseUrl,
SafetyBufferMinutes = _configuration.Transport.SafetyBufferMinutes,
MinBreakMinutes = _configuration.Transport.MinBreakMinutes,
MaxEarlyArrivalMinutes = _configuration.Transport.MaxEarlyArrivalMinutes,
MaxLateArrivalMinutes = _configuration.Transport.MaxLateArrivalMinutes,
CacheDurationDays = _configuration.Transport.CacheDurationDays
},
Shifts = _configuration.Shifts.Select(s => new Shift
{
Name = s.Name,
Icon = s.Icon,
MorningTime = s.MorningTime,
AfternoonTime = s.AfternoonTime
}).ToList()
};
}
}
public void UpdateConfiguration(ApplicationConfiguration configuration)
{
lock (_lock)
{
_configuration = new ApplicationConfiguration
{
Transport = new TransportConfiguration
{
StartStation = configuration.Transport.StartStation,
EndStation = configuration.Transport.EndStation,
ApiBaseUrl = configuration.Transport.ApiBaseUrl,
SafetyBufferMinutes = configuration.Transport.SafetyBufferMinutes,
MinBreakMinutes = configuration.Transport.MinBreakMinutes,
MaxEarlyArrivalMinutes = configuration.Transport.MaxEarlyArrivalMinutes,
MaxLateArrivalMinutes = configuration.Transport.MaxLateArrivalMinutes,
CacheDurationDays = configuration.Transport.CacheDurationDays
},
Shifts = configuration.Shifts.Select(s => new Shift
{
Name = s.Name,
Icon = s.Icon,
MorningTime = s.MorningTime,
AfternoonTime = s.AfternoonTime
}).ToList()
};
}
}
public async Task<string> ExportConfigurationAsync()
{
var config = GetConfiguration();
return await Task.FromResult(JsonSerializer.Serialize(config, new JsonSerializerOptions
{
WriteIndented = true
}));
}
public async Task ImportConfigurationAsync(string jsonContent)
{
var configuration = JsonSerializer.Deserialize<ApplicationConfiguration>(jsonContent);
if (configuration != null)
{
UpdateConfiguration(configuration);
}
await Task.CompletedTask;
}
public List<Shift> GetShifts()
{
return GetConfiguration().Shifts;
}
public TransportConfiguration GetTransportConfiguration()
{
return GetConfiguration().Transport;
}
}
}