Endpoint to add a verspakket

This commit is contained in:
moarten
2026-04-17 22:02:25 +02:00
parent 0acc9a1f8e
commit a10bcfa1d6
17 changed files with 121 additions and 16 deletions

View File

@@ -8,7 +8,7 @@
<ItemGroup>
<PackageReference Include="Cortex.Mediator" Version="3.1.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.6" />
</ItemGroup>
<ItemGroup>

View File

@@ -2,6 +2,8 @@
{
public record Supermarkt
{
public required Guid Id { get; init; }
public required string Naam { get; init; }
}
}

View File

@@ -3,7 +3,10 @@
public class Beoordeling
{
public required int CijferSmaak { get; init; }
public required int CijferBereiden { get; init; }
public required bool Aanbevolen { get; init; }
public string? Tekst { get; init; }
}

View File

@@ -4,9 +4,14 @@ namespace Lutra.Application.Models.Verspakketten
{
public record Verspakket
{
public required Guid Id { get; init; }
public required string Naam { get; init; }
public int? PrijsInCenten { get; init; }
public Beoordeling[]? Beoordelingen { get; init; }
public Supermarkt? Supermarkt { get; init; }
}
}

View File

@@ -13,10 +13,15 @@ namespace Lutra.Application.Supermarkten
{
var supermarkten = await context.Supermarkten
.AsNoTracking()
.Where(w => w.DeletedAt == null)
.OrderBy(s => s.Naam)
.Skip(request.Skip)
.Take(request.Take)
.Select(s => new Supermarkt { Naam = s.Naam })
.Select(s => new Supermarkt
{
Id = s.Id,
Naam = s.Naam
})
.ToListAsync(cancellationToken);
return new Response { Supermarkten = supermarkten };

View File

@@ -0,0 +1,12 @@
using Cortex.Mediator.Commands;
namespace Lutra.Application.Verspakketten;
public sealed partial class CreateVerspakket
{
public sealed record Command(
string Naam,
int? PrijsInCenten,
int AantalPersonen,
Guid SupermarktId) : ICommand<Response>;
}

View File

@@ -0,0 +1,40 @@
using Cortex.Mediator.Commands;
using Lutra.Application.Interfaces;
using Microsoft.EntityFrameworkCore;
namespace Lutra.Application.Verspakketten;
public sealed partial class CreateVerspakket
{
public sealed class Handler(ILutraDbContext context) : ICommandHandler<Command, Response>
{
public async Task<Response> Handle(Command request, CancellationToken cancellationToken)
{
var supermarktExists = await context.Supermarkten
.AsNoTracking()
.AnyAsync(s => s.Id == request.SupermarktId, cancellationToken);
if (!supermarktExists)
{
throw new InvalidOperationException($"Supermarkt with id '{request.SupermarktId}' was not found.");
}
var now = DateTime.UtcNow;
var verspakket = new Domain.Entities.Verspakket
{
Id = Guid.NewGuid(),
Naam = request.Naam,
PrijsInCenten = request.PrijsInCenten,
AantalPersonen = request.AantalPersonen,
SupermarktId = request.SupermarktId,
CreatedAt = now,
ModifiedAt = now
};
await context.Verspaketten.AddAsync(verspakket, cancellationToken);
await context.SaveChangesAsync(cancellationToken);
return new Response { Id = verspakket.Id };
}
}
}

View File

@@ -0,0 +1,9 @@
namespace Lutra.Application.Verspakketten;
public sealed partial class CreateVerspakket
{
public sealed class Response
{
public required Guid Id { get; set; }
}
}

View File

@@ -0,0 +1,3 @@
namespace Lutra.Application.Verspakketten;
public sealed partial class CreateVerspakket { }

View File

@@ -17,6 +17,7 @@ namespace Lutra.Application.Verspakketten
.Where(v => v.Id == request.Id)
.Select(v => new Verspakket
{
Id = v.Id,
Naam = v.Naam,
PrijsInCenten = v.PrijsInCenten,
Beoordelingen = v.Beoordelingen
@@ -30,6 +31,7 @@ namespace Lutra.Application.Verspakketten
.ToArray(),
Supermarkt = new Supermarkt
{
Id = v.Supermarkt.Id,
Naam = v.Supermarkt.Naam
}
})

View File

@@ -12,7 +12,9 @@ namespace Lutra.Application.Verspakketten
{
public async Task<Response> Handle(Query request, CancellationToken cancellationToken)
{
var query = context.Verspaketten.AsNoTracking();
var query = context.Verspaketten
.Where(w => w.DeletedAt == null)
.AsNoTracking();
// Apply sort before pagination so the database handles ordering efficiently.
IOrderedQueryable<Domain.Entities.Verspakket> sorted = request.SortField switch
@@ -40,6 +42,7 @@ namespace Lutra.Application.Verspakketten
.Take(request.Take)
.Select(v => new Verspakket
{
Id = v.Id,
Naam = v.Naam,
PrijsInCenten = v.PrijsInCenten,
Beoordelingen = v.Beoordelingen
@@ -53,6 +56,7 @@ namespace Lutra.Application.Verspakketten
.ToArray(),
Supermarkt = new Supermarkt
{
Id = v.Supermarkt.Id,
Naam = v.Supermarkt.Naam
}
})