Ir para o conteúdo

Admin (API JSON)

O módulo admin expõe um admin JSON com CRUD auto-derivado por recurso e introspecção de campos — um frontend (React, etc.) consome e renderiza. Ao contrário do admin server-rendered do FastAPI SDK, aqui a UI fica desacoplada.

Registrar recursos

Um AdminResource é baseado em callbacks — conecte-o a um BaseService, a um repositório tempest-db-js, ou a qualquer store.

import { AdminSite, createApp, makeAdminRouter, z } from "tempest-express-sdk";

const site = new AdminSite("Painel");

site.register({
  name: "users",
  fields: [
    { name: "id", type: "string", readOnly: true },
    { name: "email", type: "string", required: true },
  ],
  createSchema: z.object({ email: z.string().email() }),
  updateSchema: z.object({ email: z.string().email() }),
  async list({ page, pageSize, filters }) {
    const data = await userService.paginate({ page, pageSize, filters });
    return data; // { items, total, page, pageSize, pages }
  },
  async get(id) {
    return userService.getByIdOrNull(id);
  },
  async create(data) {
    return userService.create(data as { email: string });
  },
  async update(id, data) {
    return userService.updateById(id, data);
  },
  async remove(id) {
    await userService.deleteById(id);
  },
});

Montar o router (protegido)

Passe um guard — reuse o middleware JWT + requireRoles("admin").

import { makeJwtAuthMiddleware, requireRoles } from "tempest-express-sdk";

const app = await createApp({
  configure: (a) => {
    a.use(
      makeAdminRouter(site, {
        prefix: "/admin",
        guard: [makeJwtAuthMiddleware(jwt), requireRoles("admin")] as never,
      }),
    );
  },
});

Um guard só

guard aceita um único middleware. Para encadear auth + role, componha-os num middleware que chama um depois do outro, ou use express.Router() com os dois use() antes de montar o admin.

Endpoints

Método Rota Descrição
GET /admin Brand + lista de recursos
GET /admin/:resource/_meta Campos + operações suportadas
GET /admin/:resource Lista paginada (?page=&pageSize= + filtros)
GET /admin/:resource/:id Detalhe (404 se ausente)
POST /admin/:resource Cria (valida createSchema)
PATCH /admin/:resource/:id Atualiza (valida updateSchema)
DELETE /admin/:resource/:id Remove (204)

Operação de escrita ausente no recurso → 405; recurso desconhecido → 404; payload inválido → 422.

Recapitulando

Registre recursos (callbacks sobre seus services), monte um router guardado, e qualquer frontend renderiza o admin a partir da introspecção _meta.