Skip to main content

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:
classDiagram class Rest { +string development +string production +string staging +string hml ... } class GraphQL { +string development +string production +string staging +string hml ... } class Keycloak { +string development +string production +string staging +string hml ... }

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.

URLEnviromentPadrão
http://localhost:3000developmentSim
http://localhost:3000/?env=stagingstagingNão
http://localhost:3000/?env=hmlhmlNão

Este plugin pode ser localizado em plugins/plasma_enviroment.ts.

i
Para saber: No caso da aplicação estiver rodando em um dos hosts definidos pelas variáveis do projeto 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:

composables/Connections.ts
/* 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.

i
Para Saber: Todas as variáveis desestruturadas terão nomes que seguem um sequencial chamado connection+[index], assim se houver 10 classes de conexões haverá de 1 à 10.