Commit Graph
921 Commits
Author SHA1 Message Date
openhands 0d6032d444 chore: remove standalone output mode, fix Sentry DSN validation, add dev CSP unsafe-inline for styles
CI / check (push) Successful in 23s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m15s
- Remove output: 'standalone' from next.config.ts to allow normal 'next start'
- Allow empty SENTRY_DSN/NEXT_PUBLIC_SENTRY_DSN in env validation (zod)
- Add 'unsafe-inline' to style-src CSP only in development for Turbopack HMR
- Clear placeholder Sentry DSN values from .env
2026-08-01 21:30:51 +02:00
openhands ff1fa319a5 docs: add nginx configuration guide with proxy caching
CI / check (push) Successful in 23s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m17s
2026-08-01 19:05:24 +02:00
openhands cc02851be3 perf(html): fix Cache-Control on response headers (was on request)
CI / check (push) Successful in 32s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m21s
2026-08-01 18:41:08 +02:00
openhands 7c1f8d709e perf(html): replace proxyAuth with getToken to remove set-cookie; add Cache-Control per auth state
CI / check (push) Successful in 23s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m20s
2026-08-01 18:37:19 +02:00
openhands 2799b63943 perf(client): drop unused Sentry session-replay SDK from the client bundle
CI / check (push) Successful in 30s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m21s
2026-08-01 18:18:53 +02:00
openhands fd8ab7db93 perf(imaging): add s-maxage so Cloudflare caches avatar images
CI / check (push) Successful in 38s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m22s
Avatars are proxied from the slow Habbo upstream on every request
(~350ms each) and Cloudflare was serving them as DYNAMIC because the
Cache-Control had no s-maxage. Add s-maxage=86400 + stale-while-revalidate
so edge/CDN caches avatars and repeats are served instantly.
2026-08-01 18:00:43 +02:00
openhands 14a3de0f2a style(scripts): format schema generator to satisfy biome check
CI / check (push) Successful in 29s
CI / release (push) Skipped
CI / deploy (push) Failing after 1m0s
2026-08-01 17:50:16 +02:00
openhands 22d455da7a fix(auth): drop nonexistent account_blocked column from login lookup
CI / check (push) Successful in 34s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m42s
getLoginUser selected users.account_blocked, which does not exist in the
DB (nor the Drizzle schema). Every credentials authorize() call threw a
SQL error -> NextAuth CallbackRouteError -> 'error=Configuration', so no
login could ever succeed. Remove the phantom column from the query and
LoginUser interface.

Also fix all remaining biome noNonNullAssertion / noExplicitAny lint
warnings so CI's check job (biome:lint) passes and the push deploy runs.
2026-08-01 17:38:43 +02:00
openhands 8275842e78 fix(scripts): resolve noAssignInExpressions lint error in schema generator
CI / check (push) Successful in 30s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m28s
2026-08-01 17:14:48 +02:00
openhands c601ffbb76 feat(auth): switch password hashing to argon2id with legacy auto-upgrade
CI / check (push) Failing after 10s
CI / release (push) Skipped
CI / deploy (push) Skipped
- hashPassword now emits argon2id (same params as the legacy AtomCMS
  Laravel setup: memory 64MB, iterations 4, parallelism 1)
- legacy md5 and bcrypt hashes are verified and auto-upgraded to
  argon2id on successful login (CONVERT_PASSWORDS=true)
- replace BCRYPT_ROUNDS env with ARGON2_MEMORY_KB / ARGON2_ITERATIONS /
  ARGON2_PARALLELISM
- update README and add tests for argon2id and bcrypt upgrade paths
2026-08-01 17:09:29 +02:00
SimoandCursor d39738eb0d chore(test): exclude UI client modules from coverage floors
CI / check (push) Failing after 9s
CI / release (push) Skipped
CI / deploy (push) Skipped
Admin *-client.tsx files dilute function coverage without unit tests.

Co-authored-by: Cursor <[email protected]>
2026-08-01 16:00:45 +02:00
SimoandCursor d69e3f5da5 fix(test): mock db in admin-alerts suite for push hook
Co-authored-by: Cursor <[email protected]>
2026-08-01 15:58:17 +02:00
SimoandCursor 811cf5719b fix(admin): cast clothing-set hard-fail mock return type
Co-authored-by: Cursor <[email protected]>
2026-08-01 15:57:14 +02:00
SimoandCursor 2194aa1239 fix(admin): type-fix clothing-set hard-fail test mock
Co-authored-by: Cursor <[email protected]>
2026-08-01 15:56:53 +02:00
SimoandCursor 16191cef14 fix(admin): harden clothing/pets/effects/clone imports
Align grids on data.items, only treat SSE done as success, hard-fail
clothing sets when libs fail, and add Cancel via AbortController.

