# 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 ```