Skip to content

feat(api): auditable map revisions with deltas + periodic snapshots (#12) - #347

Open
Aduersarius wants to merge 1 commit into
Bitcoindefi:mainfrom
Aduersarius:feat/map-audit-undo-rollback-12
Open

feat(api): auditable map revisions with deltas + periodic snapshots (#12)#347
Aduersarius wants to merge 1 commit into
Bitcoindefi:mainfrom
Aduersarius:feat/map-audit-undo-rollback-12

Conversation

@Aduersarius

Copy link
Copy Markdown

Summary

Implements OpenAO #12 with the issue's recommended deltas + periodic snapshots design (snapshot every 20 revisions), plus undo/redo, arbitrary rollback, readable diffs, and requiresRepublish when undoing a publish.

Closes #12

Design

  • New tables game_map_revisions / game_map_revision_heads
  • Each paint/clear/publish/discard/revert appends a compact tile delta (before/after per changed coord)
  • Every 20th revision also stores a full snapshot so reconstruction stays bounded
  • undo inverts the current head delta and sets requiresRepublish if the undone op was publish (published world is not silently changed without an explicit republish)
  • redo / rollback / diff rebuild via nearest snapshot + forward deltas

Admin API

  • GET /admin/game-data/maps/:mapNum/revisions
  • GET /admin/game-data/maps/:mapNum/revisions/diff?from=&to=
  • GET /admin/game-data/maps/:mapNum/revisions/:revisionId
  • POST /admin/game-data/maps/:mapNum/undo
  • POST /admin/game-data/maps/:mapNum/redo
  • POST /admin/game-data/maps/:mapNum/rollback/:revisionId

Differentiation vs #73

#73 stores full before/after snapshots on every operation inside worldBuilder.ts. This PR follows the issue suggestion: lightweight deltas + periodic snapshots, isolated in gameMapRevisions.ts, so undo is natural and storage stays bounded for long edit sessions.

Test plan

  • Unit tests for delta round-trip / invert-undo / publish draft→published visibility (api/src/tests/mapRevisions.unit.test.ts)
  • Apply schema migration locally; paint → list revisions → undo → redo → rollback
  • Undo after publish returns requiresRepublish: true and does not leave draft as silently live

GrantFox OpenAO bounty submission for #12.

…Bitcoindefi#12)

Store compact tile deltas for paint/clear/publish/discard/revert with a
full snapshot every 20 revisions. Adds undo/redo/rollback/diff admin
endpoints and requiresRepublish when undoing a published change.
@gitar-bot

gitar-bot Bot commented Sep 6, 2026

Copy link
Copy Markdown

Important

You are using the Gitar free plan. Upgrade to unlock code review, CI analysis, auto-apply, custom automations, and more.

Gitar

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Etapa 3: log de auditoria, deshacer y rollback de mapas

1 participant