fix(dashboard): protect schema snapshots during delayed writes
This commit is contained in:
@@ -562,7 +562,7 @@ public sealed class AuthController : ControllerBase
|
||||
var userId = LocalAuthIdentity.GetRequiredUserId(User);
|
||||
if (userId is null) return Unauthorized();
|
||||
var existing = await _db.Users.AsNoTracking().Where(x => x.Id == userId)
|
||||
.Select(x => new { x.DashboardLayoutJson }).SingleOrDefaultAsync(cancellationToken);
|
||||
.Select(x => new { x.DashboardLayoutJson, x.DashboardLayoutRevision }).SingleOrDefaultAsync(cancellationToken);
|
||||
if (existing is null) return Unauthorized();
|
||||
if (DashboardLayout.Read(existing.DashboardLayoutJson, 0).Version > 1)
|
||||
return Conflict(new { error = "dashboard_version_unsupported" });
|
||||
@@ -585,6 +585,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.Revision != existing.DashboardLayoutRevision)
|
||||
return Conflict(new { error = "dashboard_revision_conflict" });
|
||||
var json = JsonSerializer.Serialize(layout, new JsonSerializerOptions(JsonSerializerDefaults.Web));
|
||||
var updated = await _db.Users.Where(x => x.Id == userId && x.DashboardLayoutRevision == layout.Revision)
|
||||
.ExecuteUpdateAsync(set => set.SetProperty(x => x.DashboardLayoutJson, json)
|
||||
|
||||
Reference in New Issue
Block a user