Code Review — Feature flags de upsell no Firebase Remote Config
Arquivo: lib/services/firebase_remote_config_service.dart
Branch: feat/194760_upsell
Task: #193232
Alterações: +14 linhas, 0 deletadas
Data: 2026-06-03
Escopo da mudança
Adição de 2 feature flags para controle de upsell via Remote Config:
| Enum | Chave Firebase | Tipo | Getter |
|---|---|---|---|
enableUpsellRecommendation | enable_upsell_recommendation | bool | _getBoolProperty |
enableUpsellRecommendationByCodeStore | enable_upsell_recommendation_by_code_store | List<String> | _getStringList |
Verificação de requisitos (EARS)
RF-01 — Flag enable_upsell_recommendation
| Critério | Status | Evidência |
|---|---|---|
Enum enableUpsellRecommendation em FirebaseRemoteConfigKeysEnum | ✅ | Linha 181 |
Mapeamento enable_upsell_recommendation no extension .key | ✅ | Linhas 283-284 |
Getter bool get enableUpsellRecommendation via _getBoolProperty | ✅ | Linhas 406-408 |
Retorna false quando chave não existe no Firebase | ✅ | Comportamento padrão do FirebaseRemoteConfig.instance.getBool() |
RF-02 — Flag enable_upsell_recommendation_by_code_store
| Critério | Status | Evidência |
|---|---|---|
Enum enableUpsellRecommendationByCodeStore no enum | ✅ | Linha 182 |
Mapeamento enable_upsell_recommendation_by_code_store no extension .key | ✅ | Linhas 285-286 |
Getter List<String> get enableUpsellRecommendationByCodeStore via _getStringList | ✅ | Linhas 410-412 |
Formato com split por ; | ✅ | Reutiliza _getStringList() (linhas 429-434) que faz split por ';' e remove espaços |
| Retorna lista vazia para string vazia | ✅ | Comportamento padrão de "".split(';') retorna [""] — verificar se isso é aceitável (ver observação #4) |
Análise
✅ O que está correto
- Padrão consistente: Segue exatamente a estrutura de flags existentes (
enableProductRecommendation,enableSpecialLink,isNPSEvaluationMandatory, etc.) — enum → key mapping → dictionary getter. - Nomenclatura:
camelCaseno Dart,snake_caseno Firebase, conforme padrão do arquivo. - Tipagem correta:
boolpara flag global,List<String>para flag por loja (via_getStringList()com split por;). - Ordenação alfabética: Enum values inseridos após
enableConnectionDiagnostic(u > c). - Formatação: Indentação e espaçamento consistentes com o restante do arquivo.
- Sem regressão: Nenhuma linha deletada, apenas adições.
Observações
| # | Severidade | Item |
|---|---|---|
| 1 | Baixa | Sem testes unitários. Nenhum teste foi adicionado para validar os novos getters do FirebaseRemoteConfigServiceDictionary. Embora sigam o padrão do arquivo (que também carece de testes para getters individuais), seria boa prática adicionar cobertura. |
| 2 | Baixa | Nomes longos. enableUpsellRecommendationByCodeStore (38 chars) está no limite de legibilidade, mas mantém consistência com enableProductRecommendationByCodeStore (39 chars) — aceitável dentro do padrão do codebase. |
| 3 | Informativo | Typo pré-existente na chave enable_product_recomendation (linha 254, falta um 'm' em "recommendation"). As novas chaves estão grafadas corretamente (enable_upsell_recommendation). Bug de ortografia existente, não introduzido por esta mudança. |
| 4 | Informativo | _getStringList() retorna [""] para string vazia. Quando o valor no Firebase é "" (string vazia), "".split(';') retorna [""] (lista com uma string vazia), e não [] (lista vazia). Isso pode ser confundido com uma loja de código vazio em checagens do tipo list.contains(storeCode). Recomendação: validar o retorno com "" no Firebase no momento do consumo (task futura). |
Veredito
✅ APPROVED
As mudanças são mínimas, corretas e seguem o padrão estabelecido do codebase. Todos os critérios de aceitação da task #193232 estão implementados. Nenhum blocker identificado.
Recomenda-se atenção ao comportamento de _getStringList() com string vazia (observação #4) no momento do consumo das flags.