feat(dashboard): add revision-safe interactive widget grid

This commit is contained in:
cesnimda
2026-10-28 15:32:47 +01:00
parent aea7c29e70
commit 0bd290e788
21 changed files with 696 additions and 108 deletions
+4 -1
View File
@@ -565,7 +565,8 @@ public sealed class AuthController : ControllerBase
var existing = await _db.Users.AsNoTracking().Where(x => x.Id == userId)
.Select(x => new { x.DashboardLayoutJson, x.DashboardLayoutRevision }).SingleOrDefaultAsync(cancellationToken);
if (existing is null) return Unauthorized();
if (DashboardLayout.Read(existing.DashboardLayoutJson, 0).Version > 1)
var storedVersion = DashboardLayout.Read(existing.DashboardLayoutJson, 0).Version;
if (storedVersion > 2)
return Conflict(new { error = "dashboard_version_unsupported" });
if (Request.ContentLength > DashboardLayout.MaxBytes) return StatusCode(StatusCodes.Status413PayloadTooLarge);
// Bound actual bytes as well as Content-Length, including chunked bodies.
@@ -586,6 +587,8 @@ public sealed class AuthController : ControllerBase
}
catch (JsonException) { return BadRequest("Invalid dashboard layout JSON."); }
if (layout is null) return BadRequest("Invalid dashboard layout version, revision or widgets.");
if (layout.Version < storedVersion)
return Conflict(new { error = "dashboard_version_unsupported" });
if (layout.Revision != existing.DashboardLayoutRevision)
return Conflict(new { error = "dashboard_revision_conflict" });
var json = JsonSerializer.Serialize(layout, new JsonSerializerOptions(JsonSerializerDefaults.Web));