Skip to main content

Subtask 01b — Ajuste ShowCaseType para enum string da API

Task pai: 197313 — Ajuste de layout nova vitrine Ordem de execução: 01b (entre 01 e 02) Depende de: 01 — Modelos, Enum e DTOs (já executada com contrato int) Bloqueia: subtasks 02 a 07

Objetivo

Corrigir o contrato de showCaseType implementado na subtask 01: a API passou a serializar/deserializar o tipo de vitrine como string do enum C# ("Store", "SellerStock", etc.), não mais como inteiro (1, 4). Migrar o enum Dart e os DTOs para o padrão já adotado em lib/shared/enum/cart_item_discount_origin.dart (extension toApiString() + parser fromJson(String?)).

Motivação

A subtask 01 implementou:

  • ShowCaseType { store(1), sellerStock(4) } com fromValue(int)
  • DTOs com final int showCaseType
  • Serialização JSON com valores numéricos

O backend expõe o enum C# completo:

public enum ShowCaseType
{
Brand,
Store,
Recommendation,
BrandSeller,
SellerStock
}

Serializado como string PascalCase no JSON ("Store", "SellerStock", …).

Requisitos atendidos

  • RF-05 — DTOs e requests atualizados: AC1, AC2 (contrato corrigido para string enum).
  • Base para RF-03 AC2 e RF-04 (comparações tipadas ShowCaseType.store / ShowCaseType.sellerStock nas subtasks 03–07).

Relação com o design doc

  • Decisão #5 — Enum ShowCaseType (desing-doc.md): reescrita — enum em lib/shared/enum/, 5 valores, toApiString() + ShowCaseTypeParser.fromJson(), fallback store.
  • Decisão #6 — DTOs (desing-doc.md): showCaseType tipado como ShowCaseType (não int); serialização via toApiString() em requests; desserialização via parser em response.

Arquivos a criar

ArquivoDescrição
lib/shared/enum/show_case_type.dartEnum ShowCaseType com 5 valores; extension ShowCaseTypeApi.toApiString(); ShowCaseTypeParser.fromJson(String?) com fallback store.

Arquivos a remover

ArquivoMotivo
lib/models/show_case/show_case_type.dartSubstituído por lib/shared/enum/show_case_type.dart. Atualizar todos os imports.

Arquivos a modificar

ArquivoModificação
lib/models/show_case/create_show_case_request.dartfinal int showCaseTypefinal ShowCaseType showCaseType. toJson(): 'showCaseType': showCaseType.toApiString().
lib/models/show_case/update_show_case_request.dartIdem.
lib/models/show_case/show_case_detail_response.dartfinal int showCaseTypefinal ShowCaseType showCaseType. fromJson(): ShowCaseTypeParser.fromJson(picker('showCaseType').asStringOrNull()).
lib/screens/show_case/search/show_case_search_products_controller.dartshowCaseType: ShowCaseType.store.valueshowCaseType: ShowCaseType.store.
lib/screens/show_case/show_case_detail/show_case_detail_controller.dartPassar ShowCaseType diretamente ao construir UpdateShowCaseRequest (não int).

Padrão de referência

Seguir lib/shared/enum/cart_item_discount_origin.dart:

enum ShowCaseType { brand, store, recommendation, brandSeller, sellerStock }

extension ShowCaseTypeApi on ShowCaseType {
String toApiString() { /* retorna PascalCase: 'Store', 'SellerStock', ... */ }
}

abstract class ShowCaseTypeParser {
static ShowCaseType fromJson(String? value) { /* switch nas strings da API */ }
}

Mapeamento API ↔ Dart:

API (JSON)Dart
"Brand"ShowCaseType.brand
"Store"ShowCaseType.store
"Recommendation"ShowCaseType.recommendation
"BrandSeller"ShowCaseType.brandSeller
"SellerStock"ShowCaseType.sellerStock
ausente / desconhecidoShowCaseType.store (fallback)

Testes unitários a atualizar

  • test/models/show_case/show_case_type_test.dart
    • toApiString() retorna 'Brand', 'Store', 'Recommendation', 'BrandSeller', 'SellerStock'
    • fromJson('Store')ShowCaseType.store
    • fromJson('SellerStock')ShowCaseType.sellerStock
    • fromJson(null) / fromJson('Unknown')ShowCaseType.store (fallback)
  • test/models/show_case/create_show_case_request_test.dart
    • toJson() inclui 'showCaseType': 'Store' / 'SellerStock' (string, não int)
  • test/models/show_case/update_show_case_request_test.dart
    • Idem
  • test/models/show_case/show_case_detail_response_test.dart
    • fromJson() com "showCaseType": "SellerStock"ShowCaseType.sellerStock
    • fromJson() sem showCaseTypeShowCaseType.store

Critérios de aceite

  1. POST/PUT enviam showCaseType como string ("Store", "SellerStock"), não como inteiro.
  2. GET de detalhe parseia string da API para ShowCaseType tipado.
  3. Enum cobre os 5 valores do C#; fallback seguro para store.
  4. Nenhum uso remanescente de .value (int) ou fromValue(int).
  5. flutter analyze sem erros novos.
  6. flutter test nos arquivos listados acima, 100% verdes.

Definição de Pronto (Definition of Done)

  • Enum movido para lib/shared/enum/show_case_type.dart no padrão cart_item_discount_origin.dart.
  • DTOs e call sites atualizados; arquivo antigo em lib/models/show_case/ removido.
  • Testes atualizados e verdes.
  • Busca global confirma ausência de showCaseType como int nos models de vitrine.