[Provas Custom] Fluxo de provas personalizadas com CustomProvaFactory + criadorId/cursinhoId #72
Closed
FernandoAlmeidaPinto
started this conversation in
Features
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Resumo da entrega. 5 cards no total. Cria a capacidade de fazer provas personalizadas: admin escolhe uma categoria
custom: true(criada no CRUD da etapa 3), define nome livre e PDF opcional, e o backend gera 1 simulado (vs. 5/3 do ENEM) viaCustomProvaFactory. Adiciona tambémcriadorId(obrigatório) ecursinhoId(opcional,nullno fluxo admin) em Prova/Simulado, preparando o terreno pra etapa 6.Documento de fundação:
docs/prova-customizada-factory.mdPosição na série: 4 de 10 · Mapa da série: #66
Status da entrega ✅
Todos os 5 cards implementados e validados ponta-a-ponta (prova custom e ENEM criadas com sucesso no ambiente local). PRs abertos:
criadorId/cursinhoId+ DTO + backfillms-simuladoCustomProvaFactory(1 simulado/prova)ms-simuladobloqueadonullable + sync customms-simuladocriadorId/cursinhoIdnoPOST /mssimulado/provaapi-vcnafaculNewProvacom fluxo condicional porcategoria.customclient-vcnafaculPor que essa etapa
Hoje toda prova é uma prova ENEM (Dia 1/2) — factory com regras rígidas, 5 simulados filhos, nome composto. Admin não conseguia criar uma prova simples "Simuladão Mensal Novembro" com questões a dedo.
Essa etapa introduz o fluxo custom: se a categoria tem
custom: true, roteia praCustomProvaFactory(1 simulado, nome livre, PDF opcional). Reaproveita 100% do fluxo de resposta, histórico e aproveitamento — o simulado custom é indistinguível dos oficiais depois de criado. Como bônus, persistecriadorId/cursinhoId, preparando o fluxo de cursinho da etapa 6.Decisões cravadas
Prova.criadorIdobrigatório em toda prova nova (injetado pelo api-vcnafacul via JWT).Prova.cursinhoIdopcional (defaultnull); semprenullno admin, populado no fluxo cursinho futuro.CustomProvaFactorycria exatamente 1 simulado por prova custom.categoria.custom; assinatura passou agetFactory(categoria, ano).Simulado.bloqueadoadaptado praquantidadeTotalQuestao === null: desbloqueia quando todas as questões estãoApproved(sem critério de quantidade). HelperatingiuQuantidade.executeSyncadaptado pra provas custom: todas as questões vão pro simulado único (sem string matching no nome livre).NewProvacondicional: categoria custom →nome/nomeSimuladoobrigatórios, PDF opcional; select filtra porselecionavel.cadastrarProvas.criadorId = 'system'em provas legadas antes do deploy do schema.Pré-requisitos
custom: truepra escolher noNewProva.Cards desta etapa
ms-simulado· SchemacriadorId/cursinhoId+ DTO estendido + backfill · PR #160ms-simulado·CustomProvaFactory(6 métodos, 1 simulado/prova, transações Mongo) · PR #160ms-simulado· Dispatcher branch custom + regrabloqueadonullable + adaptação doexecuteSync· PR #160api-vcnafacul· Injeção decriadorId(JWT) +cursinhoId: null; arquivos opcionais · PR #504client-vcnafacul·NewProvacondicional porcategoria.custom(nome livre + PDF opcional) · PR #644Ajustes descobertos na implementação
Provaé(item, categoria)(2 args);verifyNumberProvaé chamado pelo service (não dentro decreateQuestion);getByFilterherdado daBaseRepository;CategoriaRepositorydispensado (categoria já injetada).getFactoryrecebe(categoria, ano), não(prova): emcreate()a prova ainda não existe (é criada pela própria factory).JwtAuthGuard, PermissionsGuard(oPermissionsGuardsozinho dá 403 sem token e não populareq.user); PDF opcional precisou entrar aqui também.selecionavel(o card citavanome.includes("Enem"), desatualizado).400 "categoria não existe"mesmo com categoria válida: oCategoriaExistValidatornunca foi registrado como provider nocategoria.module, então comuseContainer(..., {fallbackOnErrors:true})o class-validator instanciava sem injeção →categoriaRepositoryundefined →getByIdlançava → validador retornavafalse. Fix: registrar o validador nos providers. Descoberto testando o fluxo custom ponta-a-ponta.Coordenação de deploy
npm run backfill:criador-idno ms-simulado (janela de manutenção) — antes do schema novo (criadorIdérequired).Próximas etapas
cursinhoIdpopulado,CustomProvaFactoryreaproveitada pelo fluxo cursinho, tela dedicada.Referências
All reactions