---
# System prepended metadata

title: Feature Toggle

---

# 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

```