Um fluxo tenant
Organization, user, Category e Task provam tenancy e comportamento real de feature.
Fatia de produtoEntregue mais rápido como monólito modular com multitenancy, RBAC, organizações, usuários e colaboração orientada a eventos já modelados.

bun install
bun run cli
bun run dev:expressDo zero ao primeiro MVP
Use este caminho quando o primeiro MVP é uma fatia SaaS completa: login, escopo de tenant ou organização, um fluxo central e um deploy.
Escolha a primeira capacidade da organização, como tarefas por categoria, e defina quem cria, vê e conclui.
Saída MVP: um contexto delimitado com expectativas de tenant e RBAC.
type TenantContext = { organizationId: string; userId: string };
type Task = { id: string; organizationId: string; title: string; categoryId: string };
class TenantPolicy {
canWriteTask(context: TenantContext, organizationId: string) {
return context.organizationId === organizationId;
}
}Escopo MVP
Organization, user, Category e Task provam tenancy e comportamento real de feature.
Fatia de produtoMantenha operação simples preservando módulos de feature e limites de composição.
Fatia de entregaProve superadmin/admin/user antes de uma matriz completa de permissões.
Fatia de segurança| Área de prova | Pergunta a responder | Mecanismo Jumentix | Evidência MVP |
|---|---|---|---|
| Segurança tenant | Uma organização consegue ver dados de outra? | Testes tenant-aware de use-case e checks de policy. | Leituras e escritas cross-tenant falham. |
| Limite de módulo | A primeira feature muda sem tocar módulos não relacionados? | Pasta por feature e checks de workspace boundary. | Mudanças ficam locais ao contexto delimitado. |
| Pronto para piloto | O MVP inteiro roda como um app supervisionado? | Perfil dev/staging, smoke test, docs e evidência prepublish. | Um deploy está pronto para primeiros usuários. |
Implementação prática
Estes exemplos mantêm Category e Task como vocabulário de produto e mostram controller, contrato, client, worker ou camada de estado necessários para chegar a um MVP executável.
type TenantContext = { organizationId: string; userId: string };
type Task = { id: string; organizationId: string; title: string; categoryId: string };
class TenantPolicy {
canWriteTask(context: TenantContext, organizationId: string) {
return context.organizationId === organizationId;
}
}
class TaskModule {
private readonly tasks = new Map<string, Task>();
constructor(private readonly tenantPolicy: TenantPolicy) {}
create(context: TenantContext, input: { title: string; categoryId: string }) {
if (!this.tenantPolicy.canWriteTask(context, context.organizationId)) {
return { ok: false, error: 'tenant access denied' };
}
const task: Task = {
id: crypto.randomUUID(),
organizationId: context.organizationId,
title: input.title,
categoryId: input.categoryId
};
this.tasks.set(task.id, task);
return { ok: true, result: task };
}
}
const taskModule = new TaskModule(new TenantPolicy());
export const modules = { taskModule };Continue explorando
Entregue serviços OpenAPI 3.1 com adaptadores HTTP nativos intercambiáveis.
Explore o blueprintExecute Socket.IO ou gRPC ao lado de fallback REST e documentação AsyncAPI.
Explore o blueprintLance um deploy com limites de domínio prontos para virar serviços.
Explore o blueprintMantenha a comunicação entre serviços baseada em contratos com o Message Mediator.
Explore o blueprintCrie produtos frontend que compartilham SDKs gerados e funcionam offline.
Explore o blueprintExplore o código, execute a fábrica localmente e transforme seu próximo serviço Node.js em uma capacidade repetível de plataforma.