Commit Graph
104 Commits
Author SHA1 Message Date
openhands cebcf440c5 feat(catalog): record bulk edits, make deletions reversible, unify the tree read
A bulk offer edit is the catalog mutation that rewrites hundreds of rows at
once, and it was the only one writing nothing to the staff activity log: 22 of
the 43 catalog actions logged, this one did not. The entry it now writes says
what changed, not just that something did, because the log has no undo of its
own and "bulk updated 200 offers" cannot answer the question it exists for.

Deleting offers had no inverse at all. Every removed row is now kept at delete
time and the caller gets a restoreId back, so an accidental multi-select is a
click rather than a hand-edit of the table. The undo toast covers the common
case; a RecentDeletionsPanel holds the same records so a delete noticed later is
still reachable. Three refusals guard it: an id that another offer has since
taken, a category that no longer exists (which would leave an offer that sells
nowhere and shows under no page), and a delete whose restore record cannot be
written — that one rolls back rather than deleting without a way back. Reading
the audit row FOR UPDATE is also what stops two restores of one deletion from
both inserting.

sendCatalogUpdate() overwrote hotel-status.json on every write, so "which
imports reached the hotel" was answerable for the last attempt only, and a
failure two imports ago was gone by the time anyone looked. That file is now
also appended to as a bounded 50-entry tail.

The tree route carried four copies of the same page-select-plus-counts
shaping, of which the BC branches had already drifted: one counted offers
through the VARCHAR-tolerant helper, the other inline and swallowing errors.
All of it is one readPages() now, and readFullTree sends both catalogs through
one depth computation instead of delegating normal to getTreeFlat while
computing BC here — a split that left two implementations behind one function
name. getTreeFlat is gone. The BC ancestor walk also went from 20 levels to 50,
matching getAncestors, so a deeply nested catalog no longer loses its
breadcrumb.

Bulk editing reaches the BC catalog, which previously had no way to edit or
duplicate offers in bulk. The catalog is part of the operation identity now, so
replaying one request key against the other catalog is not mistaken for the
same work.

Integration tests failed to import: the next/cache mock supplied only
revalidatePath, and catalog-totals calls unstable_cache at module scope.
2026-09-30 18:19:36 +02:00
openhands f0c27eb815 feat(security): Cloudflare-aware IP trust and admin-tunable anti-DDoS
- resolveClientIp: trust cf-connecting-ip only behind cf-ray/cdn-loop, use nginx x-real-ip otherwise (anti-spoof)
- antiddos-config: Redis-backed live config (antiddos:config) with 30s cache, 13 ANTI_DDOS_* env vars
- ddos-guard: consume tunable rates/tiers via getAntiddosConfig
- admin panel at /admin/devops/antiddos (save/reset/unban actions, PERMS.SETTINGS_VIEW)
- register new admin page in housekeeping migration matrix (146 -> 147)
2026-09-22 22:22:51 +02:00
openhands c3ff497050 feat(referrals): add referral attribution and daily login rewards
- Track referral attribution at registration via ?ref code with
  same-IP and duplicate-pair guards
- Add daily login rewards with streak tracking, claim flow and
  sendCurrency payout backed by RCON with DB fallback
- Add admin pages for referral settings and the daily reward schedule
- Add migration 0033 with tables, seed schedule, settings and ACL grants
- Add admin.referrals.* and admin.dailyrewards.* permission slugs
- Localize new copy in en, nl and it
2026-09-20 12:29:01 +02:00
openhands 5b4b275b2a feat(housekeeping): add per-hotel theme manager with import/export and background
Theme Manager under /admin-next/hotel/theme-manager lets the owner save, apply, rename, delete, import, and export custom themes, plus set a custom site background by URL or upload. Themes are stored in WebsiteSetting/custom_themes JSON so they survive CMS updates.
2026-09-16 19:45:57 +02:00
openhands 438277a17a feat(studio): expand nitro cleanup with repair, auto-clean, and orphaned assets
Scan distinguishes fake, broken, and orphaned SWF/icon assets with age
metadata, deletes per asset kind, re-downloads broken nitro bundles from
configured sources, auto-cleans old fake leftovers, and exports a JSON
manifest. Adds rebuild and auto-clean API endpoints with audit coverage
and a housekeeping preview route under the hotel domain.

