Aplicando Ambientes
Vamos agora selecionar e aplicar o ambiente configurado.
Em Configurando Ambientes aprendemos a configurar cada ambiente referente a Rest e GraphQL APIs e Keycloak. Agora precisamos garantir que algumas coisas estejam nos conformes para aplicarmos essas configurações em tempo de execução.
- Garantir que em todas as classes de configuração tenham seus atributos de configurações com o mesmo nome como no exemplo abaixo:
Assim sempre que aplicarmos um ambiente, ele irá buscar o mesmo ambiente em todas as configurações.
Plugin Environments
Para obtermos o ambiente no qual desejamos trabalhar, foi implementado um plugin que tem como função capturar a partir de uma query url param o respectivo valor configurado. Segue uma tabela explicativa.
| URL | Enviroment | Padrão |
|---|---|---|
| http://localhost:3000 | development | Sim |
| http://localhost:3000/?env=staging | staging | Não |
| http://localhost:3000/?env=hml | hml | Não |
Este plugin pode ser localizado em plugins/plasma_enviroment.ts.
HOST_PRODUCTION ou HOST_STAGING, estes respectivamente se tornam padrão e não o development. Logo o parâmetro env usado para alterar o ambiente, automaticamente não irá mais funcionar.Composable Connections
O projeto contém alguns composables úteis e um deles é o Connections.ts que tem como função fornecer as configurações de conexão para requisições rest, graphql e keycloak conforme configurado os ambientes.
Normalmente esse composable é usado em conjunto com três outros, sendo eles Api.ts, GraphQL.ts e Keycloak.ts. Cada composable desse fornece métodos ou gerencia algum tipo de conexão conforme necessiadade.
Para isso precisamos modificar a implementação para adicionar as conexões que precisamos dentro de nossa aplicação, vejamos:
/* eslint-disable @typescript-eslint/no-explicit-any */import Connection from '~/utils/connection/Connection';import KeycloakConnection from '~~/utils/keycloak/KeycloakConnection';import * as coreApi from '~~/utils/connection/rest/ConnectionsCore';import * as gqlApi from '~~/utils/connection/graphql/ConnectionsCoreGql';import * as keycloak from '~~/utils/keycloak/KeycloakConnections';export const useConnections = () => { const enviroment = useCookie<string>('enviroment'); const { connection1: apiCoreCon, connection2: graphCoreCon, connection3: keycloakCon } = defineConnectionsEnviroments(enviroment.value, coreApi, gqlApi, keycloak); const provide = { coreApi: apiCoreCon as Connection, gqlApi: graphCoreCon as Connection, keycloakConnection: keycloakCon as KeycloakConnection }; return provide;};function defineConnectionsEnviroments( enviroment: string, ...connections: any[]): any { const values = {}; connections.forEach((connection: any, index) => { const value: any = obtainConnection(enviroment, connection); values[`connection${index + 1}`] = value; }); return values;}function obtainConnection(enviroment: string, connection: any): any { return connection.default[enviroment] ?? connection.default['development'];}Veja que a implentação se baseia em disponibilizar uma estrutura chamada provide que irá disponibilizar todas as configurações de conexões através do composable.
- Linha 4 à 6: Veja que é importado os arquivos de configuração de conexão anteriormente configurados com seus respectivos ambientes, development, staging, hml, etc.
- Linha 9: Aqui atribuimos a variável enviroment o valor que é obtido e guardado como cache no plugin plasma_enviroment.ts.
- Linha 12 à 14: Aqui fazemos um desestruturação para obter as configurações a partir do que é passado nas importações dentro do método defineConnectionsEnviroments quem irá analisar todas as conexões configuradas e retorar a respectiva configuração de acordo com o que é capturado na variável enviroment.
Veja que o método defineConnectionsEnviroments recebe como último parâmetro um array de connections que por sua vez tem o type any. Isso porque a responsabilidade deste método é varrer a classe e obter a partir de seus atributos o valor respectivo ao enviroment e gerando um novo objeto com todos estes. Agora deve ter ficado claro o porque da desestruturação da linha 12 à 14, pois quanto mais classes de ambientes configurados for passado para o método, haverar uma desestruturação equivalente.