Backend de départ pour le SaaS STUDIO FLYER AI / POSTER AI.
Cette première phase met en place une API Express.js modulaire avec TypeScript, Prisma, PostgreSQL, Clerk et Zod. Elle ne contient pas encore d'appel réel à Claude, ChatGPT, Gemini ou Nano Banana.
- Authentification Clerk : vérification des tokens de session et profil local
- Gestion utilisateur connecté
- CRUD projets protégés par propriétaire
- CRUD des mémoires métier :
M_SMSM_QT1M_QT2M_MDM_IDM_BAM_PROMPT1
- Métadonnées fichiers compatibles stockage cloud futur
- Base artistique avec lecture publique et mutations admin
- Validation Zod
- Erreurs JSON standardisées
- Seed admin optionnel
npm installCopier .env.example vers .env, puis renseigner au minimum :
PORT=5000
DATABASE_URL=postgresql://USER:PASSWORD@localhost:5432/studio_flyer_ai
APP_URL=http://localhost:3000
CLERK_SECRET_KEY=sk_...
CLERK_PUBLISHABLE_KEY=pk_...Générer le client Prisma :
npm run prisma:generateCréer les tables :
npm run prisma:migrateCréer ou mettre à jour un administrateur depuis les variables ADMIN_* :
npm run prisma:seedDéveloppement :
npm run devProduction :
npm run build
npm startGET /api/auth/me
GET /api/users/mePATCH /api/users/me
POST /api/projectsGET /api/projectsGET /api/projects/:projectIdPATCH /api/projects/:projectIdDELETE /api/projects/:projectId
POST /api/projects/:projectId/memoryGET /api/projects/:projectId/memoryGET /api/projects/:projectId/memory/:typePATCH /api/projects/:projectId/memory/:typeDELETE /api/projects/:projectId/memory/:type
POST /api/projects/:projectId/filesGET /api/projects/:projectId/filesDELETE /api/files/:fileId
Le module fichiers stocke uniquement les métadonnées dans cette phase :
{
"fileUrl": "https://cdn.example.com/logo.png",
"fileType": "image/png",
"originalName": "logo.png",
"usageType": "LOGO"
}POST /api/admin/artistic-resourcesGET /api/artistic-resourcesGET /api/artistic-resources/searchGET /api/artistic-resources/:resourceIdPATCH /api/admin/artistic-resources/:resourceIdDELETE /api/admin/artistic-resources/:resourceId
Succès :
{
"success": true,
"message": "",
"data": {}
}Erreur :
{
"success": false,
"message": "",
"errors": []
}