diff --git a/docs/changelog/2026-09-26-gravacoes-sem-teto-4gb.md b/docs/changelog/2026-09-26-gravacoes-sem-teto-4gb.md new file mode 100644 index 00000000..5adf8481 --- /dev/null +++ b/docs/changelog/2026-09-26-gravacoes-sem-teto-4gb.md @@ -0,0 +1 @@ +**Gravações enviadas ao acervo sem o teto de 4 GB (2026-09-26):** o diálogo "Enviar gravação" recusava qualquer arquivo acima de 4 GiB (`RECORDING_MAX_BYTES`) — limite que plenárias longas encostam. O teto saiu do cliente, da rota e do stream: o corpo continua indo para o temp com backpressure, agora sem teto de produto (disco e multipart do S3 são o limite). Acima de 2 GiB a mídia deixa de passar pelo `fs.readFile` do Payload: o `recordingMedia` nasce de um placeholder de 0 byte e a mesma key é sobrescrita por upload multipart direto no S3 — padrão do C225-large, extraído para o dono `utilities/privateMedia/privateMediaUpload.ts` e agora compartilhado com o espelho de falas web (que mantém o próprio teto de 5 GiB via `maxBytes` do chamador; gravações passam `Infinity`). O nome original do arquivo sobrevive ao placeholder e o objeto é removido se a transação falhar, sem row fantasma. Sem migration e sem schema; unit (novo helper + limites do uploader) e int de gravações/falas web verdes. Operação: o `/tmp` do container precisa de headroom para o tamanho da gravação (upload + download do job de transcrição). diff --git a/src/app/(campaign)/campanha/(app)/comunicacao/acervo/gravacoes/enviar/route.ts b/src/app/(campaign)/campanha/(app)/comunicacao/acervo/gravacoes/enviar/route.ts index 4eb882f0..b9b7cd26 100644 --- a/src/app/(campaign)/campanha/(app)/comunicacao/acervo/gravacoes/enviar/route.ts +++ b/src/app/(campaign)/campanha/(app)/comunicacao/acervo/gravacoes/enviar/route.ts @@ -7,7 +7,6 @@ import { RECORDING_FILE_TYPE_MESSAGE, RECORDING_TITLE_REQUIRED_MESSAGE, recordingFileTypeAllowed, - recordingUploadTooLargeMessage, toRecordingViewModel, } from '@/lib/recording' import { @@ -49,7 +48,6 @@ const SAFE_MESSAGES = [ RECORDING_TITLE_REQUIRED_MESSAGE, RECORDING_FILE_NAME_MESSAGE, RECORDING_FILE_TYPE_MESSAGE, - recordingUploadTooLargeMessage, RECORDING_BODY_MISSING_MESSAGE, ] @@ -78,13 +76,6 @@ export const POST = async (request: Request): Promise= 0 - ? parsedLength - : null - try { const payload = await getPayload({ config }) const { id } = await receiveRecordingUpload({ @@ -92,7 +83,6 @@ export const POST = async (request: Request): Promise RECORDING_MAX_BYTES) { - setFileError(recordingTooLargeMessage(next.size)) } } @@ -285,7 +278,7 @@ export const RecordingUploadDialog = ({