- Entities: Site (singleton, navOrder JSON), Page (slug/title/seoDescription/status enum),
Block (single table, Type enum + Data JSON; RichText=Markdown), Media. Migration
AddCmsEntities, seeds 6 Jimdo-mirror pages (placeholder Heading each; abgabetiere also an
auto AbgabetiereList block) + Site singleton nav.
- GET /api/site-snapshot: one JSON doc (site nav + pages + ordered blocks {id,order,type,data});
AbgabetiereList(auto) resolved from live ForSale gerbils -> {name, farbschlag, group(=Becken),
photos[urls], aiSaleText:null} (no price per god). SiteSnapshotService.
- CRUD: GET/POST/PUT/DELETE pages; add/update/delete blocks; PUT .../blocks/order reorder.
Block type allowlisted by enum; data validated as JSON object.
27 lines
1.0 KiB
C#
27 lines
1.0 KiB
C#
using System.Text.Json;
|
|
using System.Text.Json.Nodes;
|
|
using GerbilManagerWebAPI.Models;
|
|
|
|
namespace GerbilManagerWebAPI.Dtos
|
|
{
|
|
// Response DTOs ----------------------------------------------------------
|
|
|
|
public record PageSummaryDto(Guid Id, string Slug, string Title, string? SeoDescription, PageStatus Status);
|
|
|
|
public record PageDto(
|
|
Guid Id, string Slug, string Title, string? SeoDescription, PageStatus Status,
|
|
IReadOnlyList<BlockDto> Blocks);
|
|
|
|
/// <summary>Block.Data is emitted as a parsed JSON object (not a string).</summary>
|
|
public record BlockDto(Guid Id, int Order, BlockType Type, JsonNode? Data);
|
|
|
|
// Request DTOs -----------------------------------------------------------
|
|
|
|
public record PageInput(string Slug, string Title, string? SeoDescription, PageStatus? Status);
|
|
|
|
/// <summary>Data is the type-specific JSON object (e.g. {"markdown":"…"} for RichText).</summary>
|
|
public record BlockInput(BlockType Type, JsonElement Data, int? Order);
|
|
|
|
public record BlockOrderInput(List<Guid> BlockIds);
|
|
}
|