From 4fcbe38b56efde8a4f0dd03054eee25d57184a64 Mon Sep 17 00:00:00 2001 From: smueller Date: Wed, 22 Jul 2026 14:04:35 +0200 Subject: [PATCH] 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. --- .env.example | 5 +++++ apps/webui/tsconfig.json | 2 +- docs/PHASE-TRACKING.md | 39 +++++++++++++++++++++++++++++++-------- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/.env.example b/.env.example index d9d8acb..52f19dd 100644 --- a/.env.example +++ b/.env.example @@ -16,3 +16,8 @@ HEALTH_PORT=8080 PUBLIC_BASE_URL=http://localhost:8080 TWITCH_CLIENT_ID= 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= diff --git a/apps/webui/tsconfig.json b/apps/webui/tsconfig.json index c133409..55e2a02 100644 --- a/apps/webui/tsconfig.json +++ b/apps/webui/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2017", + "target": "ES2022", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, diff --git a/docs/PHASE-TRACKING.md b/docs/PHASE-TRACKING.md index 5b72668..795da88 100644 --- a/docs/PHASE-TRACKING.md +++ b/docs/PHASE-TRACKING.md @@ -194,17 +194,40 @@ Dieses Dokument hält den aktuellen Implementierungsstand fest. Es wird bei jede - Manuell auf Test-Server bestätigt (User-Freigabe) - 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 -- Dashboard-Layout (Sidebar, Server-Switcher, Dark/Light) -- Settings-Framework mit Sticky-Save-Bar -- Shared Zod-API-Schemas; Guild-Settings- und Module-Toggle-API -- Dashboard-Audit + Access-Rules (Prisma) +- `apps/webui` als `@nexumi/webui` (Next.js 15 App Router, Tailwind 4, React 19), Scripts `dev/build/start/lint/typecheck/test/prisma:generate` +- `next.config.ts`: `output: 'standalone'`, `transpilePackages: ['@nexumi/shared']`, `outputFileTracingRoot` auf Monorepo-Root +- 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` +- Discord-OAuth2-Login (`src/lib/discord-oauth.ts`): Authorize-URL, Code-Exchange, `/users/@me`, `/users/@me/guilds` (mit kurzlebigem Redis-Cache) +- 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 -- 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).