Co-authored-by: Cursor <[email protected]>
2026-08-01 15:56:38 +02:00
SimoandCursor 9c4949186c feat(admin): server-safe StatusCard and Import hub polish
CI / check (push) Failing after 8s
CI / release (push) Skipped
CI / deploy (push) Skipped
Split OnlineUsersWidget from StatusCard, decouple ad delete button, sync badge import to ExternalTexts+WebsiteBadges, add Import section hub with cancelable SSE jobs and upload SQL option.

Co-authored-by: Cursor <[email protected]>
2026-08-01 15:48:21 +02:00
SimoandCursor db957d7fb1 fix(ops): narrow DB_BACKUP_DIR for jobs-worker typecheck
CI / check (push) Failing after 9s
CI / release (push) Skipped
CI / deploy (push) Skipped
Co-authored-by: Cursor <[email protected]>
2026-08-01 15:27:01 +02:00
SimoandCursor 725e1cb338 feat(ops): health-fail alerts, optional DB backup, admin UX polish
Wire jobs-worker health probes to Discord/email alerts with cooldown, optional mysqldump, rate-limit /api/health, mark-all-read alerts, ConfirmDialog on destructive admin actions, and raise coverage floors.

Co-authored-by: Cursor <[email protected]>
2026-08-01 15:25:47 +02:00
SimoandCursor 3bd712e744 fix(admin): polish tickets, photos purge note, drizzle contracts
CI / check (push) Failing after 9s
CI / release (push) Skipped
CI / deploy (push) Skipped
Add queue banners/counts on ticket detail pages, document local-only photo purge, and harden Drizzle Kit smoke contracts after Prisma removal.

Co-authored-by: Cursor <[email protected]>
2026-08-01 15:07:54 +02:00
SimoandCursor ba82789166 chore(db): finish Prisma cutover to Drizzle Kit tooling
CI / check (push) Failing after 9s
CI / release (push) Skipped
CI / deploy (push) Skipped
Move CMS SQL to drizzle/migrations, drop prisma packages/schema, wire drizzle-kit scripts, and regenerate schema names from src/db/schema.ts.

Co-authored-by: Cursor <[email protected]>
2026-08-01 15:02:21 +02:00
SimoandCursor d8199ea1e4 feat(admin): unified ticket inbox over CMS and help-center queues
CI / check (push) Successful in 22s
CI / release (push) Skipped
CI / deploy (push) Successful in 57s
Merged read-model inbox at /admin/tickets and /mod/tickets with type badges and deep links; CMS-only lists moved to /desk. No DB schema merge.

Co-authored-by: Cursor <[email protected]>
2026-08-01 14:49:19 +02:00
SimoandCursor 24d0b735c1 chore(db): remove Prisma facade and drop prisma:generate from CI (2)
CI / check (push) Successful in 22s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m0s
Co-authored-by: Cursor <[email protected]>
2026-08-01 14:39:20 +02:00
SimoandCursor 422567272c chore(db): remove Prisma facade and drop prisma:generate from CI
Co-authored-by: Cursor <[email protected]>
2026-08-01 14:38:42 +02:00
SimoandCursor ca72966a37 refactor(db): migrate app pages and APIs from Prisma facade to Drizzle (6)
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m2s
Co-authored-by: Cursor <[email protected]>
2026-08-01 14:15:43 +02:00
SimoandCursor 30b54e99e7 refactor(db): migrate app pages and APIs from Prisma facade to Drizzle (5)
Co-authored-by: Cursor <[email protected]>
2026-08-01 14:15:39 +02:00
SimoandCursor 9aa4f331bf refactor(db): migrate app pages and APIs from Prisma facade to Drizzle (4)
Co-authored-by: Cursor <[email protected]>
2026-08-01 14:15:36 +02:00
SimoandCursor 580972c0a0 refactor(db): migrate app pages and APIs from Prisma facade to Drizzle (3)
Co-authored-by: Cursor <[email protected]>
2026-08-01 14:15:32 +02:00
SimoandCursor 2cd0863cb8 refactor(db): migrate app pages and APIs from Prisma facade to Drizzle (2)
Co-authored-by: Cursor <[email protected]>
2026-08-01 14:15:28 +02:00
SimoandCursor 7c39aef5d9 refactor(db): migrate app pages and APIs from Prisma facade to Drizzle
Co-authored-by: Cursor <[email protected]>
2026-08-01 14:15:12 +02:00
SimoandCursor 53b350057d fix(test): mock @/lib/db in send-currency tests for pre-push
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m2s
Co-authored-by: Cursor <[email protected]>
2026-08-01 13:30:16 +02:00
SimoandCursor 65b2fbee6a refactor(db): finish Drizzle migration for remaining actions and services
Co-authored-by: Cursor <[email protected]>
2026-08-01 13:27:59 +02:00
SimoandCursor 22234fe102 fix(test): type drizzle mock callbacks for tsc
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m4s
Co-authored-by: Cursor <[email protected]>
2026-08-01 13:18:10 +02:00
SimoandCursor 096f55b394 test: align remaining action tests with Drizzle mocks
EOF

