API externe : envoi d'images avec la clé API

Avec la clé API, aucune route ne permettait d'envoyer une image : /publish
n'acceptait qu'une URL publique à télécharger, et le parseur JSON global
plafonnait toute requête à 100 Ko, ce qui interdisait le base64.

- POST /api/v1/media : envoi d'une image (multipart « file » ou JSON
  « imageData » en base64), rangée dans la médiathèque ; renvoie un id.
- /publish et PATCH /posts/:id acceptent en plus mediaId, imageData ou un
  fichier multipart « image » (une seule source par requête).
- Requêtes JSON sous /api/v1 limitées à 15 Mo ; images à 10 Mo, format
  vérifié d'après le contenu (JPEG, PNG, WebP, GIF).
- PATCH résout l'image avant toute modification, pour ne pas laisser un
  post à moitié modifié si l'image est refusée.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NqYZn5796yWGo9Rq81an9M
This commit is contained in:
Claude committed 2026-10-04 19:20:42 +00:00
1 parent 7806f8bdc8
commit ff0b4d3f20
6 files changed
+597 -84

No files matched your search

+9 -5
View File
@@ -1,4 +1,5 @@
import express, { type Request, Response, NextFunction } from "express";
import type { IncomingMessage } from "http";
import path from "path";
import fs from "fs";
import session from "express-session";
@@ -87,11 +88,14 @@ declare module 'http' {
rawBody: unknown
}
}
app.use(express.json({
verify: (req, _res, buf) => {
req.rawBody = buf;
}
}));
const keepRawBody = (req: IncomingMessage, _res: unknown, buf: Buffer) => {
req.rawBody = buf;
};
// L'API externe accepte des images en base64 (imageData) : 10 MB d'image font
// ~13,4 MB une fois encodés. Ce parseur passe avant le parseur global (100 KB),
// qui ignore ensuite un corps déjà lu.
app.use('/api/v1', express.json({ limit: '15mb', verify: keepRawBody }));
app.use(express.json({ verify: keepRawBody }));
app.use(express.urlencoded({ extended: false }));
// Validation renforcée du SESSION_SECRET