---
title: Historico de campos personalizados
tags: análise BTB
---
# Serviço de histórico
A idéa é criar um serviço para persistr o histórico de todos os campos, unindo os campos standards e os personalizados.
Uma request quando chega no heimdal é gerado um id pra ela para podermos identifica-la em qualquer ponto, esse id é passada para as requests internas que fazemos tbm. Sendo assim podemos utilizar esse id para unir os dados de históricos dos serviços standards e do btb.
Basicamente cada serviço fica responsavel por fazer a diff de seus dados e enviar ao serviço de histórico passando o request id que gerou essas diffs, o serviço de histórico por sua vez une todas as diffs que chegarem para a mesma request id.
## Base de dados
``` sql
CREATE TABLE revision (
id uuid NOT NULL,
request_id uuid NOT NULL,
"date" timestamptz NOT NULL,
user_id uuid NOT NULL,
user_name varchar(255) NOT NULL,
system_version varchar(64) NOT NULL,
history_type varchar(20) NOT NULL,
origin varchar(20) NOT NULL,
"version" int4 NULL,
updated_at timestamptz NOT NULL,
created_at timestamptz NOT NULL,
external_id varchar(255) NULL,
PRIMARY KEY (id)
);
CREATE TABLE entity_state (
id uuid NOT NULL,
"version" int4 NULL,
external_id varchar NULL,
revision_id uuid NOT NULL,
previous_entity_state_id uuid NULL,
sequence_record_changing int4 NOT NULL,
service varchar(20) NOT NULL,
event_type varchar(20) NOT NULL,
entity varchar(100) NOT NULL,
record_id uuid NOT NULL,
record_text_identifier varchar(255) NOT NULL,
state jsonb NOT NULL,
parent_id uuid NULL,
parent_name varchar(100) NULL,
updated_at timestamptz NOT NULL,
created_at timestamptz NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (previous_entity_state_id) REFERENCES entity_state(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
FOREIGN KEY (revision_id) REFERENCES revision(id) ON UPDATE RESTRICT ON DELETE RESTRICT
);
```
## API
```mermaid
sequenceDiagram
participant Heimdall
participant Router
participant Customer
participant BTB
participant Historic
Heimdall->>Router: Adiciona request id
Router->>Customer: Chama serviço standard
Customer->>Customer: Recebe dados standards, gera o diff deles
Customer->>Historic: Envia mensagem para criar histórico com os campos standards
Historic->>Historic: Recebe e persiste os dados do histórico
Router->>BTB: Chama o btb
BTB->>BTB: Recebe dados personalizados, gera o diff deles
BTB->>Historic: Envia mensagem para atualizar histórico com os campos standards
Historic->>Historic: Recebe e atualiza os dados do histórico
```
### Post
*/histories*
```jsonql=
{
"revision": {
"requestId": "",
"date": "",
"userId": "",
"userName": "",
"systemVersion": "",
"historyType": "",
"origin": ""
},
"entityState": {
"externalId": "",
"revisionId": "",
"previousEntityStateId": "",
"sequenceRecordChanging": "",
"service": "",
"eventType": "",
"entity": "",
"recordId": "",
"recordTextIdentifier": "",
"state": "",
"parentId": "",
"parentName": "",
}
}
```
## Get
*/histories/{service}/{entity}/{recordId}*