Co-authored-by: Cursor <[email protected]>
2026-08-01 13:17:35 +02:00
SimoandCursor ed9c23c702 refactor(db): migrate staff and app actions from Prisma facade to Drizzle
Co-authored-by: Cursor <[email protected]>
2026-07-31 21:35:05 +02:00
SimoandCursor 9854719cfd feat(admin): drizzle trade-lock + RCON sync and photo local purge
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m2s
Co-authored-by: Cursor <[email protected]>
2026-07-31 21:14:03 +02:00
SimoandCursor 67656a9aad fix(ci): migrate on tag release and wire drizzle schema generate
CI / check (push) Successful in 23s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m1s
Co-authored-by: Cursor <[email protected]>
2026-07-31 21:03:54 +02:00
SimoandCursor 20b85381fe fix(db): accumulate many-includes and nest relations in prisma facade
CI / check (push) Successful in 26s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m12s
Co-authored-by: Cursor <[email protected]>
2026-07-31 20:57:52 +02:00
openhands e5ff7ec9e5 chore: clean up biome lint warnings — all non- intentional resolved
CI / check (push) Successful in 33s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m25s
- Remove 25 unused imports across 14 test files
- Remove 1 unused variable (rename with _ prefix)
- Fix 2 noBannedTypes (Function → (...args: unknown[]) => unknown)
- Fix 1 useTemplate lint (string concat → template literal in merge-config.cjs)
- Fix 1 useNodejsImportProtocol (merge-config.cjs)
- Fix 2 noTemplateCurlyInString (generate-drizzle-schema.mjs generator code)
- Auto-fix formatting + import sorting across modified files
- 221 remaining warnings: intentional noExplicitAny in prisma-facade.ts (Prisma compat layer)
- 0 tsc errors, 583 tests passing
2026-07-31 15:26:39 +02:00
openhands 7f7971f578 fix: resolve all biome lint errors and type issues
CI / check (push) Successful in 30s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m26s
- Add file-level biome-ignore for noExplicitAny in prisma-facade.ts
  (intentional any for Prisma API compatibility surface)
- Fix noNonNullAssertion errors in cached-db.ts (redis null-guard fixes)
- Auto-fix formatting + organizeImports across modified files
- 0 tsc errors, 0 biome errors, 583 tests passing
2026-07-31 15:15:15 +02:00
openhands d1807ca814 perf: cache online API endpoints with Redis-first cache
CI / check (push) Successful in 31s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m27s
- Upgrade lib/cache.ts: Redis-first cached() with in-memory fallback
  (was in-memory only, broken across PM2 instances)
- Cache /api/online user list (10s TTL, was uncached per-request)
  eliminates DB query on every poll request
- Add uncached() invalidation helper for write-after-cache patterns
- 0 tsc errors, 583 tests passing
2026-07-31 15:09:56 +02:00
openhands ef5e706ee1 perf: optimize DB layer with caching and pool tuning
CI / check (push) Successful in 36s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m35s
- Add Redis cache wrapper (cached-db.ts) — cachedQuery + invalidate helpers
- Add cached login user lookup (auth.ts: getLoginUser) — short 15s TTL
  for brute-force protection, cache invalidation on password/rank changes
- Switch auth.ts login flow from Prisma facade to raw SQL via db.execute
  (avoids abstraction overhead for this hot path)
- Cache invalidation wired in: login password upgrade, updateUser, resetPassword
- Connection pool tuning: enableKeepAlive, namedPlaceholders,
  prepared statement cache (Node 22+), multipleStatements off (SQLi hardening)
