# Feature Toggle
Estabelecer uma estratégia de feature toggle deve ter flexibilidade o suficiente para poder ter um reflexo nos clients que o consomem independente se for um serviço BACKEND ou FRONTEND, e com o menor tempo possivel de carregamente com a estratégia mais simples o possivel.
## O Fundamento do ponto de acesso.
A intenção principal é manter o resultado do FeatureToggle centralizado em um ponto de acesso por um arquivo JSON gerado a cada alteração, o consumo da base é apenas para alimentar o proprio módulo, que sempre irar gerar o .json que será alocado em um bucket e distribuido em CDNs, tendo o acesso com possibilidade de cacheamento pelo Navegador sendo orquestrado pela propria ferramenta de CDN.
## Estrutura de publicação
iremos distribuir a funcionalidade numa estrutura baseada em dominios e produtos, sendo cada produto recebendo o conjunto da chaves compostas pelo dominio, produto e feature, com um objeto como valor, atualmente apenas com o atributo visible.
### Estrutura de diretório
```=sh
legenda:
+ DOMAIN
= PRODUCT
- FEATURE
FEATURES_CONFIG
+ ACQUISITION
= SIGNUP
- REGEX LOGIN
- CHANGE_PASS
- SELECT_CAR_MODEL
+ CUSTUMER
= DRIVER_CENTRAL
- UPDATE PHONE NUMBER
+ FLEET
```
### .json Gerado para consumo do Produto
```
feature_config/acquisition/signup.json
```=json
// chave unica
{
"AQS/SIGNUP/REGEX_LOGIN": {
"visible": true,
},
"AQS/SIGNUP/CHANGE_PASS": {
"visible": true,
},
"AQS/SIGNUP/SELECT_CAR_MODEL": {
"visible": true,
}
}
// chave encadeada
{
"aquisition": {
"signup": {
"regex_login": {
"visible": true,
},
"change_pass": {
"visible": true,
},
"select_car_model": {
"visible": true,
}
}
}
}
```
## Consumo no CLIENT
Em clients é adequando mantermos duas variaveis de ambiente que provavelmente nunca serão alteradas e irão orientar qual arquivo baixar para ter acesso as configuraçoes compartilhadas.
### variáveis de ambiente do projeto
```=SH
DOMAIN='AQS'
PRODUCT='SIGNUP'
```
### declaração da variável global sobre as features.
Ao momento em que fizermos a requisição do arquivo com base no dominio e produto, iremos segregar as features em um objeto de escopo global.
- exemplo de aplicação se utilizarmos a estrutura de chave unica.
```=js
// getFeatures.js
export async function getFeatures() {
return fetch(`https://cdn-domain/${env.DOMAIN}/${env.PRODUCT}.json`)
.then(data => JSON.parse(data));
}
// set global features config
export async function setGlobalFeaturesConfig() {
try {
const features = await getFeatures();
// a nivel de acesso em typescript isso fica simplificado ao que foi tipado
// ex: window[env.DOMAIN][env.PRODUCT] === windows.AQS.SIGNUP
window[env.DOMAIN][env.PRODUCT] = features;
}
}
```
- exemplo de aplicação se utilizarmos a estrutura de chave composta.
```=js
// getFeatures.js
export async function getFeatures() {
return fetch(`https://cdn-domain/${env.DOMAIN}/${env.PRODUCT}.json`)
.then(data => JSON.parse(data));
}
// set global features config
export async function setGlobalFeaturesConfig() {
try {
const config = await getFeatures();
window.featuresConfig = features;
}
}
```
### aplicaçao
```=js
```