Subtask 01 — Modelos, Enum e DTOs
Nota: o contrato original desta subtask usava
showCaseTypecomoint(1/4). Foi substituído pelo contrato string do enum C# — ver 01b — Ajuste Enum String.
Task pai: 197313 — Ajuste de layout nova vitrine Ordem de execução: 01 de 07 Depende de: nenhuma (base de tudo)
Objetivo
Criar o enum ShowCaseType e atualizar os DTOs de vitrine (CreateShowCaseRequest, UpdateShowCaseRequest, ShowCaseDetailResponse) e o novo model de listagem (ShowCaseListV2Response) para suportar showCaseType, totalItems, hasSellerStock e hasNext. Nenhuma tela ou controller de UI é alterado nesta subtask, exceto o ajuste mínimo necessário para manter o projeto compilando.
Requisitos atendidos
- RF-05 — DTOs e requests atualizados (arquivo de requisitos, seção RF-05): AC1, AC2, AC3, AC4.
- Base para RF-01 (a listagem em si é a subtask 02) e RF-03 AC2 (
showCaseType = 4usado na criação, subtask 05).
Relação com o design doc
- Decisão #5 — Enum
ShowCaseType(desing-doc.md): valoresstore(1),sellerStock(4),fromValue()com fallback prastore. - Decisão #6 — DTOs — Suporte a Novos Campos (
desing-doc.md):showCaseTypeobrigatório (sem default) emCreateShowCaseRequest/UpdateShowCaseRequest;showCaseType/totalItemscom default emShowCaseDetailResponse; novoShowCaseListV2ResponsecomhasSellerStock/hasNext.
Arquivos a criar
| Arquivo | Descrição |
|---|---|
lib/models/show_case/show_case_type.dart | Enum ShowCaseType { store(1), sellerStock(4) } com fromValue(int) (fallback store). |
lib/models/show_case/show_case_list_v2_response.dart | Model da listagem v2: data, total, pageNumber, pageSize, hasSellerStock, hasNext. |
Arquivos a modificar
| Arquivo | Modificação |
|---|---|
lib/models/show_case/create_show_case_request.dart | + final int showCaseType — obrigatório, sem default. Atualizar toJson(). |
lib/models/show_case/update_show_case_request.dart | + final int showCaseType — obrigatório, sem default. Atualizar toJson(). |
lib/models/show_case/show_case_detail_response.dart | + final int showCaseType (default 1 se ausente no JSON), + final int totalItems (default showCaseItems.length se ausente). |
lib/screens/show_case/search/show_case_search_products_controller.dart | postFastCatalog() e putFastCatalog() passam showCaseType: ShowCaseType.store.value explicitamente ao construir CreateShowCaseRequest/UpdateShowCaseRequest — necessário para o projeto continuar compilando depois que o campo deixa de ter default. |
Testes unitários a criar
Seguir o padrão já usado em test/models/recommend_show_case/*_test.dart (testes simples de toJson()/fromJson(), sem GetX).
test/models/show_case/show_case_type_test.dartShowCaseType.fromValue(1) == ShowCaseType.storeShowCaseType.fromValue(4) == ShowCaseType.sellerStockShowCaseType.fromValue(999) == ShowCaseType.store(fallback)ShowCaseType.store.value == 1,ShowCaseType.sellerStock.value == 4
test/models/show_case/create_show_case_request_test.darttoJson()inclui a chaveshowCaseTypecom o valor passado no construtor
test/models/show_case/update_show_case_request_test.darttoJson()inclui a chaveshowCaseTypecom o valor passado no construtor
test/models/show_case/show_case_detail_response_test.dartfromJson()comshowCaseTypeetotalItemspresentes no JSON → valores exatosfromJson()semshowCaseType→showCaseType == 1fromJson()semtotalItems→totalItems == showCaseItems.length
test/models/show_case/show_case_list_v2_response_test.dartfromJson()completo (data,total,pageNumber,pageSize,hasSellerStock,hasNext) → todos os campos parseados corretamentefromJson()semhasSellerStock→falsefromJson()semhasNext→false
Critérios de aceite (RF-05)
CreateShowCaseRequesteUpdateShowCaseRequestincluem o camposhowCaseTypena serialização.ShowCaseDetailResponseincluishowCaseType(int) etotalItems(int) na desserialização.- O model de resposta paginada da listagem v2 expõe
hasSellerStock(bool) ehasNext(bool) além da lista de vitrines. - Ao criar uma vitrine com
showCaseType = 4, o app enviashowCaseItemscomo lista vazia (comportamento do call site, validado na subtask 05 — aqui garantimos apenas que o DTO suporta o campo).
Definição de Pronto (Definition of Done)
- Enum e models criados conforme especificado acima.
- DTOs existentes atualizados;
ShowCaseSearchProductsControllerajustado para continuar compilando com o novo campo obrigatório. -
flutter analyzesem erros novos. -
flutter testexecutando todos os arquivos de teste listados acima, 100% verdes. - Projeto compila (
flutter pub get+flutter analyzesem erro de tipo; build local se possível). - Nenhum outro call site de
CreateShowCaseRequest/UpdateShowCaseRequestficou quebrado (checar com busca global antes de finalizar).