Introduces a role-gated /admin section (sidebar layout, requireAdmin checked both in route loaders and independently in every admin server function) with three sections: - Orders: every order across all customers, and an admin-only order detail view nested under /admin so the sidebar persists and admin access bypasses the guest-token check. - Menu: create/edit/delete menu items, their options, and their preparation steps; deleting an item with past orders is refused (protected by the orderItems FK) instead of crashing. - Kitchen: read-only live view of every machine's busy/idle status and per-tag queue depth, with a manual refresh. Also: - Adds a `role` field to the user table (Better Auth additionalFields, input:false so it can't be self-assigned) and a db:seed-admin script to create/promote an admin account. - Fixes a real bug found while building this: src/server/auth.ts's shared session helpers were plain exported functions using a server-only import, which the framework couldn't tree-shake out of the client bundle once shared across multiple server/*.ts modules — this silently broke hydration app-wide. Fixed with createServerOnlyFn. - Removes the now-fully-unused @tanstack/devtools-vite plugin. - Disables view transitions for in-admin navigation so the persistent sidebar doesn't cross-fade/shift on every click. - Gives the "your orders" empty state the same visual treatment as the basket page's. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
23 lines
795 B
Bash
23 lines
795 B
Bash
DATABASE_URL=postgres://postgres:postgres@localhost:5433/ghost_kitchen
|
|
BETTER_AUTH_URL=http://localhost:3000
|
|
BETTER_AUTH_SECRET=
|
|
|
|
# ISO 4217 currency code this Kitchen charges and displays prices in, and
|
|
# the BCP 47 locale used to format it (decimal separator, digit grouping).
|
|
# Default to EUR / de-DE (this deployment's location) when unset.
|
|
VITE_CURRENCY=EUR
|
|
VITE_LOCALE=de-DE
|
|
|
|
# Optional: enables "Continue with Google" / "Continue with Apple" on the
|
|
# sign-in and sign-up pages. Leave unset to fall back to email/password only.
|
|
GOOGLE_CLIENT_ID=
|
|
GOOGLE_CLIENT_SECRET=
|
|
APPLE_CLIENT_ID=
|
|
APPLE_CLIENT_SECRET=
|
|
|
|
# Used by `npm run db:seed-admin` to create/promote one admin account
|
|
# (can view every order at /admin/orders). Not read by the app itself.
|
|
ADMIN_EMAIL=
|
|
ADMIN_PASSWORD=
|
|
ADMIN_NAME=
|