---
# System prepended metadata

title: Historico de campos personalizados
tags: [análise BTB]

---

---
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}*



