---
# System prepended metadata

title: Cadastro de requisição
tags: [análise BTB]

---

---
title: Cadastro de requisição
tags: análise BTB
---

# Cadastro de requisição

## Atualizar versão da API do remote-service

Para realizar a atualização da versão do remote-service algumas alterações serão nessessárias no front-end ao inserir e consultar as requisições.

Na inserção de requisições as seguintes alterações devem ser aplicadas:

- A propriedade `responseFormat` não existe mais, ela foi substituida por `Content-Type` adicionado no `header`.
- Alem disso o valor `REST_REQUEST` da propriedade `type` foi depreciado, o valor a ser considerado é `HTTP`.

Ex:

Versão 2 (Versão antiga)
```jsonld=
{
    "name": "teste",
    "type": "REST_REQUEST", // Valor REST_REQUEST foi depreciado
    "url": "https://google.com",
    "method": "GET",
    "responseFormat": "JSON", // Propriedade removida
    "credential": {
        "id": "cfbf3872-f025-416f-a527-e66a0c5fd69f",
        "name": "CM"
    }
}
```

Versão 3 (Versão atual)
```jsonld=
{
    "name": "teste",
    "type": "HTTP", // Novo valor a ser considerado
    "url": "https://google.com",
    "method": "GET",
    // Novo formato para representar a propriedade `responseFormat`
    "bodyMediaType": "application/json",
    "headers": [],
    "credential": {
        "id": "cfbf3872-f025-416f-a527-e66a0c5fd69f",
        "name": "CM"
    }
}
```

Na listagem de requisições deve ser aplicado um filtro para retornar somente as requisições onde o `method` for `GET`, pois hoje o serviço de vendas insere requisições com o método `POST`.

## 1 DER

