feat: introduce web dashboard with multi-bot management

- add Discord OAuth2 authentication
- allow users to register their bots via token
- implement dynamic bot start/stop system
- store bots in database (multi-tenant)
- replace single-bot env setup with scalable architecture
This commit is contained in:
Puechberty Arthur
2026-04-18 01:39:12 +02:00
parent 58376568c7
commit 3063796eb0
150 changed files with 6248 additions and 1387 deletions
+44 -96
View File
@@ -1,116 +1,64 @@
# AGENT.md - Guide du projet template_discordjs
# AGENT.md - Guide SaaS Multi-Tenant
Version: 2.0
Version: 3.0
But
---
Ce fichier decrit la structure actuelle du projet, les conventions d'architecture et le workflow recommande pour contribuer sans introduire de dette technique.
Decrire l'architecture cible du monorepo SaaS pour bot Discord multi-tenant.
Vue d'ensemble
--------------
- Stack: TypeScript + Discord.js 14.
- Build: esbuild + typecheck TypeScript strict.
- Localisation: `src/i18n/en.json`, `src/i18n/fr.json`, `src/i18n/es.json`.
- Base de donnees: PostgreSQL, stores injectes via lifecycle centralise.
- Stack backend: Node.js + TypeScript + Express + PostgreSQL + Redis + BullMQ.
- Bot runtime: Discord.js avec gestion dynamique multi-instance.
- Frontend: Next.js App Router.
- Structure: monorepo `apps/*` + `packages/*`.
Organisation des dossiers
-------------------------
- Racine:
- `package.json`, `tsconfig.json`, `Dockerfile`, `docker-compose.yml`.
- `src/app/`
- `bootstrap.ts`: wiring des dependances, init DB, handlers, shutdown.
- `container.ts`: contrats de services injectes.
- `src/commands/`
- Wrappers de commandes uniquement.
- Chaque fichier retourne une commande via `defineCommand(...)`.
- Aucune logique metier lourde dans cette couche.
- `src/modules/`
- `help/`: module help (service + commande).
- `presence/`: point d'entree module presence (services et contrats).
- `memberMessages/`: point d'entree module member messages (services et contrats).
- `src/features/`
- Implementation interne des modules (detail technique derriere `src/modules/*`).
- `src/core/`
- `commands/`: parser, registry, slash builder, usage.
- `execution/`: pipeline d'execution des commandes (dispatch local/worker, cooldown/rate-limit stores).
- `runtime/`: coordination multi-instance (leader election / startup locks).
- `logging/`: logger structure JSON (`pino`).
- `discord/`: helpers partages (resolveReplyMessage, session registry).
- `src/database/`
- `stores/`: implementations PostgreSQL concretes.
- `migrations/`: fichiers SQL versionnes appliques via `npm run migrate`.
- `dbLifecycle.ts`: init/shutdown centralise.
- `src/validators/`
- Validation et sanitation metier (presence, member messages).
- `src/types/`
- Types purs partages (pas de logique metier).
- `src/events/`
- Enregistrement des listeners Discord, relies aux services injectes.
- `src/handlers/`
- Entrees prefix/slash et adaptation du contexte d'execution.
- `src/utils/`
- Utilitaires generiques transverses.
- `apps/api/`
- OAuth2 Discord, JWT cookie, routes multi-tenant, validation token bot, publication jobs BullMQ.
- `apps/bot/`
- BotManager dynamique (`Map<botId, Client>`), worker de controle (`start/stop/restart`).
- `apps/web/`
- Dashboard utilisateur (login, liste bots, ajout bot, actions runtime).
- `packages/shared/`
- Types partages, constantes queue, helpers Redis namespacing, chiffrement token AES-GCM.
- `database/migrations/`
- SQL versionne (`schema_migrations`) avec schema multi-tenant.
Principes d'architecture
------------------------
- Commands UI only:
- Une commande ne fait que declarer `meta/args/examples` et deleguer `execute`.
- Modules own business logic:
- Toute logique metier testable va dans `src/modules/*` (les wrappers `src/commands/*` restent minces).
- Core is shared infra:
- Helpers communs Discord, execution pipeline, parser, registry.
- Execution pipeline is decoupled:
- Parsing reste dans `src/handlers/*`.
- Dispatch est route par `src/core/execution/dispatch.ts` (`local` ou `worker`).
- Execution metier passe par `CommandExecutor` avec stores abstraits (memory/Redis).
- Contexts are split for low coupling:
- `ExecutionContext` (core), `TransportContext` (Discord), `I18nContext` (localization).
- `CommandExecutionContext` conserve des alias legacy pour ne pas casser les commandes existantes.
- Validators isolate rules:
- Les regles de validation/sanitation ne vont pas dans `src/types`.
- Database via repository contracts:
- Les modules dependent d'interfaces, pas de singletons globaux.
- Bootstrap owns lifecycle:
- Init/shutdown DB et services centralises dans `src/app/bootstrap.ts`.
- Multi-tenant strict:
- toutes les requetes de lecture/ecriture passent par `tenant_id`.
- tables critiques liees a `tenant_id` et/ou `owner_user_id`.
- Pas de secret en clair:
- token bot chiffre en DB (`token_ciphertext`, `token_iv`, `token_tag`).
- Controle runtime decouple:
- API publie des jobs, bot manager consomme et execute.
- Separation responsabilites:
- API: auth + orchestration.
- Bot: runtime Discord.
- Web: UX dashboard.
Conventions de code
-------------------
- TypeScript strict obligatoire.
- Exports nommes preferes.
- Fichiers en lowerCamelCase.
- Commentaires courts uniquement pour clarifier un bloc non trivial.
- Eviter tout couplage direct d'une feature vers une autre sans passer par contrats explicites.
- TypeScript strict.
- Exports nommes.
- Erreurs API explicites et codes HTTP coherents.
- Logs sans fuite de secrets.
Procedure: ajouter une commande
--------------------------------
1. Creer un wrapper dans `src/commands/`.
2. Declarer la commande avec `defineCommand({ ... })`.
3. Deleguer `execute` vers un module `src/modules/...`.
4. Ajouter la commande dans `createCommandList` (`src/commands/index.ts`).
5. Ajouter les cles i18n dans `src/i18n/*.json`.
6. Ajouter les tests cibles (`tests/`) selon la logique introduite.
Procedure: ajouter une feature
------------------------------
1. Creer `src/modules/<feature>/`.
2. Definir les contrats repository dans la feature.
3. Implementer le service metier independant de Discord quand possible.
4. Ajouter/adapter le store PostgreSQL sous `src/database/stores/`.
5. Ajouter une migration SQL versionnee dans `database/migrations/`.
6. Cablage d'injection dans `src/app/bootstrap.ts`.
7. Ajouter tests unitaires et, si necessaire, integration.
Tests et verification
---------------------
- Verification minimale avant PR:
- `npm run migrate`
- `npm run typecheck`
- `npm test`
- En cas de refactor de structure:
- verifier README + AGENT.md + i18n + imports.
Workflow recommande
-------------------
1. Ajouter/adapter migration SQL dans `database/migrations`.
2. Adapter repositories API/Bot avec filtre tenant.
3. Ajouter endpoint API + validation zod.
4. Brancher action queue si runtime impacte.
5. Mettre a jour le dashboard web.
6. Valider `npm run typecheck` puis `docker compose up -d --build`.
Securite
--------
- Ne jamais committer de secrets.
- `.env*` (sauf `.env.example`) doit rester ignore.
- Eviter d'exposer des credentials dans logs/scripts de debug.
- Ne jamais committer `.env`.
- Garder `TOKEN_ENCRYPTION_KEY` hors depot.
- Appliquer `httpOnly` + `sameSite` sur cookie session.
- Eviter les logs de payloads sensibles (token, secrets).