Commit Graph
312 Commits
Author SHA1 Message Date
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 91e649398c feat(i18n): make admin and catalog components fully translatable 2026-09-18 16:02:08 +02:00
openhands 03774bb411 feat(i18n): make admin and catalog components translatable 2026-09-18 14:56:36 +02:00
openhands 8638e81444 refactor(db): typed query helpers, shared test FormData helper
Replace raw db.execute tuple casts with queryRows/rowsFrom/execResult/
affectedRows helpers from lib/db, drop redundant mysql2 casts on typed
query builders, and centralize per-test fakeForm into test/fake-form.
Update db mocks in tests so helpers resolve against mocked execute.
2026-09-17 21:02:57 +02:00
openhands 694f87d98c feat(studio): add nitro cleanup tool for fake and broken bundles 2026-09-15 20:54:10 +02:00
openhands 67430e7e9d Polish catalog studio: undo delete, save status pill, faster totals 2026-09-14 18:24:47 +02:00
openhands 1df1ffc3e9 Make avatar imager resilient with upstream fallback everywhere 2026-09-14 17:35:36 +02:00
openhands 1bbd809b43 Replace standalone catalog editor with the unified Visual Catalog studio
Make /admin/catalog a full-screen catalog studio that replaces the old
listing plus separate [id]/builder-club detail pages:

- Embed CatalogManagerWorkspace on /admin/catalog with a Normal/Builder
  Club toggle, Catalog Sync status, packages (normal), Organize imports
  and a diagnostics link to /admin/studio/maintenance.
- Manage BC items directly in the studio Items tab (new BcItemsEditor,
  CRUD via existing bc actions; /api/admin/catalog/items now serves BC).
- Inline editor: add pageTextTeaser field for both catalogs and remove
  the legacy full-editor links.
- Remove the 'Open full editor' context action from the tree.
- Move catalog-items-table (dir + barrel) and catalog-translate-tab out
  of the app route into src/components/admin/catalog and update all
  importers.
- Keep /admin/catalog/[id], builder-club/[id] and /admin/catalog/maintenance
  as redirects into the new studio; consolidate maintenance panels into
  /admin/studio/maintenance and point the nav item there.
- Delete the old listing/table/tabs/forms and the standalone bc-manager.
2026-09-14 17:20:52 +02:00
Simo 60e49c1ec9 feat(hk): connect delivery failures to precise diagnostic records 2026-09-13 20:25:03 +02:00
Simo c5c9941768 feat(hk): explain background updates with protected content links and retry details 2026-09-13 19:41:25 +02:00
Simo dd7613850e perf(studio): load import organization tools on demand 2026-09-13 19:32:46 +02:00
Simo 8abfe352ef fix(security): authorize site uploads and harden tokens, media and request identity 2026-09-13 19:24:43 +02:00
Simo 52f6d1491f fix(news): persist publication requests and retry cache delivery 2026-09-13 18:33:45 +02:00
Simo c977fe95ba fix(studio): recover uncertain imports with persistent request identities 2026-09-13 18:33:06 +02:00
Simo afea80708c perf(studio): defer import history and Nitro scale tools until opened 2026-09-13 18:29:24 +02:00
Simo 13665e0c3c feat(catalog): persist idempotent bulk operations and retryable deliveries 2026-09-13 18:05:03 +02:00
Simo 8f55ff2d17 feat(docker): guide clone installation and validate paired update artifacts 2026-09-13 17:57:14 +02:00
openhands cbf056838f perf(admin): cache global admin list totals via redisCache
Introduce getCachedAdminCount to cache un-filtered table count(*) queries in Redis for admin lists (starting with UsersPage), avoiding heavy full table scans on every request while keeping exact counts for search/filtered queries.
2026-09-13 13:32:51 +02:00
openhands 388d8992f8 feat: add CSV/JSON export, advanced bulk filters & selection to Catalog Manager
- Admin Audit Log: CSV/JSON export via ?format=query param
- Catalog Manager: club_only / have_offer filters (multi-filter support)
- Offer discovery: refactored discoverOffers() to accept filters object
- Translations added for new filter labels
- Test updates for all modified paths
2026-09-12 20:40:33 +02:00
openhands 01a85ebcd0 feat(studio): add organize-imports tool with suggestion review and approval
Adds a Studio 'Organize imports' dialog that groups recently imported
furniture and furniture already sitting in the auto-created import
pages into suggested catalog categories.  Each group is presented with
its suggested name, icon, and layout which can be overridden before
approval; approved groups are turned into real catalog pages in a
single atomic export run.  Offers already inside the import subtree are
moved to the new pages; brand-new furniture gets a fresh offer.

- groupSuggestedCategories: generic pure helper reusing the same
  per-item label heuristic that drives suggestCategoryName; items with
  no label land in a 'Other Furni' remainder bucket
- GET /api/admin/import/organize: returns items from the imported
  furniture tree (catalog_items JOIN items_base via page id set from
  the imported-furniture root) union audit-logged but not-yet-placed
  recent imports; marks alreadyPlaced vs new
- organizeImportFurni server action: validates import-page membership
  before moving any offer, creates pages + inserts/moves items in one
  withCatalogExport snapshot, logs activity
- OrganizeImportsDialog: full-featured Studio dialog with price panel
  (applies to new offers only), parent select, per-group approval,
  editable name/icon/layout with suggestion reset chips, source tags
- import-pages.ts server helper: locates the imported-furniture tree
- Studio nav: 'Organize imports' button with FolderTree icon,
  gated on CATALOG_EDIT, wired next to the catalog manager