![](https://i.imgur.com/t212Is0.png)

- Adicionar coluna `internal` na tabela `request`
    ```sql=
    ALTER TABLE request
        ADD COLUMN internal BOOLEAN NOT NULL DEFAULT TRUE;
    ```
    - Migrar todas as requests diferentes de `GET` para `internal`
        ```sql=
        UPDATE request SET internal = FALSE WHERE method = 'GET';
        ```
- Adicionar coluna `internal` na tabela `credential`
    ```sql=
    ALTER TABLE credential
        ADD COLUMN internal BOOLEAN NOT NULL DEFAULT TRUE;
    ```
    - Todas as credenciais vinculadas a uma requisição interna devem ser internas tambem
        ```sql=
        UPDATE credential SET internal = FALSE
            WHERE id IN (SELECT credential_id FROM request
                            WHERE internal = FALSE);
        ```
- Criar tabela `parameters`
    ```sql=
    CREATE TABLE parameter (
        id UUID NOT NULL,
        request_id UUID NOT NULL,
        parent_parameter_id UUID,
        name VARCHAR(255) NOT NULL,
        type VARCHAR(255) NOT NULL,
        constraint pk_parameter primary key (id)
    );
    
    ALTER TABLE parameter ADD CONSTRAINT fk_parameter_request_id
        FOREIGN KEY (request_id) REFERENCES request (id)
            ON DELETE RESTRICT ON UPDATE RESTRICT;
    
    ALTER TABLE parameter ADD CONSTRAINT fk_parameter_parent_parameter_id
        FOREIGN KEY (parent_parameter_id) REFERENCES parameter (id)
            ON DELETE RESTRICT ON UPDATE RESTRICT;
    ```

## 2 API

### 2.1 POST/PUT de request:

_/requests/{id}_
Os campos `type` não será mais informado e o campo `bodyMidiaType` passa a ser representado pelo header `Content-Type`.

```jsonld=
{
    "name": "Inserir empresa",
    "credential": {
        "id": "cfbf3872-f025-416f-a527-e66a0c5fd69f",
        "name": "CM"
    },
    "method": "POST",
    "url": "http://dev.btb.wssim.com.br/api/${versao}/branch/branchs/${id}",
    "headers": [{
        // header que substitui a propriedade bodyMediaType
        "key": "Content-Type",
        "value": "application/json"
    },{
        "key": "x-customized-header",
        "value": ""
    }],
    "internal": false,
    "bodyTemplate": "{
        \"razaoSocial\": \"${razaoSocial}\",\n
        \"nomeFantasia\": \"${nomeFantasia}\",\n
        \"data\": \"${formatDate(data, 'dd/MM/YYYY')}\"\n
        \"endereco\": {\n
            \"rua\": \"${rua}\",\n
            \"numero\": ${numero},\n
            \"bairro\": \"${bairro}\",\n
        },\n
        \"grupos\": ${forEach(grupos, {\"nome\": \"${this}\"})},\n
        \"funcionarios\": ${forEach(funcionarios, {\n
            \"id\": \"${id}\",\n
            \"nome\": \"${nome}\",\n
            \"empresa\": \"${super.nomeFantasia}\",\n
            \"subordinados\": ${forEach(subordinados, {\n
                \"id\": \"${id}\",\n
                \"nome\": \"${nome}\",\n
                \"chefe\": \"${super.nome}\",\n
                \"empresa\": \"${root.nomeFantasia}\"\n
            })}\n
        })}\n
    }"
}
```

O campo `internal` só pode ser `true` quando for uma requisição interna.
Quando o campo `internal` for `true` apenas requisições internas podem consultar, editar e deletar.

Os parametros devem ser extraidos do template ao inserir ou alterar uma request.

### 2.2 GET de request:

_/requests/{id}_

```jsonld=
{
    "name": "Inserir empresa",
    "credential": {
        "id": "cfbf3872-f025-416f-a527-e66a0c5fd69f",
        "name": "CM"
    },
    "method": "POST",
    "url": "http://dev.btb.wssim.com.br/api/${versao}/branch/branchs/${id}",
    "headers": [{
        "key": "Content-Type",
        "value": "application/json"
    },{
        "key": "x-customized-header",
        "value": ""
    }],
    "internal": false,
    "bodyTemplate": "{
        \"razaoSocial\": \"${razaoSocial}\",\n
        \"nomeFantasia\": \"${nomeFantasia}\",\n
        \"data\": \"${formatDate(data, 'dd/MM/YYYY')}\"\n
        \"endereco\": {\n
            \"rua\": \"${rua}\",\n
            \"numero\": ${numero},\n
            \"bairro\": \"${bairro}\",\n
        },\n
        \"grupos\": ${forEach(grupos, {\"nome\": \"${this}\"})},\n
        \"funcionarios\": ${forEach(funcionarios, {\n
            \"id\": \"${id}\",\n
            \"nome\": \"${nome}\",\n
            \"empresa\": \"${super.nomeFantasia}\",\n
            \"subordinados\": ${forEach(subordinados, {\n
                \"id\": \"${id}\",\n
                \"nome\": \"${nome}\",\n
                \"chefe\": \"${super.nome}\",\n
                \"empresa\": \"${root.nomeFantasia}\"\n
            })}\n
        })}\n
    }",
    "urlParams": ["versao", "id"],
    "headersParams": ["x-customized-header"],
    "bodyParams": [
        {"name": "razaoSocial"},
        {"name": "nomeFantasia"},
        {"name": "data"},
        {"name": "rua"},
        {"name": "numero"},
        {"name": "bairro"},
        {"name": "grupos"},
        {
            "name": "funcionarios",
            "children": [
                {"name": "id"},
                {"name": "nome"},
                {"name": "subordinados",
                    "children": [
                        {"name": "id"},
                        {"name": "nome"}
                ]},
        ]}
    ]
}
```

### 2.3 DELETE de request

Não será alterado a deleção de request, ou seja, será sempre permitido realizar a deleção.

### 2.4 Execução da request

_/requests/{id}/execute_
Além da propriedade `templateParameters`, será adicionado `uriParameters` `headerParameters`.

Essas propriedades serão um objeto contendo como propriedade as chaves a serem substituidas.

```jsonld=
{
    "uriParameters": {
        "versao": "v3",
        "id": "123"
    },
    "headerParameters": {
        "x-customized-header": "btb"
    },
    "templateParameters": {
        "razaoSocial": "Wealthsystems",
        "nomeFantasia": "WS",
        "data": "2020-03-01",
        "rua": "R. Pres. Bernardes",
        "numero": 2009,
        "bairro": "Centro",
        "grupos": ["WS LTDA"],
        "funcionarios": [{
            "id": "456",
            "nome": "Evaristo",
            "subordinados": [{
                "id": "789",
                "nome": "Augusto",
            },{
                "id": "987",
                "nome": "Sanderson",
            }]
        },{
            "id": "654",
            "nome": "Ana Fredrich",
            "subordinados": [{
                "id": "357",
                "nome": "Chico",
            },{
                "id": "159",
                "nome": "Sol",
            }]
        }]
    }
}
```

### 2.4.1 Template executor

Atualmente para a execução do template é utilizado o [Apache FreeMarker](https://freemarker.apache.org), mas essa ferramenta acaba sendo complexa e dificil de utilizar, com uma sintaxe de template complexa.

Por isso iremos utilizar apenas um interpolador de texto, simplificando a sintaxe e utilização da ferramenta.

Variaveis de sistema:

| Variavel  | Descrição                          |
| --------- | ---------------------------------- |
| `$root`   | Retorna a raiz do JSON             |
| `$parent` | Retorna o pai imediato do nó atual |
| `$this`   | Retorna o objeto atual             |

Funções:

| Função     | Descrição                                           |
| ---------- | --------------------------------------------------- |
| formatDate | Formata data conforme parametro                     |
| forEach    | Intera sobre uma lista para tranformar os elementos |


```jsonld=
{
    "razaoSocial": "${razaoSocial}",
    "nomeFantasia": "${nomeFantasia}",
    "data": "${formatDate(data, 'dd/MM/YYYY')}",
    "endereco": {
        "rua": "${rua}",
        "numero": ${numero},
        "bairro": "${bairro}"
    },
    "grupos": ${forEach(grupos, {"nome": "${$this}"})},
    "funcionarios": ${forEach(funcionarios, {
        "id": "${id}",
        "nome": "${nome}",
        "empresa": "${$parent.nomeFantasia}",
        "subordinados": ${forEach(subordinados, {
            "id": "${id}",
            "nome": "${nome}",
            "chefe": "${$parent.nome}",
            "empresa": "${$root.nomeFantasia}"
        })}
    })}
}
```

### 2.4.2 Resultado da execução

Ao realizar a execução da request deve ser substitudo todos o parametros dinâmicos da URL e dos headers. Ex:

```
curl --location --request POST 'http://dev.btb.wssim.com.br/api/v3/cloud-manager/users' \
--header 'Authorization: Bearer 12345' \
--header 'Content-Type: application/json' \
--header 'x-customized-header: btb' \
--data-raw '{
    "razaoSocial": "Wealthsystems",
    "nomeFantasia": "WS",
    "data": "01/03/2020",
    "endereco": {
        rua": "R. Pres. Bernardes",
        "numero": 2009,
        "bairro": "Centro"
    },
    "grupos": [{"nome": "WS LTDA"}],
    "funcionarios": [{
        "id": "456",
        "nome": "Evaristo",
        "empresa": "WS",
        "subordinados": [{
            "id": "789",
            "nome": "Augusto",
            "chefe": "Evaristo",
            "empresa": "WS"
        },{
            "id": "987",
            "nome": "Sanderson",
            "chefe": "Evaristo",
            "empresa": "WS"
        }]
    },{
        "id": "654",
        "nome": "Ana Fredrich",
        "empresa": "WS",
        "subordinados": [{
            "id": "357",
            "nome": "Chico",
            "chefe": "Ana Fredrich",
            "empresa": "WS"
        },{
            "id": "159",
            "nome": "Sol",
            "chefe": "Ana Fredrich",
            "empresa": "WS"
        }]
    }]
}'
```

## 3 Telas

### 3.1 Cadastro
Headers
![](https://i.imgur.com/hjGoR1X.png)

Ao clicar em adicionar deve ser aberto uma modal para inserção de header.

Body
![](https://i.imgur.com/ndHvYiq.png)

### 3.2 Listagem

Adicinar a coluna `method` na listagem

![](https://i.imgur.com/EfUeDSQ.png)