@gestio-school/pkg
v0.4.0
Published
Infra comum das APIs Gestio School: multitenancy Prisma (pool único), middleware de tenant, CORS e handler das Cloud Functions
Maintainers
Readme
@gestio-school/pkg
Infra comum das APIs Gestio School (fonte única): multitenancy Prisma com pool único compartilhado entre escolas, middleware de tenant (:id_school da URL decide o schema) e CORS padrão.
Módulos
createMultitenantPrisma— fábrica: 1 pool mariadb para a instância inteira; client por escola é leve e só qualifica o database no SQL gerado. Pool sem database default (raw sem qualificar falha alto — Error 1046 — em vez de vazar para o tenant errado). Suporta?socket=/cloudsql/...(prod) ehost:porta(dev/túnel).createTenantMiddleware— hookpreValidationque injetareq.prismaresolvendoparams.id_school → query.id_school → header x-id-school(só inteiro positivo; inválido cai no default).resolveTenantId— a regra de resolução, exportada para testes/usos avulsos.createCorsPlugin— CORS padrão das APIs.createFunctionHandler— pontereq/resdo Functions Framework → Fastify, com tratamento do boot que falha: headers de CORS no caminho de erro (senão o browser mostra "CORS error" e esconde o 5xx), erro serializado de forma legível e encerramento do processo para não servir 5xx em cache até o Cloud Run reciclar a instância.
Uso (numa API)
import mariadb from "mariadb";
import {PrismaMariaDb} from "@prisma/adapter-mariadb";
import {PrismaClient} from "./generated/client";
import {createMultitenantPrisma, createTenantMiddleware} from "@gestio-school/pkg";
const mt = createMultitenantPrisma({
databaseUrl: process.env.DATABASE_URL!,
PrismaClient, PrismaMariaDb, createPool: mariadb.createPool,
});
// fastify.register(mt.plugin) + fastify.register(createTenantMiddleware(mt))Handler da Cloud Function
import fastify from "fastify";
import {createFunctionHandler} from "@gestio-school/pkg";
import app from "./app";
const server = fastify({logger: false, pluginTimeout: 30000});
server.register(app);
export const v1_exemplo = createFunctionHandler(server);Num boot quebrado o avvio guarda o erro do primeiro ready() e toda chamada seguinte
rejeita na hora com o mesmo erro — a instância devolve 5xx em todas as rotas, em
~200ms, até o Cloud Run reciclá-la. Por isso o default é responder 503 e sair
(exitOnBootFailure), para a próxima request pegar instância limpa.
A lib não depende de @prisma/client/mariadb: cada API injeta o client gerado e o driver nas versões dela.
Consumo pelas APIs (npmjs público)
O pacote é publicado público no npmjs — só o dist/ compilado vai no tarball (files: ["dist"]); testes e repo continuam privados. Zero token: npm i funciona no dev, no Actions e no build do GCP.
npm i @gestio-school/pkgRelease
- Bump da versão no
package.json(npm version patch|minorlocal, sem push automático). - Commit + tag
vX.Y.Z+ push da tag → o workflow publish.yml roda testes e publica (secretNPM_TOKEN). - Nas APIs:
npm update @gestio-school/pkg(ou bump da range no package.json).
Testes
npm testInclui o teste de isolamento ponta a ponta (test/isolation.spec.ts): URL → middleware → prisma, com 50 requests concorrentes intercalando escolas — dados de uma escola nunca aparecem na resposta de outra.
