Pular para o conteúdo principal

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âmetroTipoDescrição
docDocumentO documento Mongoose que será salvo
contextobject{ 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 }) => { /* ... */ } ],
}
HookMomentoPode modificar doc?Pode lançar erro?
beforeAntes do save✅ (bloqueia o save)
afterApó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.");
}
});