API REST

POST /v1/drives/{sg}/nodes

Sobe um arquivo

POST /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 #

  • sg string obrigatório

    O security group (o drive).

Respostas #

  • 201 Successful Response

    • node_id string obrigatório
    • workspace_id string obrigatório
    • security_group_id string obrigatório
    • kind enum("file" | "folder")
    • status enum("pending" | "ready" | "failed") obrigatório
    • exam_id object
    • parent_id object
    • mode object
    • media_kind object
    • declared_size object
    • size object
    • mime_type object
    • encrypted_name object obrigatório

      O 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_keys object obrigatório
    • storage_path object
    • optimized_variants object[]
    • processing_status object
    • processing_error object
    • total_size object
    • created_by string obrigatório
    • created_at string obrigatório
    • completed_at object
    • is_deleted boolean
  • 400 O cofre recusou a requisição como inválida.

    • error object obrigatório

      O 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`).

    • error object obrigatório

      O 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.

    • error object obrigatório

      O 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`).

    • error object obrigatório

      O 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.

    • error object obrigatório

      O 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.

    • error object obrigatório

      O 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`).

    • error object obrigatório

      O 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.

    • error object obrigatório

      O 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).

    • error object obrigatório

      O 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`).

    • error object obrigatório

      O 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"
{
  "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
}