Revision history: change sets + revisions + revert — the undo substrate (#48) (#61)
Build image / build-and-push (push) Successful in 5s

Co-authored-by: Steve Dudenhoeffer <[email protected]>
This commit was merged in pull request #61.
This commit is contained in:
2026-07-21 05:07:30 +00:00
committed by steve
parent 653f381c4b
commit f208da94d6
16 changed files with 2169 additions and 19 deletions
+14 -2
View File
@@ -140,7 +140,8 @@ func (s *Service) ListGardens(ctx context.Context, actorID int64) ([]domain.Gard
// version mismatch it returns (current garden, ErrVersionConflict) so the handler
// can return the fresh row for the client to rebase.
func (s *Service) UpdateGarden(ctx context.Context, actorID, gardenID int64, in GardenInput, version int64) (*domain.Garden, error) {
if _, err := s.requireGardenRole(ctx, actorID, gardenID, roleOwner); err != nil {
before, err := s.requireGardenRole(ctx, actorID, gardenID, roleOwner)
if err != nil {
return nil, err
}
g, err := gardenFromInput(in, false) // no defaults: an update states every field
@@ -153,7 +154,18 @@ func (s *Service) UpdateGarden(ctx context.Context, actorID, gardenID int64, in
if updated != nil {
updated.MyRole = roleOwner.String() // only the owner reaches here
}
return updated, err
if err != nil {
return updated, err
}
// MyRole is computed, not stored; blank it in the snapshot so a revert can't
// write a role into a row that has no such column.
snap := *before
snap.MyRole = ""
after := *updated
after.MyRole = ""
s.record(ctx, gardenID, actorID, "Edited garden settings",
changeUpdate(domain.EntityGarden, gardenID, &snap, &after))
return updated, nil
}
// CopyGarden duplicates a garden into a new one owned by the actor, carrying