API REST
POST /v1/drives/{sg}/nodes
Sobe um arquivo
/v1/drives/{sg}/nodes Cifra e sobe file no security group sg, opcionalmente dentro da pasta parent_id e ligado a exam_id; PUT único ou multipart é escolhido pelo SDK a partir do tamanho. O corpo multipart inteiro é bufferizado (SpooledTemporaryFile do python-multipart, 1 MiB em RAM antes de derramar em disco) antes deste handler sequer rodar, então é o tamanho da requisição que limita a memória, não a lógica deste endpoint.
Parâmetros de caminho #
-
sgstring obrigatórioO security group (o drive).
Respostas #
-
201 Successful Response
-
node_idstring obrigatório -
workspace_idstring obrigatório -
security_group_idstring obrigatório -
kindenum("file" | "folder") -
statusenum("pending" | "ready" | "failed") obrigatório -
exam_idobject -
parent_idobject -
modeobject -
media_kindobject -
declared_sizeobject -
sizeobject -
mime_typeobject -
encrypted_nameobject obrigatórioO formato `{salt, nonce, ciphertext}` (tudo b64url) que atravessa a rede. É o único formato de envelope do protocolo — um `HybridSeal` (§6) reusa os mesmos três nomes de campo mesmo com o `salt` carregando um encapsulamento KEM em vez de um salt de HKDF, então o JSON de ambos é idêntico para quem não sabe da diferença.
-
encrypted_keysobject obrigatório -
storage_pathobject -
optimized_variantsobject[] -
processing_statusobject -
processing_errorobject -
total_sizeobject -
created_bystring obrigatório -
created_atstring obrigatório -
completed_atobject -
is_deletedboolean
-
-
400 O cofre recusou a requisição como inválida.
-
errorobject obrigatórioO corpo de toda resposta não-2xx: o que deu errado, para um programa e para uma pessoa.
-
-
401 Sem certificado de cliente, ou a sessão do SDK foi recusada ou expirou (`session_expired`).
-
errorobject obrigatórioO corpo de toda resposta não-2xx: o que deu errado, para um programa e para uma pessoa.
-
-
402 O workspace não tem crédito para isto.
-
errorobject obrigatórioO corpo de toda resposta não-2xx: o que deu errado, para um programa e para uma pessoa.
-
-
403 CN não permitido, permissão negada, ou sem chave para o security group do dado (`group_key_unavailable`).
-
errorobject obrigatórioO corpo de toda resposta não-2xx: o que deu errado, para um programa e para uma pessoa.
-
-
404 Não encontrado — também um nó lido sob um grupo ao qual não pertence.
-
errorobject obrigatórioO corpo de toda resposta não-2xx: o que deu errado, para um programa e para uma pessoa.
-
-
409 Uma versão pendente ou mais nova, um replay, ou um upload que não chegou ao armazenamento.
-
errorobject obrigatórioO corpo de toda resposta não-2xx: o que deu errado, para um programa e para uma pessoa.
-
-
422 O corpo ou a query falhou na validação (`invalid_request`).
-
errorobject obrigatórioO corpo de toda resposta não-2xx: o que deu errado, para um programa e para uma pessoa.
-
-
429 Limite de taxa, depois de o backoff do SDK desistir.
-
errorobject obrigatórioO corpo de toda resposta não-2xx: o que deu errado, para um programa e para uma pessoa.
-
-
500 Um envelope não abriu (`crypto_error`, sem detalhe de propósito).
-
errorobject obrigatórioO corpo de toda resposta não-2xx: o que deu errado, para um programa e para uma pessoa.
-
-
502 O cofre falhou, ou respondeu fora do protocolo (`protocol_error`).
-
errorobject obrigatórioO corpo de toda resposta não-2xx: o que deu errado, para um programa e para uma pessoa.
-
curl --cert client.crt --key client.key \
-X POST "https://api.imgexam.com/v1/drives/<sg>/nodes" \
-H "Content-Type: application/json"import httpx
response = httpx.post(
"https://api.imgexam.com/v1/drives/<sg>/nodes",
cert=("client.crt", "client.key"),
)
response.raise_for_status()
print(response.json()){
"node_id": "string",
"workspace_id": "string",
"security_group_id": "string",
"kind": "file",
"status": "pending",
"exam_id": {},
"parent_id": {},
"mode": {},
"media_kind": {},
"declared_size": {},
"size": {},
"mime_type": {},
"encrypted_name": {
"salt": "string",
"nonce": "string",
"ciphertext": "string"
},
"encrypted_keys": {},
"storage_path": {},
"optimized_variants": [
{
"kind": "string",
"storage_bucket": "string",
"storage_path": "string",
"storage_size": 0,
"storage_mime_type": "string",
"created_at": "string"
}
],
"processing_status": {},
"processing_error": {},
"total_size": {},
"created_by": "string",
"created_at": "string",
"completed_at": {},
"is_deleted": false
}{
"error": {
"code": "string",
"message": "string",
"trace_id": {}
}
}{
"error": {
"code": "string",
"message": "string",
"trace_id": {}
}
}{
"error": {
"code": "string",
"message": "string",
"trace_id": {}
}
}{
"error": {
"code": "string",
"message": "string",
"trace_id": {}
}
}{
"error": {
"code": "string",
"message": "string",
"trace_id": {}
}
}{
"error": {
"code": "string",
"message": "string",
"trace_id": {}
}
}{
"error": {
"code": "string",
"message": "string",
"trace_id": {}
}
}{
"error": {
"code": "string",
"message": "string",
"trace_id": {}
}
}{
"error": {
"code": "string",
"message": "string",
"trace_id": {}
}
}{
"error": {
"code": "string",
"message": "string",
"trace_id": {}
}
}