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 Lutra.API.Requests;
|
||||
using Lutra.Application.Verspakketten;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
@@ -72,5 +73,48 @@ namespace Lutra.API.Controllers
|
||||
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<Beoordeling> Beoordelingen { get; }
|
||||
|
||||
DbSet<Verspakket> Verspaketten { get; }
|
||||
|
||||
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
|
||||
|
||||
@@ -10,6 +10,12 @@ namespace Lutra.Application.Models.Verspakketten
|
||||
|
||||
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 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 System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Lutra.Application.Verspakketten;
|
||||
|
||||
@@ -7,6 +8,6 @@ public sealed partial class CreateVerspakket
|
||||
public sealed record Command(
|
||||
string Naam,
|
||||
int? PrijsInCenten,
|
||||
int AantalPersonen,
|
||||
[Range(1, 10)] int AantalPersonen,
|
||||
Guid SupermarktId) : ICommand<Response>;
|
||||
}
|
||||
|
||||
@@ -20,6 +20,9 @@ namespace Lutra.Application.Verspakketten
|
||||
Id = v.Id,
|
||||
Naam = v.Naam,
|
||||
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
|
||||
.Select(b => new Beoordeling
|
||||
{
|
||||
|
||||
@@ -45,6 +45,9 @@ namespace Lutra.Application.Verspakketten
|
||||
Id = v.Id,
|
||||
Naam = v.Naam,
|
||||
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
|
||||
.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)]
|
||||
public required string Naam { get; set; }
|
||||
|
||||
[Range(0, int.MaxValue)]
|
||||
public int? PrijsInCenten { get; set; }
|
||||
|
||||
[Range(1, 10)]
|
||||
|
||||
@@ -13,6 +13,8 @@ public class LutraDbContext : DbContext, ILutraDbContext
|
||||
|
||||
public DbSet<Supermarkt> Supermarkten => Set<Supermarkt>();
|
||||
|
||||
public DbSet<Beoordeling> Beoordelingen => Set<Beoordeling>();
|
||||
|
||||
public DbSet<Verspakket> Verspaketten => Set<Verspakket>();
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
@@ -22,11 +24,19 @@ public class LutraDbContext : DbContext, ILutraDbContext
|
||||
modelBuilder.Entity<Beoordeling>()
|
||||
.ToTable("Beoordelingen");
|
||||
|
||||
modelBuilder.Entity<Verspakket>()
|
||||
.HasMany(v => v.Beoordelingen)
|
||||
modelBuilder.Entity<Verspakket>(b =>
|
||||
{
|
||||
b.HasMany(v => v.Beoordelingen)
|
||||
.WithOne()
|
||||
.HasForeignKey(b => b.VerspakketId)
|
||||
.HasForeignKey(beo => beo.VerspakketId)
|
||||
.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)
|
||||
|
||||
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
|
||||
modelBuilder
|
||||
.HasAnnotation("ProductVersion", "10.0.5")
|
||||
.HasAnnotation("ProductVersion", "10.0.6")
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||
|
||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||
@@ -118,7 +118,12 @@ namespace Lutra.Infrastructure.Sql.Migrations
|
||||
|
||||
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 =>
|
||||
|
||||
Reference in New Issue
Block a user