Subtask 04 — Detalhe: Regras de Negócio no Controller
Task pai: 197313 — Ajuste de layout nova vitrine Ordem de execução: 04 de 07 Depende de: 01b — Ajuste Enum String. Pode ser feita em paralelo com a subtask 03 (arquivos diferentes: controller vs. screen/layout), mas ambas devem estar prontas antes da subtask 05.
Objetivo
Ajustar as regras de negócio do ShowCaseDetailController: correção da semântica de enableEditButton (comparação real de data, aplicada aos dois tipos), remoção do guard de estoque vazio para SellerStock, PUT forçando lista vazia de produtos para SellerStock, e supressão de reward events para SellerStock (aguardando task 197192).
Requisitos atendidos
- RF-04 — Detalhe da vitrine condicionado ao
showCaseType: AC8, AC9, AC10, AC11, AC12.
Relação com o design doc
- Decisão #4 — Detalhe Condicional por
showCaseType(desing-doc.md), parte controller:updateShowCase()forçashowCaseItems: []quandoshowCaseType == ShowCaseType.sellerStock.- Correção de
enableEditButton: comparação real de data (expirationDate.value != detail.value?.dateExpiration), aplicada a Store e SellerStock; guard deshowCaseItems.isNotEmptymantido só parashowCaseType == ShowCaseType.store. - Reward events (
viewShowCase/shareShowCase/copyLink) suprimidos quandoshowCaseType == ShowCaseType.sellerStock.
- Ver também
context/comportamento-controller-detalhe-sellerstock.md(achado original com os 4 pontos investigados).
Arquivos a modificar
| Arquivo | Modificação |
|---|---|
lib/screens/show_case/show_case_detail/show_case_detail_controller.dart | Getter enableEditButton reescrito (ver snippet na Decisão #4 do design doc); updateShowCase() monta showCaseItems: [] quando showCaseType == ShowCaseType.sellerStock; viewShowCase()/shareShowCase()/copyLink() só chamam rewardEventController.register(...) quando showCaseType == ShowCaseType.store. |
Testes unitários a criar
test/screens/show_case/show_case_detail/show_case_detail_controller_test.dartenableEditButton:showCaseType == ShowCaseType.store,showCaseItemsvazio, data alterada →false(guard de lista não-vazia mantido para Store)enableEditButton:showCaseType == ShowCaseType.sellerStock,showCaseItemsvazio (loja sem estoque), data alterada →true(guard removido para SellerStock)enableEditButton: reabrir o seletor de data e escolher a mesma data já salva →falsepara os dois tipos (comparação real, não "campo tocado")enableEditButton:detail.value == null→false(cobre o caso de loading/erro, usado depois na subtask 05)updateShowCase():showCaseType == ShowCaseType.sellerStock→ o payload do PUT contémshowCaseItems: [](não os productIds do preview carregado)updateShowCase():showCaseType == ShowCaseType.store→ payload do PUT mantémshowCaseItemscom os produtos atuais (comportamento existente, sem regressão)viewShowCase()/shareShowCase()/copyLink():showCaseType == ShowCaseType.sellerStock→ nenhuma chamada arewardEventController.register(...)viewShowCase()/shareShowCase()/copyLink():showCaseType == ShowCaseType.store→rewardEventController.register(...)chamado normalmente (sem regressão)
Critérios de aceite (RF-04, parte controller)
showCaseType == ShowCaseType.sellerStocke o vendedor altera apenas a data de expiração: o App enviaPUT /api/show-case-newcomshowCaseType == ShowCaseType.sellerStockcontendo somentedateExpirationefetivo (demais campos ignorados pela API, masshowCaseItemsenviado como[]explicitamente).showCaseType == ShowCaseType.sellerStock: açõesVisualizar,CompartilhareCopiar linkmantidas na seçãoEscolha uma opção(sem reward event, ver AC12).showCaseType == ShowCaseType.sellerStock: botõesATUALIZAR VITRINE(habilitado somente se a data mudou) eEXCLUIR VITRINEmantidos;ATUALIZAR VITRINEnão exigeshowCaseItemsnão-vazio para este tipo.- Em qualquer
showCaseType, o botãoATUALIZAR VITRINEsó habilita se a nova data for realmente diferente da data originalmente carregada. showCaseType == ShowCaseType.sellerStock: nenhum reward event nativo do detalhe (Visualizar,Compartilhar,Copiar link) é registrado até a task 197192.
Definição de Pronto (Definition of Done)
-
enableEditButton,updateShowCase(),viewShowCase()/shareShowCase()/copyLink()atualizados conforme especificado. -
flutter analyzesem erros novos. -
flutter testexecutando os testes listados acima, 100% verdes. - Projeto compila.
- Nenhuma regressão no fluxo de
showCaseType == ShowCaseType.store(Store) — coberta pelos testes de "sem regressão" listados acima.