using Microsoft.EntityFrameworkCore;
using RobotNet10.NavigationTune.Data;
using RobotNet10.NavigationTune.Shared.Models;
using RobotNet10.NavigationTune.Scenarios;
namespace RobotNet10.NavigationTune.Data;
///
/// Repository for test scenarios
///
public interface IScenarioRepository
{
Task GetByIdAsync(Guid id);
Task> GetAllAsync();
Task> GetDefaultScenariosAsync();
Task GetEntityByIdAsync(Guid id);
Task> GetAllEntitiesAsync();
Task> GetDefaultScenarioEntitiesAsync();
Task SaveAsync(TestScenario scenario);
Task UpdateAsync(TestScenario scenario);
Task DeleteAsync(Guid id);
}
public class ScenarioRepository(TuningDbContext context) : IScenarioRepository
{
public async Task GetByIdAsync(Guid id)
{
var entity = await context.TestScenarios.FindAsync(id);
return entity?.ToTestScenario();
}
public async Task> GetAllAsync()
{
var entities = await context.TestScenarios
.OrderByDescending(s => s.CreatedAt)
.ToListAsync();
return [.. entities.Select(e => e.ToTestScenario())];
}
public async Task> GetDefaultScenariosAsync()
{
var entities = await context.TestScenarios
.Where(s => s.IsDefault)
.OrderBy(s => s.Name)
.ToListAsync();
return [.. entities.Select(e => e.ToTestScenario())];
}
public async Task GetEntityByIdAsync(Guid id)
{
return await context.TestScenarios.FindAsync(id);
}
public async Task> GetAllEntitiesAsync()
{
return await context.TestScenarios
.OrderByDescending(s => s.CreatedAt)
.ToListAsync();
}
public async Task> GetDefaultScenarioEntitiesAsync()
{
return await context.TestScenarios
.Where(s => s.IsDefault)
.OrderBy(s => s.Name)
.ToListAsync();
}
public async Task SaveAsync(TestScenario scenario)
{
var entity = TestScenarioEntity.FromTestScenario(scenario);
context.TestScenarios.Add(entity);
await context.SaveChangesAsync();
return entity.Id;
}
public async Task UpdateAsync(TestScenario scenario)
{
var existing = await context.TestScenarios.FindAsync(scenario.Id) ?? throw new InvalidOperationException($"Scenario with ID {scenario.Id} not found.");
var updated = TestScenarioEntity.FromTestScenario(scenario);
existing.Name = updated.Name;
existing.Description = updated.Description;
existing.Type = updated.Type;
existing.IsDefault = updated.IsDefault;
existing.ConfigJson = updated.ConfigJson;
await context.SaveChangesAsync();
}
public async Task DeleteAsync(Guid id)
{
var entity = await context.TestScenarios.FindAsync(id);
if (entity != null)
{
context.TestScenarios.Remove(entity);
await context.SaveChangesAsync();
}
}
}