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) }comfromValue(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.sellerStocknas subtasks 03–07).
Relação com o design doc
- Decisão #5 — Enum
ShowCaseType(desing-doc.md): reescrita — enum emlib/shared/enum/, 5 valores,toApiString()+ShowCaseTypeParser.fromJson(), fallbackstore. - Decisão #6 — DTOs (
desing-doc.md):showCaseTypetipado comoShowCaseType(nãoint); serialização viatoApiString()em requests; desserialização via parser em response.
Arquivos a criar
| Arquivo | Descrição |
|---|---|
lib/shared/enum/show_case_type.dart | Enum ShowCaseType com 5 valores; extension ShowCaseTypeApi.toApiString(); ShowCaseTypeParser.fromJson(String?) com fallback store. |
Arquivos a remover
| Arquivo | Motivo |
|---|---|
lib/models/show_case/show_case_type.dart | Substituído por lib/shared/enum/show_case_type.dart. Atualizar todos os imports. |
Arquivos a modificar
| Arquivo | Modificação |
|---|---|
lib/models/show_case/create_show_case_request.dart | final int showCaseType → final ShowCaseType showCaseType. toJson(): 'showCaseType': showCaseType.toApiString(). |
lib/models/show_case/update_show_case_request.dart | Idem. |
lib/models/show_case/show_case_detail_response.dart | final int showCaseType → final ShowCaseType showCaseType. fromJson(): ShowCaseTypeParser.fromJson(picker('showCaseType').asStringOrNull()). |
lib/screens/show_case/search/show_case_search_products_controller.dart | showCaseType: ShowCaseType.store.value → showCaseType: ShowCaseType.store. |
lib/screens/show_case/show_case_detail/show_case_detail_controller.dart | Passar 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 / desconhecido | ShowCaseType.store (fallback) |
Testes unitários a atualizar
test/models/show_case/show_case_type_test.darttoApiString()retorna'Brand','Store','Recommendation','BrandSeller','SellerStock'fromJson('Store')→ShowCaseType.storefromJson('SellerStock')→ShowCaseType.sellerStockfromJson(null)/fromJson('Unknown')→ShowCaseType.store(fallback)
test/models/show_case/create_show_case_request_test.darttoJson()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.dartfromJson()com"showCaseType": "SellerStock"→ShowCaseType.sellerStockfromJson()semshowCaseType→ShowCaseType.store
Critérios de aceite
- POST/PUT enviam
showCaseTypecomo string ("Store","SellerStock"), não como inteiro. - GET de detalhe parseia string da API para
ShowCaseTypetipado. - Enum cobre os 5 valores do C#; fallback seguro para
store. - Nenhum uso remanescente de
.value(int) oufromValue(int). flutter analyzesem erros novos.flutter testnos arquivos listados acima, 100% verdes.
Definição de Pronto (Definition of Done)
- Enum movido para
lib/shared/enum/show_case_type.dartno padrãocart_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
showCaseTypecomointnos models de vitrine.