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

- 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

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

### 3.2 Listagem
Adicinar a coluna `method` na listagem
