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