defineModel
defineModel é a função central do backend. A partir de uma definição declarativa, o Core gera automaticamente:
- Schema Mongoose com timestamps
- Rotas CRUD paginadas
- Metadata para o frontend
- Hooks de domínio (triggers)
- Entradas de RBAC
Assinatura
const { defineModel } = require("@oondemand/oon-core-back");
defineModel({
name: string, // obrigatório — nome do Model Mongoose
singular?: string, // base do path REST. Default: name.toLowerCase()
schema: object, // campos (fields.*) — obrigatório
options?: object, // opções do Schema Mongoose
crud?: {
enabled?: boolean, // default: true
roles?: {
read?: string[], // roles que podem ler
write?: string[], // roles que podem criar/editar/excluir
},
},
});
Exemplo básico
src/models/Cliente.js
const { defineModel, fields } = require("@oondemand/oon-core-back");
defineModel({
name: "Cliente",
schema: {
nome: fields.string({ required: true, label: "Nome" }),
email: fields.string({ label: "E-mail" }),
telefone: fields.string({ label: "Telefone" }),
ativo: fields.boolean({ label: "Ativo", default: true }),
},
});
Isso expõe automaticamente:
GET /clientes → lista paginada
GET /clientes/:id → busca por id
POST /clientes → criação
PUT /clientes/:id → atualização
DELETE /clientes/:id → remoção
Com RBAC
defineModel({
name: "Contrato",
schema: {
titulo: fields.string({ required: true, label: "Título" }),
valor: fields.currency({ label: "Valor" }),
status: fields.enum(["ativo", "encerrado"], { label: "Status" }),
},
crud: {
roles: {
read: ["admin", "gestor", "visualizador"],
write: ["admin", "gestor"],
},
},
});
Com relacionamento
defineModel({
name: "Pedido",
schema: {
numero: fields.string({ required: true, label: "Número" }),
cliente: fields.ref("Cliente", { required: true, label: "Cliente" }),
total: fields.currency({ label: "Total" }),
status: fields.enum(["novo", "confirmado", "entregue"], { label: "Status" }),
dataEntrega: fields.date({ label: "Data de entrega" }),
},
});
Opções do Schema Mongoose
Passe qualquer opção nativa do Mongoose via options:
defineModel({
name: "Log",
schema: { mensagem: fields.string() },
options: {
capped: { size: 1000000 }, // coleção capped
},
});
Rotas geradas
| Método | Path | Auth | Descrição |
|---|---|---|---|
GET | /:modelo | ✅ | Lista com paginação, busca e filtro |
GET | /:modelo/:id | ✅ | Busca por ID |
POST | /:modelo | ✅ | Criação |
PUT | /:modelo/:id | ✅ | Atualização |
DELETE | /:modelo/:id | ✅ | Remoção |
Query params suportados (GET /:modelo)
| Param | Tipo | Descrição |
|---|---|---|
page | number | Página (default: 1) |
limit | number | Itens por página (default: 20) |
search | string | Busca nos campos searchable: true |
sort | string | Ex.: nome.asc ou criadoEm.desc |
[campo] | any | Filtro exato por campo |