Saltar para o conteúdo principal

Operações em Lote

Para turmas grandes — centenas ou milhares de formandos — a API disponibiliza endpoints e padrões de lote para minimizar o número de requisições e reduzir o tempo de processamento.

Eliminação em lote

A maioria dos recursos suporta eliminação em lote via DELETE /recurso/batch/destroy com um corpo contendo UUIDs:
curl -X DELETE https://api.dokstamp.eu/certificates/batch/destroy \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Tenant: {TENANT}" \
  -d '{ "uuids": ["uuid-1", "uuid-2", "uuid-3"] }'

Emissão de certificados em lote (padrão)

Não existe um endpoint único de “criar certificados em lote” — cada certificado requer o seu próprio ficheiro exclusivo. No entanto, é possível otimizar o processo com um pipeline eficiente:

1. Enviar todos os ficheiros numa única requisição

curl -X POST https://api.dokstamp.eu/files \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Accept: application/json" \
  -H "X-Tenant: {TENANT}" \
  -F "files[]=@diploma-1.pdf" \
  -F "files[]=@diploma-2.pdf" \
  -F "files[]=@diploma-3.pdf"
A resposta inclui um array de objetos de ficheiro. Mapeie cada ficheiro para um estudante pelo nome do ficheiro ou índice.

2. Emitir certificados de forma concorrente

Utilize requisições HTTP concorrentes (Promise.all em JavaScript, cURL paralelo, pool do Guzzle em PHP):
JavaScript
const issuances = students.map((student, index) => ({
  institution_uuid: INSTITUTION_UUID,
  course_uuid: COURSE_UUID,
  student_uuid: student.uuid,
  file_uuid: files[index].uuid,
  status: 'issued',
  issued_at: new Date().toISOString(),
}));

const results = await Promise.all(
  issuances.map(payload =>
    fetch('https://api.dokstamp.eu/certificates', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${TOKEN}`,
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'X-Tenant': TENANT,
      },
      body: JSON.stringify(payload),
    }).then(r => r.json())
  )
);

const verificationUrls = results.map(r => r.data.public_verification_url);
PHP (Guzzle pool)
use GuzzleHttp\Client;
use GuzzleHttp\Pool;
use GuzzleHttp\Psr7\Request;

$client = new Client(['base_uri' => 'https://api.dokstamp.eu']);
$headers = [
    'Authorization' => "Bearer $token",
    'Accept'        => 'application/json',
    'Content-Type'  => 'application/json',
    'X-Tenant'      => $tenant,
];

$requests = function () use ($students, $files, $headers) {
    foreach ($students as $i => $student) {
        $body = json_encode([
            'institution_uuid' => INSTITUTION_UUID,
            'course_uuid'      => COURSE_UUID,
            'student_uuid'     => $student['uuid'],
            'file_uuid'        => $files[$i]['uuid'],
            'status'           => 'issued',
            'issued_at'        => now()->toIso8601String(),
        ]);
        yield new Request('POST', 'certificates', $headers, $body);
    }
};

$pool = new Pool($client, $requests(), ['concurrency' => 10]);
$pool->promise()->wait();

Reenvio de requisições de assinatura em lote

Para fluxos de assinatura de documentos, reenvie e-mails de pedido de assinatura para múltiplos signatários de uma vez:
POST /documents/signatures/batch/resend
curl -X POST https://api.dokstamp.eu/documents/signatures/batch/resend \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Tenant: {TENANT}" \
  -d '{
    "document_ids": [101, 102, 103]
  }'

Assinatura institucional em lote

Assine múltiplos documentos de uma vez com o certificado digital institucional:
POST /documents/batch/sign/{cert_id}
curl -X POST "https://api.dokstamp.eu/documents/batch/sign/1" \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Tenant: {TENANT}" \
  -d '{
    "document_ids": [101, 102, 103],
    "pin": "123456"
  }'

Paginação para grandes conjuntos de resultados

Ao obter listas grandes (ex.: todos os estudantes para identificar certificados em falta), utilize paginação:
# Obter todas as matrículas concluídas em páginas de 200
PAGE=1
while true; do
  RESPONSE=$(curl -s "$API/enrollments?where[completion_status]=completed&per_page=200&page=$PAGE" \
    -H "Authorization: Bearer $TOKEN" \
    -H "Accept: application/json" \
    -H "X-Tenant: $TENANT")
  
  TOTAL_PAGES=$(echo $RESPONSE | jq -r '.meta.last_page')
  echo "A processar página $PAGE de $TOTAL_PAGES"
  
  # Processar itens...
  
  [ "$PAGE" -ge "$TOTAL_PAGES" ] && break
  PAGE=$((PAGE + 1))
done