Envio e recepção de comandos
Envio e recepção de comandos
O Templates implementa o Commander Pattern. Todas as operações suportadas pelo serviço são executadas mediante o envio de comandos. Um comando representa a intenção de executar uma operação que altera o estado da aplicação.
Envio de updates
A criação ou atualização de um registro é efetuada através do envio de um comando de update. Um comando de update possui as seguintes informações:
- id: Identificador único do comando (UUID v4), utilizado para consultar o resultado de seu processamento.
- action: Tipo do comando enviado (UPDATE).
- data: Dados do comando.
O campo data para o comando de update possui as seguintes informações:
- template: O template ao qual o comando se refere.
- aggregate: O agregado que sofreu a alteração no sistema, definido na configuração do resource.
- id: O ID do registro enviado.
- user: O usuário que atualizou o registro dentro do sistema.
- data: A representação completa do registro atualizado, no formato JSON, seguindo o schema do template.
Abaixo, um exemplo de requisição de envio de comando de update:
POST /api/v2/commands HTTP/1.1 <br/>
Host: https://plataforma-cadastro-unico.betha.cloud
Authorization: Bearer <TOKEN>
User-Access: <USER_ACCESS>
Content-Type: application/json
{
"id": "ac157642-de39-11e9-8a34-2a2ae2daaa12",
"data": {
"template": "pessoas",
"aggregate": "funcionario",
"id": "ac1578ea-de39-11e9-8a34-2a2ae2dbaa11",
"user": "meu.usuario",
"data": {
"nome": "João da Silva"
}
},
"action": "UPDATE"
}
É possível realizar a consulta da situação de um comando enviado, utilizando a seguinte requisição:
GET /api/v2/commands/<ID DO COMANDO> HTTP/1.1
Host: https://plataforma-cadastro-unico.betha.cloud
Authorization: Bearer <TOKEN>
Content-Type: application/json
Recepção de comandos
A recepção de comandos ocorre por meio de webhooks, que devem ser configurados via resource.
Conteúdo do webhook
O evento que será recebido no endereço configurado possui a seguinte estrutura:
- changesetId: Identificador da pendência cadastral que gerou a alteração.
- metadata: Metadados do evento.
- templateRecord: Dados do template.
- template: Template ao qual o evento se refere.
- recordId: O ID do registro onde as alterações devem ser aplicadas.
- database: Database do registro.
- user: Usuário que efetuou a modificação no sistema de origem.
- resource: Dados do resource.
- system: O sistema de destino que deve processar o evento.
- aggregate: A identificação do agregado que sofreu a alteração no sistema, definido na configuração do resource.
- templateRecord: Dados do template.
- data: A representação completa do registro no serviço de Templates atualmente.
- diff: As operações que devem ser aplicadas sobre o registro no sistema, no formato JSON Patch.
O evento recebido também dispõe de um cabeçalho (x-betha-signature) contendo a assinatura da requisição. Essa assinatura utiliza o padrão JWT com o algoritmo HMAC SHA-256. É utilizado como chave o secret token configurado no cadastro do resource. Com essa assinatura, é possível garantir que o comando recebido é proveniente de uma fonte segura, dado que somente o dono do resource e o Cadastro Único conhecem este token. O tamanho mínimo para o secret token é de 32 caracteres.
Retorno do processamento
O retorno do processamento do comando precisa ser um status code HTTP 200, indicando que o registro foi processado com sucesso. O retorno de qualquer outro status code marcará o webhook como falha, ou seja, a situação do webhook será igual a ERROR. O motivo de uma falha no envio de um webhook pode ser observado no atributo processMessage.
Ordem de processamento
Para garantir que a situação de um cadastro reflita o mesmo estado entre todos os sistemas, é fundamental que os comandos sejam processados em ordem. Sendo assim, os webhooks são enviados respeitando a ordem cronológica das alterações efetuadas nos sistemas. Caso um webhooks_seja marcado como falha, o envio de novos _webhooks para o registro em questão é interrompido até que o motivo da falha seja resolvido. Uma tentativa de envio dessas falhas é efetuada cada vez que uma nova atualização é recebida para o registro.
Apesar da garantia de ordem, não é garantida a entrega única do evento. Isso significa que um mesmo webhook pode ser enviado mais de uma vez. Sendo assim, é importante que o processamento seja idempotente, ou seja, possa ser executado mais de uma vez. Uma forma de identificar um comando já processado é utilizando o identificador changesetId.
Listagem de webhooks
A requisição abaixo lista todos os eventos de webhooks existentes para o sistema da credencial:
GET /api/v2/webhook HTTP/1.1
Host: https://plataforma-cadastro-unico.betha.cloud
Authorization: Bearer <TOKEN>
Content-Type: application/json
Reenvio de webhooks
Uma tentativa de envio dos webhooks marcados como falha é efetuada cada vez que uma nova atualização é recebida para o registro em questão. Além disso, é possível disparar uma nova tentativa de envio manualmente, através da API de gerenciamento.
A requisição abaixo demonstra como solicitar o reenvio de um webhooks com falha:
PUT /api/v2/webhook/<ID DO WEBHOOK>/retry HTTP/1.1
Host: https://plataforma-cadastro-unico.betha.cloud
Authorization: Bearer <TOKEN>
Content-Type: application/json