Skip to main content

POST Completar Upload Direto

Finaliza o upload direto: completa as sessões multipart pendentes no R2, registra os arquivos e os associa à consulta. Também enfileira cada arquivo para processamento OCR assíncrono.

Autenticação necessária

Esta rota requer o header Authorization: Bearer {accessToken}

Revalidação da key

A key de cada arquivo é recalculada no servidor (path/sha256(fileName)) e comparada com a informada — isso impede registrar objetos fora do escopo da consulta/paciente/exame declarados. Se não bater, retorna 400.


Endpoint

POST https://api-dev.imagemais.com.br/api/consultations/direct-upload/complete

Corpo da Requisição

CampoTipoObrigatórioDescrição
patientIdnumberMesmo valor enviado em Iniciar Upload Direto
examTypestringMesmo valor enviado no initiate
consultationIdnumberID da consulta vinculada
filesarray1 a 10 arquivos
files[].keystringkey retornada pelo initiate
files[].fileNamestringfileName (uuid + extensão) retornado pelo initiate
files[].originalNamestringNome original do arquivo
files[].uploadIdstringPresente apenas em uploads multipart
files[].partsarrayObrigatório se uploadId for enviado — partes com partNumber e etag
files[].parts[].partNumbernumber✅*Número da parte (dentro de parts)
files[].parts[].etagstring✅*ETag retornado pelo PUT de cada parte

Requisição

Upload single:

curl -X 'POST' \
'https://api-dev.imagemais.com.br/api/consultations/direct-upload/complete' \
-H 'accept: application/json' \
-H 'Authorization: Bearer {accessToken}' \
-H 'Content-Type: application/json' \
-d '{
"patientId": 9,
"examType": "Raio-X",
"consultationId": 17,
"files": [
{
"key": "consultation/9/17/raio-x/7f8ea8ab9c3767608d05671d0ae2e1c367d34164572bfe159b5bbfe90c518bc8",
"fileName": "bd7495aa-e483-4c88-8ce8-378671f77f53.pdf",
"originalName": "exame.pdf"
}
]
}'

Upload multipart (mesmo corpo, acrescentando uploadId e parts):

{
"patientId": 9,
"examType": "Raio-X",
"consultationId": 17,
"files": [
{
"key": "consultation/9/17/raio-x/7fc828818eed96c3b3c7a94c8118a3e7b95156b5425fddc91e2a854c11631ad8",
"fileName": "29f685f3-c12f-41f3-ab87-ec062e14582f.pdf",
"originalName": "exame-grande.pdf",
"uploadId": "AEI2gpj0SABougXtRKFai2E2lCdp3hfiLrcjmemx5KhFwoY2wpUp...",
"parts": [
{ "partNumber": 1, "etag": "\"9bb58f26192e4ba00f01e2e7b136bbd8\"" },
{ "partNumber": 2, "etag": "\"a1b2c3d4e5f60718293a4b5c6d7e8f90\"" }
]
}
]
}

Respostas

201 Criado

Retorna um array com os arquivos registrados (mesmo formato de Upload de Arquivos de Consulta).

[
{
"id": 12,
"url": "https://storagedev.imagemaislaboratorio.com.br/consultation/9/17/raio-x/7f8ea8ab9c...",
"fileType": "pdf",
"name": "Raio-X - exame.pdf",
"createdAt": "2026-07-18T15:00:04.256Z",
"updatedAt": "2026-07-18T15:00:04.256Z",
"deletedAt": null,
"accountId": null
}
]

400 Key inválida

Retornado quando a key informada não corresponde a {patientId}/{consultationId}/{examType} combinados com o hash de fileName.

{
"message": "Key inválida para o arquivo: exame.pdf",
"error": "Bad Request",
"statusCode": 400
}

400 Partes ausentes

Retornado quando uploadId é enviado sem parts (upload multipart incompleto).

{
"message": "Partes ausentes para o arquivo: exame-grande.pdf",
"error": "Bad Request",
"statusCode": 400
}

404 Consulta não encontrada

{
"message": "Consulta não encontrada",
"error": "Not Found",
"statusCode": 404
}