Workflow Quarkus BCE Backend
Escopo e Limite de Diretório
- LIMITE ESTRITO: Operar APENAS dentro de
backend/. Nunca tocar em arquivos defrontend/. - Arquitetura: Padrão Adam Bien BCE estrito (
com.app.<dominio>.{boundary, control, entity}). - Stack Tecnológico: Quarkus, Jakarta EE (
jakarta.*APENAS—nuncajavax.*ouorg.springframework.*).
Portão de Execução em 2 Fases
Fase 1: Contrato e Espinha Dorsal (PARAR PARA REVISÃO HUMANA)
entity: Criar/atualizar payloads imutáveis em Javarecord(com@NotNull,@NotBlank,@Schema) e entidades JPA/Panache dentro de..<dominio>.entity. Zero dependências decontrolouboundary.boundary: Criar/atualizar assinaturas de recurso JAX-RS@Path(@Transactional,@RolesAllowed,@Operation) dentro de..<dominio>.boundary.- Testes: Criar/atualizar stubs de teste JUnit
@QuarkusTestou testes unitários com falha embackend/src/test/java/..<dominio>/boundary/. - PAUSA: Mostrar o diff de
entity,boundarye testes ao usuário. Aguardar aprovação antes de escrever a implementação decontrol.
Fase 2: Implementação e Exportação do Contrato
control: Implementar lógica de negócios dentro de..<dominio>.control(@ApplicationScoped). Nunca chamar ocontrolde outro domínio diretamente; sempre passar peloboundarydele.- Verificar e Exportar Contrato: Executar dentro de
backend/:./mvnw test
Regras de Linguagem e JVM Java 25 LTS (Obrigatório)
Alvo exclusivo Java 25 LTS (<maven.compiler.release>25</maven.compiler.release>). Nunca escrever código legado Java 8/11/17:
- Switch Exaustivo e Decomposição de Records (
control&entity):- Modelar resultados de domínio e máquinas de estado usando
sealed interface+ implementaçõesrecordementity. - Em
control, processá-los usando expressõesswitchexaustivas com decomposição de records e cláusulaswhenguardadas (ex.:case PaidOrder(var id, var total) when total > 1000 -> ...). - NUNCA incluir uma ramificação
defaultem umswitchde umasealed interfacepara que o compilador Java 25 force a exaustividade quando novos estados forem adicionados.
- Modelar resultados de domínio e máquinas de estado usando
- Corpos de Construtores Flexíveis (JEP 513):
- Realizar validação fail-fast e normalização de dados diretamente dentro dos construtores antes de chamar
super(...)outhis(...)em vez de criar métodos auxiliares estáticos inchados.
- Realizar validação fail-fast e normalização de dados diretamente dentro dos construtores antes de chamar
- Variáveis Sem Nome (
_):- Sempre usar
_para parâmetros lambda não utilizados, variáveis de exceção ignoradas ou componentes de records não utilizados (ex.:case Order(var id, _, _)).
- Sempre usar
- Threads Virtuais e Scoped Values (JEP 506):
- Para endpoints de I/O bloqueantes em
boundarydo Quarkus, preferir@RunOnVirtualThreadem vez de cadeias reativasUni<T>a menos que streaming seja necessário. - Nunca usar
ThreadLocal; sempre usarScopedValue<T>do Java 25 se estado contextual precisar ser passado dentro de um escopo de thread.
- Para endpoints de I/O bloqueantes em
- Coleções Modernas e Stream Gatherers (JEP 485):
- Usar métodos de
SequencedCollection(.getFirst(),.getLast(),.reversed()) em vez de cálculos de índicelist.get(list.size() - 1). - Usar
Stream.gather(Gatherers.windowFixed(...))em vez de loops manuais de particionamento.
- Usar métodos de
- Sem Flags de Preview a Menos que Solicitado:
- Manter-se nos recursos finalizados do Java 25 LTS (não habilitar
--enable-previewpara padrões primitivos JEP 507 ou concorrência estruturada JEP 505 a menos que explicitamente solicitado).
- Manter-se nos recursos finalizados do Java 25 LTS (não habilitar