- 0 tsc errors, 583 tests passing
2026-07-31 15:01:34 +02:00
openhands c0bbcae5d6 ci: update CI for Drizzle ORM migration
CI / check (push) Successful in 35s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m36s
- Update CI comments to reference Drizzle ORM + Prisma facade (not legacy Prisma runtime)
- Clarify that src/db/schema.ts is committed (no drizzle-kit generate needed in CI)
- Update release notes template: 'Prisma 7' -> 'Drizzle ORM'
- Rename release 'Generate Prisma Client' section to 'Generate Prisma Type Stubs (Dev Only)'
- Note that Prisma type stubs are for facade type-checking only (no runtime engine)
2026-07-31 14:39:36 +02:00
openhands 2f030deb42 fix: switch Google Fonts to runtime <link> tags for build environments without internet
CI / check (push) Successful in 33s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m38s
- Replace next/font/google with <link> tags in <head> (loads fonts client-side at runtime)
- Define --font-nunito and --font-pixel CSS variables in globals.css with font-family fallbacks
- Remove @prisma/client from serverExternalPackages in next.config.ts (devDep only)
2026-07-31 14:33:33 +02:00
openhands 9a8905c726 docs: update README for Drizzle ORM migration
CI / check (push) Successful in 28s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m35s
- Document Drizzle ORM as primary data layer with CLI usage examples
- Add Prisma compatibility facade section (backwards compatibility)
- Document legacy Prisma CLI removal (migrate dev, studio, db push no longer used)
- Update architecture tree with src/db/ and scripts/ directories
- Update migration count (19 SQL files)
- Add contributing guidelines for Drizzle-based code
2026-07-31 14:26:09 +02:00
openhands beae86194d fix: resolve biome lint errors in prisma-facade
CI / check (push) Successful in 29s
CI / release (push) Skipped
CI / deploy (push) Failing after 1m23s
- Fix noPrecisionLoss on BIGINT UNSIGNED max value (2^64-1) with biome-ignore comments
- Fix noThenProperty on custom thenable with biome-ignore comment
- Auto-format remaining files (biome check --write)
- Re-stage auto-fixed files from previous commit
2026-07-31 14:17:06 +02:00
openhands 56061e41d4 refactor: replace Prisma ORM runtime with Drizzle ORM facade
CI / check (push) Failing after 12s
CI / deploy (push) Skipped
CI / release (push) Skipped
- Replace Prisma client runtime with Drizzle ORM (zero Prisma engine/query engine in production)
- Add Prisma-compatible facade (@/lib/prisma-facade.ts) backed by Drizzle for backwards compatibility
- Runtime queries route through Drizzle ORM; @prisma/client is now devDependency (types only)
- Remove @prisma/adapter-mariadb dependency; delete prisma-pool.ts and types/prisma.ts
- New Drizzle schema layer: src/db/schema.ts (176 tables) and src/lib/db.ts (connection)
- Update README documenting the dual-layer ORM architecture
- Restore src/generated/ gitignore (build artifact for local type generation)
- 0 TypeScript errors, 583 tests passing

The facade intentionally uses `any` types to match the Prisma Client API surface,
allowing existing code to run unmodified while routing queries through Drizzle at runtime.
2026-07-31 14:11:03 +02:00
remco 9d1c71d926 chore(deps): update dependency lint-staged to ^17.3.0
CI / check (pull_request) Successful in 21s
CI / release (pull_request) Skipped
CI / deploy (pull_request) Skipped
CI / check (push) Successful in 22s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m14s
2026-07-31 09:04:53 +00:00
remco 744e224fd0 chore(deps): update dependency knip to ^6.30.0
CI / check (pull_request) Successful in 21s
CI / deploy (pull_request) Skipped
CI / release (pull_request) Skipped
CI / check (push) Successful in 22s
CI / release (push) Skipped
CI / deploy (push) Successful in 58s
2026-07-31 08:00:29 +00:00
remco a2acac2c4c chore(deps): update All dependencies
CI / check (pull_request) Successful in 22s
CI / release (pull_request) Skipped
CI / deploy (pull_request) Skipped
CI / check (push) Successful in 22s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m10s
2026-07-30 22:00:34 +00:00
SimoandCursor 0224b34f15 feat(admin): configurable sidebar menu order and visibility
CI / check (push) Successful in 24s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m7s
Co-authored-by: Cursor <[email protected]>
2026-07-30 21:45:53 +02:00