01. DADOS GERAIS
| Produto: | TOTVS Agro API Hub |
|---|---|
| Linha de Produto: | Linha PIMS |
| Segmento: | Agroindústria |
| Módulo: | Framework |
| Função: | Todas |
| País: | Brasil |
| Ticket: | |
| Requisito/Story/Issue (informe o requisito relacionado) : | DAGROFRAME-4860 |
02. SITUAÇÃO/REQUISITO
Adequar o sistema para suportar múltiplas bases de dados externas, permitindo que os serviços da API trabalhem com diferentes produtos (ex: Bioenergia, Indústria-MI, Indústria-PI) de forma dinâmica, conforme o contexto da requisição.
E também adaptar o instalador .bat do API-Hub para tratar múltiplas bases.
03. SOLUÇÃO
- Alteração do application.yml para utilizar a propriedade ta-api-hub.products, possibilitando configuração de múltiplos produtos e seus respectivos datasources:
Como era/ficou:
Propriedade ta-api-hub:(Antes) ta-api-hub: credentials: client-id: client-secret: product: name: default-instance: default-company-ind: datasource: driver-class-name: url: username: password: test-connection: (Depois) ta-api-hub: default-instance: default-company: products: bioenergia: enabled: name: datasource: driver-class-name: url: username: password: test-connection: industria-mi: enabled: name: datasource: driver-class-name: url: username: password: test-connection: industria-pi: enabled: name: datasource: driver-class-name: url: username: password: test-connection:- As propriedades default-instance e default-company pertencem ao escopo de instância do produto ta-api-hub;
- É obrigatório preencher pelo menos as propriedades do produto Bioenergia.
- Criação das classes ExternalProductContext, ProductDataSourceConfig, ExternalProductFilter e da anotação ExternalProductAware para controle dinâmico do contexto de produto externo por requisição;
- Modificação da DataSourceUtil para gerenciar múltiplos datasources, templates e named templates conforme o produto ativo;
- Foi necessário revisar e atualizar todos os pontos do código que utilizavam @Value para injeção de propriedades, especialmente nas classes BO, devido à nova estrutura do application.yml. Isso garantiu que as configurações fossem corretamente lidas conforme o novo padrão de organização do arquivo de propriedades;
- Adição da chave de cabeçalho X-Product para utilizar os endpoints dos controladores anotados com @ExternalProductAware (atualmente, MigrationsController e FunctionsController, ou seja, /admin/migrations e /functions). Nesses casos, o cabeçalho é obrigatório para identificar explicitamente o produto externo da requisição, garantindo o isolamento e a seleção correta da base de dados. Para os demais controladores, o produto é resolvido automaticamente pelo contexto interno da API, por meio do método getProduct presente em classes como EntityHe, QueryHe e MobileServices, não sendo necessário informar o cabeçalho.
- Alteração do install.bat para tratar as propriedades ta-api-hub.products, default-instance e default-company nos argumentos passados para a estrutura do arquivo ta-api-hub.xml.
- Ainda sendo obrigatório preencher pelo menos as propriedades do produto Bioenergia.
- Podendo habilitar ou não o preenchimento das propriedades dos produtos Industria-MI e Industria-PI.
Se o produto já estiver instalado e deseja configurar uma nova base ou ajustar a instalação existente, siga esses passos:
- Pare o serviço do ta-api-hub;
- Abra o arquivo ta-api-hub.xml:
- Adeque a estrutura do <arguments></arguments> conforme necessário:
- Como Fazer? para cada propriedade que deseja configurar, faça uma análise do (Antes) e o (Depois) referenciado na primeira imagem após o início da SOLUÇÃO;
- Exemplo de DE: -Dta-api-hub.product.name=BIOENERGIA PARA: -Dta-api-hub.products.bioenergia.name=BIOENERGIA;
Se houver necessidade de inserir uma nova conexão com o banco de dados do INDUSTRIA_PI ou INDUSTRIA_MI, esse bloco de código abaixo é um exemplo do que deve ser inserido/ajustado nos argumentos:
Exemplo de arguments modificado<arguments> ... -Dta-api-hub.products.industria-mi.enabled=true -Dta-api-hub.products.industria-mi.name=INDUSTRIA_MI -Dta-api-hub.products.industria-mi.datasource.driver-class-name=oracle.jdbc.OracleDriver -Dta-api-hub.products.industria-mi.datasource.url=jdbc:oracle:thin:@localhost:1521:TESTE -Dta-api-hub.products.industria-mi.datasource.username=TESTE -Dta-api-hub.products.industria-mi.datasource.password=TESTE -Dta-api-hub.products.industria-mi.datasource.test-connection="SELECT 1 FROM DUAL" ... </arguments>
- Adeque a estrutura do <arguments></arguments> conforme necessário:
- Salve o XML modificado e inicie novamente o serviço que foi parado.
Observação: Este procedimento só é necessário se o produto foi instalado apenas com a base do BIOENERGIA e não houve configuração do INDUSTRIA_PI ou INDUSTRIA_MI, ou se algum argumento foi configurado incorretamente. Alternativamente, uma nova desinstalação seguida de instalação também resolve o problema.
Resumo / Considerações
1. APIs de Entity: Tabela "entity_he" = revisar preenchimento de coluna "product" para as APIs, validando se estão corretamente catalogadas como "BIOENERGIA", "INDUSTRIA_PI" ou "INDUSTRIA_MI";
2. APIs de Query: Mesmo conceito do item 1, porém para a tabela "query_he" e coluna "product";
3. APIs de Mobilidade (descontinuação Portal Mobile): Mesmo conceito dos itens 1 e 2, porém para a tabela "mobile_services" e coluna "product";
4. Por fim, o uso do header "X-Product" aplica-se a endpoints (APIs) anotados com @ExternalProductAware (atualmente, MigrationsController e FunctionsController, ou seja, /admin/migrations e /functions).
04. DEMAIS INFORMAÇÕES
Não se aplica.
05. ASSUNTOS RELACIONADOS
Arquitetura e Tecnologia - TOTVS Agro API Hub