Verified: full vitest suite (2213 tests), typecheck, and biome all pass.
2026-09-15 21:59:21 +02:00
openhands ea4fd375b4 test(housekeeping): cover nitro cleanup page in migration matrix 2026-09-15 21:32:14 +02:00
Simo 13665e0c3c feat(catalog): persist idempotent bulk operations and retryable deliveries 2026-09-13 18:05:03 +02:00
Simo 00e33623f7 feat(devops): diagnose slow HK requests and dependency timings 2026-09-11 09:48:19 +02:00
Simo 1ef405be0a feat(cms): add recovery history and operational reliability tools 2026-09-09 21:57:56 +02:00
Simo c389c3893d feat(cms): improve catalog, editorial recovery and operations 2026-09-09 19:36:15 +02:00
Simo 667637f8da refactor(admin): remove legacy menu editor 2026-09-05 20:08:19 +02:00
Simo 816e3875c2 feat(admin): add production error center and refresh CMS dependencies 2026-09-05 19:53:09 +02:00
Simo 9af1e62655 feat: allow rank-gated housekeeping preview in production 2026-08-31 20:29:38 +02:00
openhands 3efd6c90f0 fix: use valid AuditState values for theme-builder migration entry 2026-08-31 17:22:19 +02:00
openhands 4c8225720a fix: resolve test failures for theme builder integration
- Replace hardcoded text-white and text-red-* with CSS variables in theme-editor
- Add theme-builder migration entry to housekeeping matrix
- Update legacy page counts from 137 to 138 in housekeeping tests
- Add /admin/theme-builder to content test prefixes
2026-08-31 17:21:37 +02:00
Simo b1ddda66ff Revert "Merge pull request 'Complete Housekeeping migration and /ase cutover' (#52) from codex/housekeeping-complete into main"
This reverts commit 488b6e57c4, reversing
changes made to b506b4499a.
2026-08-30 21:31:34 +02:00
Simo 4d0c8c7e65 test(housekeeping): finalize release evidence 2026-08-30 21:06:40 +02:00
Simo 222535e116 fix(housekeeping): close final authorization gaps 2026-08-30 21:01:32 +02:00
Simo 2b8f73a91d feat(housekeeping): cut over administration to ase 2026-08-30 20:35:22 +02:00
Simo 65a62867db style: complete cumulative biome checks 2026-08-30 19:44:05 +02:00
Simo 1ae59bcc1a fix(housekeeping): preserve runtime import boundaries 2026-08-30 19:40:57 +02:00
Simo b9c47aa89a style: satisfy cumulative biome checks 2026-08-30 19:38:36 +02:00
Simo cb77b2d3b9 fix(housekeeping): serialize workspace client props 2026-08-30 19:38:19 +02:00
Simo 8a31556d51 test(housekeeping): prove 137 route parity 2026-08-30 19:11:14 +02:00
Simo a113e48880 feat(housekeeping): finish accessible command deck 2026-08-30 18:49:10 +02:00
Simo 85ad0452d3 feat(housekeeping): compose operations workspace 2026-08-30 17:23:55 +02:00
Simo 5574e601bb feat(housekeeping): personalize command deck 2026-08-30 16:55:10 +02:00
Simo 300ac0ef95 feat(housekeeping): compose operational inbox 2026-08-30 16:26:20 +02:00
Simo bcb0ca977f feat(housekeeping): add global command deck search 2026-08-30 15:59:48 +02:00
Simo 2e95a106e0 feat(housekeeping): integrate studio operations 2026-08-30 15:29:58 +02:00
Simo 020c06f172 fix(housekeeping): connect hotel asset ownership 2026-08-30 14:43:50 +02:00
Simo abc707cfb2 feat(housekeeping): deliver hotel operations 2026-08-30 14:34:26 +02:00
Simo 9c4b973faf feat(housekeeping): deliver economy vertical 2026-08-30 13:47:06 +02:00
Simo 08358b8aa4 style: satisfy housekeeping biome gate 2026-08-30 11:59:24 +02:00
Simo d1160eb65a fix(housekeeping): address task 14 review round 3 2026-08-30 11:48:52 +02:00
Simo c524b305d7 fix(housekeeping): address task 14 review round 2 2026-08-30 11:30:17 +02:00
Simo d09eaa33d6 fix(housekeeping): address task 14 review round 1 2026-08-30 10:53:50 +02:00
Simo fd68819d9b feat(housekeeping): deliver content vertical 2026-08-30 01:54:43 +02:00
Simo 3fa1119f5a fix(housekeeping): address people moderation review 2026-08-29 23:53:38 +02:00
Simo 29fe22297b feat(housekeeping): complete people moderation parity 2026-08-29 22:38:50 +02:00
Simo 3d385d1869 Merge branch 'main' of https://gitlab.epicnabbo.nl/remco/EpicNext-Cms into codex/housekeeping-complete 2026-08-29 21:16:46 +02:00
Simo a6a288d9ff fix(housekeeping): restore people partial compatibility 2026-08-29 21:03:43 +02:00
openhands 7a41775c7e fix: disable route prefetching app-wide to avoid spurious requests
Wrap next/link in a shared Link component that ships prefetch=false by
default, so no route is ever prefetched (viewport or hover) anymore, and
drop the DNS prefetch hint. Removes hidden background requests that were
the source of intermittent issues.
2026-08-29 19:27:13 +02:00
Simo fcd1dfd96e fix(housekeeping): correct people partial audit evidence 2026-08-29 15:24:19 +02:00
Simo 91c9efcbb4 fix(housekeeping): complete people workflow fidelity 2026-08-29 14:39:38 +02:00
Simo 25b76437ff fix(housekeeping): harden people account workflows 2026-08-29 13:13:04 +02:00
Simo e1b31ff773 feat(housekeeping): deliver people account workflows 2026-08-29 11:45:50 +02:00
Simo 7920d4f46c fix(housekeeping): complete people read fidelity 2026-08-29 10:34:44 +02:00
Simo d1382c839e fix(housekeeping): harden people read boundaries 2026-08-29 02:13:53 +02:00
Simo e3f8b51d31 feat(housekeeping): model people workflows 2026-08-29 01:17:51 +02:00