- en + nl translations for organizeImports.* keys with ICU plurals
- groupSuggestedCategories unit tests (deterministic grouping,
  remainder handling, size+alpha ordering, label consistency)
2026-09-11 19:38:18 +02:00
openhands f5c2c05f6e feat(studio): surface the Visual Catalog Manager in the Studio nav
The catalog manager (with auto-category wizard) now lives inside the Studio
navigation for teams that manage furniture inline. The button is gated on
CATALOG_EDIT; only users with that permission see the launcher.

- Split server/client Studio layout to derive permissions server-side
- Add optional triggerLabel prop to CatalogManagerDialog for custom labels
- Wire the Catalog manager button in the Studio nav right cluster
- Keep existing /admin/catalog entry points unchanged
2026-09-11 18:54:52 +02:00
Simo baeb54aeb5 feat(devops): separate public page server timing diagnostics 2026-09-11 10:49:08 +02:00
Simo d5091d1a73 fix(hk): protect unsaved editors and await prefix save results 2026-09-11 10:48:34 +02:00
Simo 00e33623f7 feat(devops): diagnose slow HK requests and dependency timings 2026-09-11 09:48:19 +02:00
Simo 88790d1a0d feat(cms): recover drafts and failed imports with verified UI workflows 2026-09-11 08:58:10 +02:00
Simo db4acbb46e feat(editorial): validate publications and preserve partial event updates 2026-09-11 00:36:55 +02:00
Simo 76f0420d64 feat(import): run catalog synchronizations as durable jobs 2026-09-11 00:36:22 +02:00
Simo a2954e4408 feat(diagnostics): correlate staff operations errors and audit records 2026-09-11 00:34:49 +02:00
Simo 25d0a13050 feat(support): filter waiting tickets and staff assignments 2026-09-11 00:20:54 +02:00
openhands 3e69b72513 feat(catalog): prevent and repair Arcturus emulator data errors
Block invalid catalog_items writes at the API level (points currency
allowlist, non-negative prices, positive amount, limited stack >= sold
count, unique sibling order numbers) and auto-assign unique order numbers
on bulk create. Add a catalog-maintenance scan + transactional repair that
fixes pre-existing rows: resets unsupported points_type, clamps negative
costs, sets amount to 1, raises limited_stack, renumbers duplicate orders
and deletes offers with missing page/item references. Surface the issue
count and a fix button in the admin maintenance panel.

Also: add enabled/retired flag to clone sources, classify poster and
currency furniture in item-kind, and remove the obsolete update-Nitrov3.sh.
2026-09-10 11:29:28 +02:00
Simo 1ef405be0a feat(cms): add recovery history and operational reliability tools 2026-09-09 21:57:56 +02:00
Simo 89526af344 feat(hk): expand search and add operational user overview 2026-09-09 21:14:10 +02:00
Simo 047cd9f3dd feat(catalog): add saved packages, preview and bulk price editing 2026-09-09 20:04:10 +02:00
Simo c389c3893d feat(cms): improve catalog, editorial recovery and operations 2026-09-09 19:36:15 +02:00
Simo c4496e710b feat(docker): prepare portable images with runtime hotel configuration 2026-09-07 22:37:53 +02:00
Simo 7033d65846 fix(ui): make shared switches visible across CMS themes 2026-09-06 21:30:13 +02:00
Simo 93a7e9a7c2 feat(catalog): improve visual manager search and offer discovery 2026-09-06 20:58:53 +02:00
Simo 55a47949f1 feat(catalog): add reviewed bulk edits and complete category duplication 2026-09-06 20:25:19 +02:00
Simo 0bedc04692 fix(catalog): open visual manager from dedicated button 2026-09-06 19:58:10 +02:00
Simo 193b6686a9 refactor(catalog): unify commands and embed guarded catalog workspace 2026-09-06 19:40:52 +02:00
Simo 9b0ea2fb16 fix(news): restore publication flow and deduplicate dashboard friends 2026-09-06 18:32:43 +02:00
Simo ef94646d60 fix(i18n): persist CMS translations and validate message catalogs 2026-09-06 17:55:11 +02:00
Simo 96234075f8 refactor(admin): remove sidebar favorites 2026-09-06 17:25:04 +02:00
Simo a070004e7b feat(admin): reorganize housekeeping and strengthen shared workflows 2026-09-06 17:17:30 +02:00
openhands 9ae03056e2 chore: remove 4 unused files (theme-editor-fields, use-user-bulk-actions, user-columns, use-media-library) 2026-09-05 23:27:02 +02:00
openhands 8c12fc6c60 refactor(cms): deduplicate shared admin components and fix studio batch completion
- fix(studio): stop markBatchDone infinite recursion so batches complete
- refactor(api): merge api-response into api and drop the duplicate module
- refactor(media): extract shared media loader and URL validator
- refactor(ui): extract shared LoadingSpinner for site and admin groups
- refactor(dates): consolidate raw date formatting into formatDate util
- refactor(logs): share a single generic log-list loader across tables
- refactor(theme): merge both ColorField components and reuse contrast helpers
- refactor(import): extract shared ImportErrorBanner and SearchInput
- chore(): remove dead theme-editor-tabs after inlining tab components
2026-09-05 20:58:42 +02:00
Simo 180129699c Merge remote-tracking branch 'origin/main' into codex/catalog-studio-ux 2026-09-05 20:16:51 +02:00
Simo 51d1284950 feat(admin): organize command center controls and diagnostics 2026-09-05 20:15:35 +02:00
openhands fdbb143558 fix: resolve syntax error and missing AlertCircle import in furni upload 2026-09-05 20:13:13 +02:00