Update .env.example, tsconfig.json, and PHASE-TRACKING.md for WebUI integration and feature completion
- Added WEBUI_URL and SESSION_SECRET to .env.example for improved configuration. - Updated TypeScript target in apps/webui/tsconfig.json to ES2022 for modern features. - Revised PHASE-TRACKING.md to reflect the completion of Phase 6, detailing implemented features and pending manual tests for the WebUI, including Discord OAuth2 integration and session management.
This commit is contained in:
@@ -16,3 +16,8 @@ HEALTH_PORT=8080
|
|||||||
PUBLIC_BASE_URL=http://localhost:8080
|
PUBLIC_BASE_URL=http://localhost:8080
|
||||||
TWITCH_CLIENT_ID=
|
TWITCH_CLIENT_ID=
|
||||||
TWITCH_CLIENT_SECRET=
|
TWITCH_CLIENT_SECRET=
|
||||||
|
|
||||||
|
# WebUI (apps/webui)
|
||||||
|
WEBUI_URL=http://localhost:3000
|
||||||
|
# Must be at least 32 characters long. Generate e.g. with `openssl rand -hex 32`.
|
||||||
|
SESSION_SECRET=
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "ES2017",
|
"target": "ES2022",
|
||||||
"lib": ["dom", "dom.iterable", "esnext"],
|
"lib": ["dom", "dom.iterable", "esnext"],
|
||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
|
|||||||
@@ -194,17 +194,40 @@ Dieses Dokument hält den aktuellen Implementierungsstand fest. Es wird bei jede
|
|||||||
- Manuell auf Test-Server bestätigt (User-Freigabe)
|
- Manuell auf Test-Server bestätigt (User-Freigabe)
|
||||||
- Temp-Voice Control-Panel postet in den Voice-Kanal-Chat (statt DM)
|
- Temp-Voice Control-Panel postet in den Voice-Kanal-Chat (statt DM)
|
||||||
|
|
||||||
## Phase 6 – WebUI-Fundament (Status: in Arbeit)
|
## Phase 6 – WebUI-Fundament (Status: implementiert, manuelle Tests ausstehend)
|
||||||
|
|
||||||
### Geplant
|
### Abgeschlossen
|
||||||
|
|
||||||
- Next.js App Router (`apps/webui`), Discord OAuth2, Redis-Sessions
|
- `apps/webui` als `@nexumi/webui` (Next.js 15 App Router, Tailwind 4, React 19), Scripts `dev/build/start/lint/typecheck/test/prisma:generate`
|
||||||
- Dashboard-Layout (Sidebar, Server-Switcher, Dark/Light)
|
- `next.config.ts`: `output: 'standalone'`, `transpilePackages: ['@nexumi/shared']`, `outputFileTracingRoot` auf Monorepo-Root
|
||||||
- Settings-Framework mit Sticky-Save-Bar
|
- Env-Validierung (`src/lib/env.ts`, Zod): `DATABASE_URL`, `REDIS_URL`, `BOT_CLIENT_ID`, `BOT_CLIENT_SECRET`, `WEBUI_URL`, `SESSION_SECRET` (≥32 Zeichen), `SENTRY_DSN` optional, `DEFAULT_LOCALE`
|
||||||
- Shared Zod-API-Schemas; Guild-Settings- und Module-Toggle-API
|
- Discord-OAuth2-Login (`src/lib/discord-oauth.ts`): Authorize-URL, Code-Exchange, `/users/@me`, `/users/@me/guilds` (mit kurzlebigem Redis-Cache)
|
||||||
- Dashboard-Audit + Access-Rules (Prisma)
|
- Redis-Sessions (`src/lib/session.ts`): Cookie `nexumi_session` (httpOnly, sameSite=lax, secure in Produktion, 7 Tage), signiert via HMAC (`SESSION_SECRET`), Redis-Key `webui:session:{id}`
|
||||||
|
- Auth-Helfer (`src/lib/auth.ts`): `requireAuth`/`requireAuthOrRedirect`, `requireGuildAccess`/`requireGuildAccessOrRedirect` (Manage-Guild-Check + Bot-Präsenz in der DB), `toApiErrorResponse`
|
||||||
|
- `src/lib/guilds.ts`, `src/lib/guild-settings.ts`, `src/lib/modules.ts`, `src/lib/access-rules.ts`, `src/lib/audit.ts` (Dashboard-Audit-Log lesen/schreiben)
|
||||||
|
- Modul-Status-Aggregation (`getModuleStatuses`/`updateModuleStatuses`) über bestehende Prisma-Configs (AutoMod, Logging, Welcome, Verification, Leveling, Economy, Tickets, Starboard, Suggestions, Birthdays, TempVoice, Stats), Fun-Redis-Config (`fun:config:{guildId}`, neues Feld `enabled`) sowie einen generischen Redis-Hash `dashboard:modules:{guildId}` für Module ohne eigenes Enabled-Flag (Giveaways, Tags, Selfroles, Feeds, Scheduler, Guildbackup)
|
||||||
|
- Settings-Framework (`src/components/settings/`): `settings-form.tsx` (Dirty-Tracking, Sticky-Save-Bar, Toasts, Inline-Fehler), `save-bar.tsx`, `general-settings-form.tsx`, `module-toggles-form.tsx`, `access-rules-form.tsx`
|
||||||
|
- Layout (`src/components/layout/`): `theme-provider.tsx` (next-themes, Dark als Standard), `sidebar.tsx` (Modul-Gruppen aus `DASHBOARD_MODULES`), `server-switcher.tsx`, `user-menu.tsx`, `dashboard-shell.tsx`
|
||||||
|
- shadcn-artige UI-Komponenten (`src/components/ui/`): Button, Card, Input, Label, Switch, Select, Separator, Skeleton, Avatar, Badge, Dropdown-Menu — Indigo-Akzent (`#6366F1`) über CSS-Variablen in `globals.css`, Inter-Font via `next/font/google`
|
||||||
|
- i18n (`src/lib/i18n.ts`, `src/messages/de.json`, `src/messages/en.json`): Cookie `nexumi_locale`, vollständige de/en-Strings für Login, Dashboard, Settings, Module, Access, Fehler
|
||||||
|
- Seiten: `/`, `/login`, `/dashboard`, `/dashboard/[guildId]` (Übersicht mit Modul-Status + letzten 10 Audit-Einträgen), `/dashboard/[guildId]/settings`, `/dashboard/[guildId]/modules`, `/dashboard/[guildId]/access`, `/dashboard/[guildId]/[module]` (Platzhalter „Modul-Einstellungen kommen in Phase 7", i18n) — Skeleton-Ladezustände über `loading.tsx` je Route
|
||||||
|
- `middleware.ts`: leichte Edge-Prüfung auf vorhandenes Session-Cookie für `/dashboard/*`; vollständige Session-/Berechtigungsprüfung serverseitig in den Layouts
|
||||||
|
- API-Routen (alle Zod-validiert, Auth-geprüft, schreiben Dashboard-Audit bei PATCH/PUT): `GET /api/health`, `GET /api/auth/login`, `GET /api/auth/callback`, `POST /api/auth/logout`, `GET /api/auth/me`, `GET /api/guilds`, `GET|PATCH /api/guilds/[guildId]/settings`, `GET|PATCH /api/guilds/[guildId]/modules`, `GET|PUT /api/guilds/[guildId]/access-rules`, `GET /api/guilds/[guildId]/audit`
|
||||||
|
- `apps/webui/Dockerfile` (Multi-Stage: `pnpm --filter @nexumi/shared build`, `prisma generate --schema=../bot/prisma/schema.prisma`, `next build`, Standalone-Runner, `HEALTHCHECK` auf `/api/health`, `EXPOSE 3000`)
|
||||||
|
- `docker-compose.yml`: `webui`-Service baut jetzt aus `apps/webui/Dockerfile`, `env_file: .env`, `depends_on` Postgres/Redis (healthy), Healthcheck, bestehende Traefik-Labels beibehalten
|
||||||
|
- `.env.example` ergänzt um `WEBUI_URL`, `SESSION_SECRET` (Kommentar: ≥32 Zeichen); lokale `.env` um `WEBUI_URL` und generiertes `SESSION_SECRET` ergänzt (keine bestehenden Werte überschrieben)
|
||||||
|
- Tests: `src/lib/utils.test.ts` (`cn()`), bestehende `packages/shared/src/phase6.test.ts` (Zod-Schemas, `hasManageGuildPermission`)
|
||||||
|
|
||||||
|
### Manuelle Tests (noch offen)
|
||||||
|
|
||||||
|
- Discord Developer Portal: OAuth2-Redirect `http://localhost:3000/api/auth/callback` (bzw. `https://nexumi.de/api/auth/callback` in Produktion) unter „OAuth2 → Redirects" eintragen; Scopes `identify guilds` sind Standard-OAuth2-Scopes, keine Extra-Freigabe nötig
|
||||||
|
- Login-Flow Ende-zu-Ende gegen echten Discord-Account testen (`/login` → Discord-Consent → `/dashboard`)
|
||||||
|
- Dashboard-Zugriff mit einem Account ohne „Server verwalten"-Recht prüfen (muss auf `/dashboard` zurückspringen)
|
||||||
|
- Modul-Toggles je Modul speichern und in der Bot-DB/Redis verifizieren (insbesondere Fun `enabled` und den neuen Redis-Hash `dashboard:modules:{guildId}`)
|
||||||
|
- Access-Rules anlegen/löschen und Dashboard-Audit-Log-Einträge in der DB prüfen
|
||||||
|
- `docker compose up -d --build webui` gegen laufenden Postgres/Redis-Stack verifizieren
|
||||||
|
|
||||||
## Nächster geplanter Schritt
|
## Nächster geplanter Schritt
|
||||||
|
|
||||||
- Phase 6 fertigstellen, dann nach Freigabe Phase 7 (Modul-Seiten + Owner-Panel).
|
- Nach Freigabe der manuellen Phase-6-Tests: Phase 7 (Modul-Seiten je Modul + Owner-Panel).
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user