/api/editor/upload============================================================
============================================================ POST /api/editor/upload — RichEditor 이미지/파일 업로드 ============================================================ 사용 시나리오: - 이슈/페이지/코멘트 작성 중 에디터에 이미지 붙여넣기/드래그/버튼 업로드 - 대상 엔티티가 아직 없을 수 있음 (이슈 등록 *전*) — 그래서 attachable 가 필요한 일반 /api/attachments 와 분리한 별도 라우트 동작: 1. requireUser() / requireProjectMember() 2. multipart form-data 의 첫 파일 추출 (max 25MB, image/* 또는 일반 첨부) 3. MinIO 에 PUT (서버 → MinIO. 브라우저 presigned 우회 안 함 — 단순성) 4. { url } 반환 — url 은 /api/files/<objectKey> 보안: - 최대 25MB - PNG/JPEG/GIF/WebP 래스터 이미지만 허용(SVG/HTML/JS 금지) - 프로젝트 멤버만 - objectKey 는 projectId prefix → /api/files 에서 권한 검증 가능 응답: { url, name, mimeType, sizeBytes, objectKey } 참고: /api/attachments 와 달리 DB attachments 행을 *만들지 않음*. 에디터가 본문에 <img src="/api/files/..."> 로 넣고, 이슈 저장 시 description HTML 에 포함되어 결과적으로 영구 보관. 추후 GC 가 필요하면 description 파싱 → objectKey 추출 → 미참조 객체 삭제. ============================================================
Responses
curl -X POST https://sit.in-bridge.com/api/editor/upload \
-H "Authorization: Bearer $TOKEN"const res = await fetch("https://sit.in-bridge.com/api/editor/upload", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();