Análise técnica

Como o Orbita foi construído

Um resumo honesto das decisões de arquitetura por trás do sistema — porquê, e não apenas o quê — pensado para correr inteiramente em infraestrutura serverless na Vercel.

Stack tecnológica

Frontend

Next.js 14 (App Router) + TypeScript + Tailwind CSS

Backend

Next.js Route Handlers (funções serverless nativas da Vercel)

Base de dados

MongoDB Atlas + Mongoose ODM

Autenticação

NextAuth.js v5 — sessões JWT, credenciais com bcrypt

Validação

Zod em todas as fronteiras de API

Deploy

Vercel — build e runtime 100% serverless

Decisões de arquitetura

Backend serverless em vez de servidor Node dedicado

A Vercel não mantém processos Node de longa duração — cada rota de API é implantada como uma função serverless isolada. Por isso o Orbita usa Route Handlers do Next.js em vez de um servidor Express separado: é a mesma linguagem, o mesmo repositório, e nativamente compatível com o modelo de execução da Vercel, sem necessitar de infraestrutura adicional (containers, processos persistentes).

Cache de conexão MongoDB entre invocações

Funções serverless podem ser reutilizadas ('warm') entre pedidos, mas cada nova instância recria o módulo. A ligação ao Mongoose é guardada num objeto global e reutilizada quando o processo está quente, evitando esgotar o pool de conexões do cluster Atlas — um erro comum em aplicações serverless mal configuradas.

Isolamento multi-tenant ao nível da query, não da base de dados

Em vez de uma base de dados por cliente (mais cara e complexa de gerir), o Orbita usa uma estratégia de 'tenant compartilhado com discriminador': todos os documentos de Project, Task e User carregam um tenantId, e cada query do lado do servidor é filtrada por esse valor extraído da sessão autenticada — nunca fornecido pelo cliente. Isto é validado num único ponto central (getApiContext), o que reduz a superfície de erro.

RBAC aplicado no backend, não apenas na interface

As permissões por papel (Proprietário, Administrador, Gestor, Membro) estão definidas numa única tabela de permissões (lib/rbac.ts) e são verificadas em cada rota de API antes de qualquer escrita. A interface esconde botões que o utilizador não pode usar, mas a garantia real de segurança está no servidor — um pedido direto à API com um papel insuficiente é sempre rejeitado.

Segregação de responsabilidades no acesso a tarefas

Um 'Membro' só pode ver e atualizar o estado das tarefas que lhe foram atribuídas; não pode reatribuí-las nem alterá-las livremente. Esta regra está implementada na própria rota de API (comparando assigneeId com o utilizador autenticado), não apenas como um filtro de exibição.

Convite de utilizadores sem serviço de email externo

Para manter o âmbito de portfólio auto-contido (sem depender de chaves de API de terceiros para correr), o convite de utilizadores gera uma password temporária devolvida ao administrador, em vez de um fluxo de email. A arquitetura já isola esse ponto (app/api/users/route.ts) para ser trivialmente substituído por um provedor de email (Resend, SES) em produção.

Modelo de dados

Quatro coleções no MongoDB Atlas. Note o campo tenantId presente em todas exceto Tenant — é a base de todo o isolamento multi-tenant.

Tenant

name, slug, plan, status, ownerId, settings

User

name, email, passwordHash, tenantId, role, status

Project

tenantId, name, status, ownerId, memberIds, dueDate

Task

tenantId, projectId, title, status, priority, assigneeId

Checklist de deploy na Vercel

  1. 1. Criar um cluster gratuito no MongoDB Atlas e liberar acesso de rede para 0.0.0.0/0 (ou os IPs da Vercel).
  2. 2. Definir as variáveis de ambiente na Vercel: MONGODB_URI, AUTH_SECRET, NEXTAUTH_URL.
  3. 3. Importar o repositório Git na Vercel — o framework Next.js é detetado automaticamente.
  4. 4. Correr npm run seed localmente (apontando ao Atlas) para criar dados de demonstração.
  5. 5. Deploy. Cada rota de API vira automaticamente uma função serverless.