Skip to main content

Subtask 01 — Modelos, Enum e DTOs

Nota: o contrato original desta subtask usava showCaseType como int (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 = 4 usado na criação, subtask 05).

Relação com o design doc

  • Decisão #5 — Enum ShowCaseType (desing-doc.md): valores store(1), sellerStock(4), fromValue() com fallback pra store.
  • Decisão #6 — DTOs — Suporte a Novos Campos (desing-doc.md): showCaseType obrigatório (sem default) em CreateShowCaseRequest/UpdateShowCaseRequest; showCaseType/totalItems com default em ShowCaseDetailResponse; novo ShowCaseListV2Response com hasSellerStock/hasNext.

Arquivos a criar

ArquivoDescrição
lib/models/show_case/show_case_type.dartEnum ShowCaseType { store(1), sellerStock(4) } com fromValue(int) (fallback store).
lib/models/show_case/show_case_list_v2_response.dartModel da listagem v2: data, total, pageNumber, pageSize, hasSellerStock, hasNext.

Arquivos a modificar

ArquivoModificação
lib/models/show_case/create_show_case_request.dart+ final int showCaseTypeobrigatório, sem default. Atualizar toJson().
lib/models/show_case/update_show_case_request.dart+ final int showCaseTypeobrigató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.dartpostFastCatalog() e putFastCatalog() passam showCaseType: ShowCaseType.store.value explicitamente ao construir CreateShowCaseRequest/UpdateShowCaseRequestnecessá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.dart
    • ShowCaseType.fromValue(1) == ShowCaseType.store
    • ShowCaseType.fromValue(4) == ShowCaseType.sellerStock
    • ShowCaseType.fromValue(999) == ShowCaseType.store (fallback)
    • ShowCaseType.store.value == 1, ShowCaseType.sellerStock.value == 4
  • test/models/show_case/create_show_case_request_test.dart
    • toJson() inclui a chave showCaseType com o valor passado no construtor
  • test/models/show_case/update_show_case_request_test.dart
    • toJson() inclui a chave showCaseType com o valor passado no construtor
  • test/models/show_case/show_case_detail_response_test.dart
    • fromJson() com showCaseType e totalItems presentes no JSON → valores exatos
    • fromJson() sem showCaseTypeshowCaseType == 1
    • fromJson() sem totalItemstotalItems == showCaseItems.length
  • test/models/show_case/show_case_list_v2_response_test.dart
    • fromJson() completo (data, total, pageNumber, pageSize, hasSellerStock, hasNext) → todos os campos parseados corretamente
    • fromJson() sem hasSellerStockfalse
    • fromJson() sem hasNextfalse

Critérios de aceite (RF-05)

  1. CreateShowCaseRequest e UpdateShowCaseRequest incluem o campo showCaseType na serialização.
  2. ShowCaseDetailResponse inclui showCaseType (int) e totalItems (int) na desserialização.
  3. O model de resposta paginada da listagem v2 expõe hasSellerStock (bool) e hasNext (bool) além da lista de vitrines.
  4. Ao criar uma vitrine com showCaseType = 4, o app envia showCaseItems como 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; ShowCaseSearchProductsController ajustado para continuar compilando com o novo campo obrigatório.
  • flutter analyze sem erros novos.
  • flutter test executando todos os arquivos de teste listados acima, 100% verdes.
  • Projeto compila (flutter pub get + flutter analyze sem erro de tipo; build local se possível).
  • Nenhum outro call site de CreateShowCaseRequest/UpdateShowCaseRequest ficou quebrado (checar com busca global antes de finalizar).