Added endpoints to update verspakketten and add beoordeling. Added some validations and other tweaks
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using Cortex.Mediator;
|
using Cortex.Mediator;
|
||||||
|
using Lutra.API.Requests;
|
||||||
using Lutra.Application.Verspakketten;
|
using Lutra.Application.Verspakketten;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
@@ -72,5 +73,48 @@ namespace Lutra.API.Controllers
|
|||||||
return BadRequest(ex.Message);
|
return BadRequest(ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates an existing verspakket with the provided values.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">The verspakket identifier.</param>
|
||||||
|
/// <param name="request">The updated verspakket values.</param>
|
||||||
|
/// <returns>
|
||||||
|
/// Returns 204 No Content when the update succeeds.
|
||||||
|
/// Returns 404 Not Found when the specified verspakket does not exist.
|
||||||
|
/// </returns>
|
||||||
|
[HttpPut("{id:guid}")]
|
||||||
|
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||||
|
public async Task<IActionResult> Update(Guid id, [FromBody] UpdateVerspakketRequest request)
|
||||||
|
{
|
||||||
|
var command = new UpdateVerspakket.Command(id, request.Naam, request.PrijsInCenten, request.AantalPersonen, request.SupermarktId);
|
||||||
|
await mediator.SendCommandAsync<UpdateVerspakket.Command, UpdateVerspakket.Response>(command);
|
||||||
|
return NoContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds a beoordeling to an existing verspakket.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">The verspakket ID.</param>
|
||||||
|
/// <param name="request">The beoordeling values to add.</param>
|
||||||
|
/// <returns>Returns 201 Created with the created beoordeling identifier.</returns>
|
||||||
|
[HttpPost("{id:guid}/beoordelingen")]
|
||||||
|
[ProducesResponseType(typeof(AddBeoordeling.Response), StatusCodes.Status201Created)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||||
|
public async Task<ActionResult<AddBeoordeling.Response>> AddBeoordeling(Guid id, [FromBody] AddBeoordelingRequest request)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var command = new AddBeoordeling.Command(id, request.CijferSmaak, request.CijferBereiden, request.Aanbevolen, request.Tekst);
|
||||||
|
var result = await mediator.SendCommandAsync<AddBeoordeling.Command, AddBeoordeling.Response>(command);
|
||||||
|
|
||||||
|
return CreatedAtAction(nameof(GetById), new { id }, result);
|
||||||
|
}
|
||||||
|
catch (InvalidOperationException ex)
|
||||||
|
{
|
||||||
|
return BadRequest(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
12
Lutra/Lutra.API/Requests/AddBeoordelingRequest.cs
Normal file
12
Lutra/Lutra.API/Requests/AddBeoordelingRequest.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace Lutra.API.Requests;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the data required to add a beoordeling to a verspakket.
|
||||||
|
/// </summary>
|
||||||
|
public sealed record AddBeoordelingRequest(
|
||||||
|
[Range(1, 10)] int CijferSmaak,
|
||||||
|
[Range(1, 10)] int CijferBereiden,
|
||||||
|
bool Aanbevolen,
|
||||||
|
[MaxLength(1024)] string? Tekst);
|
||||||
12
Lutra/Lutra.API/Requests/UpdateVerspakketRequest.cs
Normal file
12
Lutra/Lutra.API/Requests/UpdateVerspakketRequest.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace Lutra.API.Requests;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the data required to update a verspakket.
|
||||||
|
/// </summary>
|
||||||
|
public sealed record UpdateVerspakketRequest(
|
||||||
|
[Required, MaxLength(50)] string Naam,
|
||||||
|
[Range(0, int.MaxValue)] int PrijsInCenten,
|
||||||
|
[Range(1, 10)] int AantalPersonen,
|
||||||
|
[Required] Guid SupermarktId);
|
||||||
@@ -6,6 +6,8 @@ public interface ILutraDbContext
|
|||||||
{
|
{
|
||||||
DbSet<Supermarkt> Supermarkten { get; }
|
DbSet<Supermarkt> Supermarkten { get; }
|
||||||
|
|
||||||
|
DbSet<Beoordeling> Beoordelingen { get; }
|
||||||
|
|
||||||
DbSet<Verspakket> Verspaketten { get; }
|
DbSet<Verspakket> Verspaketten { get; }
|
||||||
|
|
||||||
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
|
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
|
||||||
|
|||||||
@@ -10,6 +10,12 @@ namespace Lutra.Application.Models.Verspakketten
|
|||||||
|
|
||||||
public int? PrijsInCenten { get; init; }
|
public int? PrijsInCenten { get; init; }
|
||||||
|
|
||||||
|
public int AantalPersonen { get; init; }
|
||||||
|
|
||||||
|
public double? AverageCijferSmaak { get; init; }
|
||||||
|
|
||||||
|
public double? AverageCijferBereiden { get; init; }
|
||||||
|
|
||||||
public Beoordeling[]? Beoordelingen { get; init; }
|
public Beoordeling[]? Beoordelingen { get; init; }
|
||||||
|
|
||||||
public Supermarkt? Supermarkt { get; init; }
|
public Supermarkt? Supermarkt { get; init; }
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
using Cortex.Mediator.Commands;
|
||||||
|
|
||||||
|
namespace Lutra.Application.Verspakketten;
|
||||||
|
|
||||||
|
public sealed partial class AddBeoordeling
|
||||||
|
{
|
||||||
|
public sealed record Command(
|
||||||
|
Guid VerspakketId,
|
||||||
|
int CijferSmaak,
|
||||||
|
int CijferBereiden,
|
||||||
|
bool Aanbevolen,
|
||||||
|
string? Tekst) : ICommand<Response>;
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
using Cortex.Mediator.Commands;
|
||||||
|
using Lutra.Application.Interfaces;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace Lutra.Application.Verspakketten;
|
||||||
|
|
||||||
|
public sealed partial class AddBeoordeling
|
||||||
|
{
|
||||||
|
public sealed class Handler(ILutraDbContext context) : ICommandHandler<Command, Response>
|
||||||
|
{
|
||||||
|
public async Task<Response> Handle(Command request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var verspakketExists = await context.Verspaketten
|
||||||
|
.AsNoTracking()
|
||||||
|
.AnyAsync(v => v.Id == request.VerspakketId && v.DeletedAt == null, cancellationToken);
|
||||||
|
|
||||||
|
if (!verspakketExists)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"Verspakket with id '{request.VerspakketId}' was not found.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var now = DateTime.UtcNow;
|
||||||
|
var beoordeling = new Domain.Entities.Beoordeling
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid(),
|
||||||
|
CijferSmaak = request.CijferSmaak,
|
||||||
|
CijferBereiden = request.CijferBereiden,
|
||||||
|
Aanbevolen = request.Aanbevolen,
|
||||||
|
Tekst = request.Tekst,
|
||||||
|
VerspakketId = request.VerspakketId,
|
||||||
|
CreatedAt = now,
|
||||||
|
ModifiedAt = now
|
||||||
|
};
|
||||||
|
|
||||||
|
await context.Beoordelingen.AddAsync(beoordeling, cancellationToken);
|
||||||
|
await context.SaveChangesAsync(cancellationToken);
|
||||||
|
|
||||||
|
return new Response { Id = beoordeling.Id };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
namespace Lutra.Application.Verspakketten;
|
||||||
|
|
||||||
|
public sealed partial class AddBeoordeling
|
||||||
|
{
|
||||||
|
public sealed class Response
|
||||||
|
{
|
||||||
|
public required Guid Id { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
3
Lutra/Lutra.Application/Verspakketten/AddBeoordeling.cs
Normal file
3
Lutra/Lutra.Application/Verspakketten/AddBeoordeling.cs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
namespace Lutra.Application.Verspakketten;
|
||||||
|
|
||||||
|
public sealed partial class AddBeoordeling { }
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using Cortex.Mediator.Commands;
|
using Cortex.Mediator.Commands;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
namespace Lutra.Application.Verspakketten;
|
namespace Lutra.Application.Verspakketten;
|
||||||
|
|
||||||
@@ -7,6 +8,6 @@ public sealed partial class CreateVerspakket
|
|||||||
public sealed record Command(
|
public sealed record Command(
|
||||||
string Naam,
|
string Naam,
|
||||||
int? PrijsInCenten,
|
int? PrijsInCenten,
|
||||||
int AantalPersonen,
|
[Range(1, 10)] int AantalPersonen,
|
||||||
Guid SupermarktId) : ICommand<Response>;
|
Guid SupermarktId) : ICommand<Response>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ namespace Lutra.Application.Verspakketten
|
|||||||
Id = v.Id,
|
Id = v.Id,
|
||||||
Naam = v.Naam,
|
Naam = v.Naam,
|
||||||
PrijsInCenten = v.PrijsInCenten,
|
PrijsInCenten = v.PrijsInCenten,
|
||||||
|
AantalPersonen = v.AantalPersonen,
|
||||||
|
AverageCijferSmaak = v.Beoordelingen.Any() ? v.Beoordelingen.Average(b => (double)b.CijferSmaak) : null,
|
||||||
|
AverageCijferBereiden = v.Beoordelingen.Any() ? v.Beoordelingen.Average(b => (double)b.CijferBereiden) : null,
|
||||||
Beoordelingen = v.Beoordelingen
|
Beoordelingen = v.Beoordelingen
|
||||||
.Select(b => new Beoordeling
|
.Select(b => new Beoordeling
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ namespace Lutra.Application.Verspakketten
|
|||||||
Id = v.Id,
|
Id = v.Id,
|
||||||
Naam = v.Naam,
|
Naam = v.Naam,
|
||||||
PrijsInCenten = v.PrijsInCenten,
|
PrijsInCenten = v.PrijsInCenten,
|
||||||
|
AantalPersonen = v.AantalPersonen,
|
||||||
|
AverageCijferSmaak = v.Beoordelingen.Any() ? v.Beoordelingen.Average(b => (double)b.CijferSmaak) : null,
|
||||||
|
AverageCijferBereiden = v.Beoordelingen.Any() ? v.Beoordelingen.Average(b => (double)b.CijferBereiden) : null,
|
||||||
Beoordelingen = v.Beoordelingen
|
Beoordelingen = v.Beoordelingen
|
||||||
.Select(b => new Beoordeling
|
.Select(b => new Beoordeling
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
using Cortex.Mediator.Commands;
|
||||||
|
|
||||||
|
namespace Lutra.Application.Verspakketten;
|
||||||
|
|
||||||
|
public sealed partial class UpdateVerspakket
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Updates an existing verspakket.
|
||||||
|
/// </summary>
|
||||||
|
public sealed record Command(Guid Id, string Naam, int PrijsInCenten, int AantalPersonen, Guid SupermarktId) : ICommand<Response>;
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
using Cortex.Mediator.Commands;
|
||||||
|
using Lutra.Application.Interfaces;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace Lutra.Application.Verspakketten;
|
||||||
|
|
||||||
|
public sealed partial class UpdateVerspakket
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Handles update requests for verspakketten.
|
||||||
|
/// </summary>
|
||||||
|
public sealed class Handler(ILutraDbContext context) : ICommandHandler<Command, Response>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Updates an existing verspakket.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request">The update command.</param>
|
||||||
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
|
/// <returns>An empty response.</returns>
|
||||||
|
public async Task<Response> Handle(Command request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(request.Naam))
|
||||||
|
throw new ArgumentException("Naam mag niet leeg zijn.", nameof(request.Naam));
|
||||||
|
|
||||||
|
if (request.Naam.Length > 50)
|
||||||
|
throw new ArgumentException("Naam mag maximaal 50 tekens bevatten.", nameof(request.Naam));
|
||||||
|
|
||||||
|
if (request.PrijsInCenten < 0)
|
||||||
|
throw new ArgumentException("PrijsInCenten mag niet negatief zijn.", nameof(request.PrijsInCenten));
|
||||||
|
|
||||||
|
if (request.AantalPersonen is < 1 or > 10)
|
||||||
|
throw new ArgumentException("AantalPersonen moet tussen 1 en 10 liggen.", nameof(request.AantalPersonen));
|
||||||
|
|
||||||
|
var verspakket = await context.Verspaketten
|
||||||
|
.FirstOrDefaultAsync(v => v.Id == request.Id && v.DeletedAt == null, cancellationToken);
|
||||||
|
|
||||||
|
if (verspakket is null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"Verspakket with id '{request.Id}' was not found.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var supermarktExists = await context.Supermarkten
|
||||||
|
.AsNoTracking()
|
||||||
|
.AnyAsync(s => s.Id == request.SupermarktId && s.DeletedAt == null, cancellationToken);
|
||||||
|
|
||||||
|
if (!supermarktExists)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"Supermarkt with id '{request.SupermarktId}' was not found.");
|
||||||
|
}
|
||||||
|
|
||||||
|
verspakket.Naam = request.Naam;
|
||||||
|
verspakket.PrijsInCenten = request.PrijsInCenten;
|
||||||
|
verspakket.AantalPersonen = request.AantalPersonen;
|
||||||
|
verspakket.SupermarktId = request.SupermarktId;
|
||||||
|
verspakket.ModifiedAt = DateTime.UtcNow;
|
||||||
|
|
||||||
|
await context.SaveChangesAsync(cancellationToken);
|
||||||
|
|
||||||
|
return new Response();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
namespace Lutra.Application.Verspakketten;
|
||||||
|
|
||||||
|
public sealed partial class UpdateVerspakket
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the result of an update verspakket operation.
|
||||||
|
/// </summary>
|
||||||
|
public sealed record Response;
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
namespace Lutra.Application.Verspakketten;
|
||||||
|
|
||||||
|
public sealed partial class UpdateVerspakket;
|
||||||
@@ -9,6 +9,7 @@ public class Verspakket : BaseEntity
|
|||||||
[MaxLength(50)]
|
[MaxLength(50)]
|
||||||
public required string Naam { get; set; }
|
public required string Naam { get; set; }
|
||||||
|
|
||||||
|
[Range(0, int.MaxValue)]
|
||||||
public int? PrijsInCenten { get; set; }
|
public int? PrijsInCenten { get; set; }
|
||||||
|
|
||||||
[Range(1, 10)]
|
[Range(1, 10)]
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ public class LutraDbContext : DbContext, ILutraDbContext
|
|||||||
|
|
||||||
public DbSet<Supermarkt> Supermarkten => Set<Supermarkt>();
|
public DbSet<Supermarkt> Supermarkten => Set<Supermarkt>();
|
||||||
|
|
||||||
|
public DbSet<Beoordeling> Beoordelingen => Set<Beoordeling>();
|
||||||
|
|
||||||
public DbSet<Verspakket> Verspaketten => Set<Verspakket>();
|
public DbSet<Verspakket> Verspaketten => Set<Verspakket>();
|
||||||
|
|
||||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
@@ -22,11 +24,19 @@ public class LutraDbContext : DbContext, ILutraDbContext
|
|||||||
modelBuilder.Entity<Beoordeling>()
|
modelBuilder.Entity<Beoordeling>()
|
||||||
.ToTable("Beoordelingen");
|
.ToTable("Beoordelingen");
|
||||||
|
|
||||||
modelBuilder.Entity<Verspakket>()
|
modelBuilder.Entity<Verspakket>(b =>
|
||||||
.HasMany(v => v.Beoordelingen)
|
{
|
||||||
|
b.HasMany(v => v.Beoordelingen)
|
||||||
.WithOne()
|
.WithOne()
|
||||||
.HasForeignKey(b => b.VerspakketId)
|
.HasForeignKey(beo => beo.VerspakketId)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
|
|
||||||
|
b.ToTable(t =>
|
||||||
|
{
|
||||||
|
t.HasCheckConstraint("CK_Verspaketten_AantalPersonen", "\"AantalPersonen\" BETWEEN 1 AND 10");
|
||||||
|
t.HasCheckConstraint("CK_Verspaketten_PrijsInCenten", "\"PrijsInCenten\" IS NULL OR \"PrijsInCenten\" >= 0");
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
|
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
|
||||||
|
|||||||
157
Lutra/Lutra.Infrastructure/Migrations/20260418173428_AddAantalPersonenCheckConstraint.Designer.cs
generated
Normal file
157
Lutra/Lutra.Infrastructure/Migrations/20260418173428_AddAantalPersonenCheckConstraint.Designer.cs
generated
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Lutra.Infrastructure.Sql;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace Lutra.Infrastructure.Sql.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(LutraDbContext))]
|
||||||
|
[Migration("20260418173428_AddAantalPersonenCheckConstraint")]
|
||||||
|
partial class AddAantalPersonenCheckConstraint
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.HasAnnotation("ProductVersion", "10.0.6")
|
||||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Beoordeling", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<bool>("Aanbevolen")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<int>("CijferBereiden")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<int>("CijferSmaak")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DeletedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime>("ModifiedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Tekst")
|
||||||
|
.HasMaxLength(1024)
|
||||||
|
.HasColumnType("character varying(1024)");
|
||||||
|
|
||||||
|
b.Property<Guid>("VerspakketId")
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("VerspakketId");
|
||||||
|
|
||||||
|
b.ToTable("Beoordelingen", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Supermarkt", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DeletedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime>("ModifiedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Naam")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(50)
|
||||||
|
.HasColumnType("character varying(50)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Supermarkten");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Verspakket", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<int>("AantalPersonen")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DeletedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime>("ModifiedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Naam")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(50)
|
||||||
|
.HasColumnType("character varying(50)");
|
||||||
|
|
||||||
|
b.Property<int?>("PrijsInCenten")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<Guid>("SupermarktId")
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("SupermarktId");
|
||||||
|
|
||||||
|
b.ToTable("Verspaketten", t =>
|
||||||
|
{
|
||||||
|
t.HasCheckConstraint("CK_Verspaketten_AantalPersonen", "\"AantalPersonen\" BETWEEN 1 AND 10");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Beoordeling", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Lutra.Domain.Entities.Verspakket", null)
|
||||||
|
.WithMany("Beoordelingen")
|
||||||
|
.HasForeignKey("VerspakketId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Verspakket", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Lutra.Domain.Entities.Supermarkt", "Supermarkt")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("SupermarktId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Supermarkt");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Verspakket", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Beoordelingen");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace Lutra.Infrastructure.Sql.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class AddAantalPersonenCheckConstraint : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AddCheckConstraint(
|
||||||
|
name: "CK_Verspaketten_AantalPersonen",
|
||||||
|
table: "Verspaketten",
|
||||||
|
sql: "\"AantalPersonen\" BETWEEN 1 AND 10");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropCheckConstraint(
|
||||||
|
name: "CK_Verspaketten_AantalPersonen",
|
||||||
|
table: "Verspaketten");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
159
Lutra/Lutra.Infrastructure/Migrations/20260418174149_AddPrijsInCentenCheckConstraint.Designer.cs
generated
Normal file
159
Lutra/Lutra.Infrastructure/Migrations/20260418174149_AddPrijsInCentenCheckConstraint.Designer.cs
generated
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Lutra.Infrastructure.Sql;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace Lutra.Infrastructure.Sql.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(LutraDbContext))]
|
||||||
|
[Migration("20260418174149_AddPrijsInCentenCheckConstraint")]
|
||||||
|
partial class AddPrijsInCentenCheckConstraint
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.HasAnnotation("ProductVersion", "10.0.6")
|
||||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Beoordeling", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<bool>("Aanbevolen")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<int>("CijferBereiden")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<int>("CijferSmaak")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DeletedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime>("ModifiedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Tekst")
|
||||||
|
.HasMaxLength(1024)
|
||||||
|
.HasColumnType("character varying(1024)");
|
||||||
|
|
||||||
|
b.Property<Guid>("VerspakketId")
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("VerspakketId");
|
||||||
|
|
||||||
|
b.ToTable("Beoordelingen", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Supermarkt", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DeletedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime>("ModifiedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Naam")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(50)
|
||||||
|
.HasColumnType("character varying(50)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Supermarkten");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Verspakket", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<int>("AantalPersonen")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DeletedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime>("ModifiedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Naam")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(50)
|
||||||
|
.HasColumnType("character varying(50)");
|
||||||
|
|
||||||
|
b.Property<int?>("PrijsInCenten")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<Guid>("SupermarktId")
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("SupermarktId");
|
||||||
|
|
||||||
|
b.ToTable("Verspaketten", t =>
|
||||||
|
{
|
||||||
|
t.HasCheckConstraint("CK_Verspaketten_AantalPersonen", "\"AantalPersonen\" BETWEEN 1 AND 10");
|
||||||
|
|
||||||
|
t.HasCheckConstraint("CK_Verspaketten_PrijsInCenten", "\"PrijsInCenten\" IS NULL OR \"PrijsInCenten\" >= 0");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Beoordeling", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Lutra.Domain.Entities.Verspakket", null)
|
||||||
|
.WithMany("Beoordelingen")
|
||||||
|
.HasForeignKey("VerspakketId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Verspakket", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Lutra.Domain.Entities.Supermarkt", "Supermarkt")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("SupermarktId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Supermarkt");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Lutra.Domain.Entities.Verspakket", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Beoordelingen");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace Lutra.Infrastructure.Sql.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class AddPrijsInCentenCheckConstraint : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AddCheckConstraint(
|
||||||
|
name: "CK_Verspaketten_PrijsInCenten",
|
||||||
|
table: "Verspaketten",
|
||||||
|
sql: "\"PrijsInCenten\" IS NULL OR \"PrijsInCenten\" >= 0");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropCheckConstraint(
|
||||||
|
name: "CK_Verspaketten_PrijsInCenten",
|
||||||
|
table: "Verspaketten");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,7 +17,7 @@ namespace Lutra.Infrastructure.Sql.Migrations
|
|||||||
{
|
{
|
||||||
#pragma warning disable 612, 618
|
#pragma warning disable 612, 618
|
||||||
modelBuilder
|
modelBuilder
|
||||||
.HasAnnotation("ProductVersion", "10.0.5")
|
.HasAnnotation("ProductVersion", "10.0.6")
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
@@ -118,7 +118,12 @@ namespace Lutra.Infrastructure.Sql.Migrations
|
|||||||
|
|
||||||
b.HasIndex("SupermarktId");
|
b.HasIndex("SupermarktId");
|
||||||
|
|
||||||
b.ToTable("Verspaketten");
|
b.ToTable("Verspaketten", t =>
|
||||||
|
{
|
||||||
|
t.HasCheckConstraint("CK_Verspaketten_AantalPersonen", "\"AantalPersonen\" BETWEEN 1 AND 10");
|
||||||
|
|
||||||
|
t.HasCheckConstraint("CK_Verspaketten_PrijsInCenten", "\"PrijsInCenten\" IS NULL OR \"PrijsInCenten\" >= 0");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Lutra.Domain.Entities.Beoordeling", b =>
|
modelBuilder.Entity("Lutra.Domain.Entities.Beoordeling", b =>
|
||||||
|
|||||||
Reference in New Issue
Block a user