Validações e Triggers
defineValidation
Registra uma função de validação para um Model. É chamada pelo Core antes de qualquer save e deve lançar um erro para bloquear a operação.
const { defineValidation } = require("@oondemand/oon-core-back");
defineValidation("Pedido", async (doc, context) => {
if (doc.total <= 0) {
throw new Error("O valor do pedido deve ser maior que zero.");
}
if (doc.status === "confirmado" && !doc.cliente) {
throw new Error("Pedido confirmado precisa de um cliente.");
}
});
Parâmetros do callback
| Parâmetro | Tipo | Descrição |
|---|---|---|
doc | Document | O documento Mongoose que será salvo |
context | object | { op: "create" | "update" } |
defineTrigger
Registra hooks que executam antes (before) ou depois (after) do save de um Model. Use para efeitos colaterais: sincronização, notificações, cálculos derivados.
const { defineTrigger } = require("@oondemand/oon-core-back");
defineTrigger("Pedido", {
before: [
async (doc, { op }) => {
if (op === "create") {
doc.numero = await gerarNumeroPedido();
}
},
],
after: [
async (doc) => {
await notificarEquipe(doc);
},
],
});
Estrutura do objeto de hooks
{
before: [ async (doc, { op }) => { /* ... */ } ],
after: [ async (doc, { op }) => { /* ... */ } ],
}
| Hook | Momento | Pode modificar doc? | Pode lançar erro? |
|---|---|---|---|
before | Antes do save | ✅ | ✅ (bloqueia o save) |
after | Após o save bem-sucedido | ✅ (requer save() manual) | ⚠️ (não reverte o save) |
Convenção de arquivo
Crie um arquivo por Model dentro de src/validations/ e src/triggers/:
src/
├── validations/
│ ├── Pedido.js
│ └── Cliente.js
└── triggers/
├── Pedido.js
└── Servico.js
O Core carrega todos automaticamente no boot — não é necessário importar manualmente.
Exemplo: calcular total antes de salvar
src/triggers/Pedido.js
const { defineTrigger } = require("@oondemand/oon-core-back");
defineTrigger("Pedido", {
before: [
async (doc) => {
doc.total = doc.itens.reduce((sum, item) => sum + item.preco * item.qtd, 0);
},
],
});
Exemplo: validação de negócio
src/validations/Contrato.js
const { defineValidation } = require("@oondemand/oon-core-back");
defineValidation("Contrato", async (doc) => {
if (doc.dataFim <= doc.dataInicio) {
throw new Error("A data de fim deve ser posterior à data de início.");
}
if (doc.valor > 1_000_000 && !doc.aprovadoPor) {
throw new Error("Contratos acima de R$ 1M precisam de aprovação.");
}
});