Skip to content

Visão Geral dos Workers

O backend do Neemias roda em Cloudflare Workers com D1 (SQLite) como banco de dados serverless. Toda a API é construída sobre um pipeline declarativo de middleware com tipagem forte.

Stack

CamadaTecnologia
RuntimeCloudflare Workers
Banco de DadosD1 (SQLite)
AutenticaçãoPBKDF2 (100k iterações, SHA-256) + JWT HS256 (jose)
ValidaçãoZod schemas
TiposTypeScript com @neemias/schemas (package compartilhado)

Ponto de Entrada

O arquivo workers/src/index.ts é o entry point. Ele:

  1. Cria o roteador via createRouter() (importado de workers/src/router.ts)
  2. Expõe o handler fetch que despacha request.method + pathname → handler registrado
  3. Injeta Env (bindings do Cloudflare) e ExecutionContext

Roteador

O roteador (workers/src/router.ts) mapeia cada rota como uma chave no formato "METHOD /path":

typescript
routes["POST /api/v1/students"] = {
  handler: route(
    "POST",
    "/api/v1/students",
    [pipelineRequireAuth(), pipelineRequireRole(["ADMIN", "CADASTRO"])],
    handleCreateStudentPipeline,
  ).handler,
};

Rotas não encontradas retornam 404 com corpo { error: "NOT_FOUND", message: "Route not found" }.

Pipeline de Middleware

O helper route() (workers/src/middleware/pipeline.ts) aceita um array declarativo de middlewares que executam em sequência antes do handler final:

MiddlewareContext

typescript
interface MiddlewareContext {
  request: Request;
  env: Env;
  ctx: ExecutionContext;
  principal: AuthPrincipal | null; // populado por requireAuth()
  correlationId: string;
}

Middlewares Internos

MiddlewareOrigemFunção
requireAuth()pipeline.tsExtrai Bearer token, valida JWT (ou dev token), popula ctx.principal
requireRole(roles[])pipeline.tsVerifica se ctx.principal.role está na lista permitida
rateLimit({ windowMs, maxRequests })rate-limit.tsRate limiting por IP/chave usando D1

Fluxo de uma Requisição

Request
  → rateLimit? (pré-auth)
  → requireAuth (JWT verify ou dev token)
  → requireRole (verifica permissão)
  → Handler (lógica de negócio)
  → Response

Módulos Principais

MóduloArquivoResponsabilidade
Authworkers/src/modules/auth/Login, refresh token, revogação, validação de sessão
Passwordworkers/src/modules/auth/password.tsHash PBKDF2 e verificação
Session Tokensworkers/src/modules/auth/sessionTokens.tsJWT sign/verify + refresh token creation/rotation
Studentsworkers/src/modules/students/CRUD de alunos + soft-delete com justificativa
Attendanceworkers/src/routes/attendance.tsMarcação de presença (MARK_PRESENT/MARK_ABSENT)
Syncworkers/src/modules/sync/Processamento de eventos offline + conflitos
EventReplayworkers/src/modules/sync/eventReplay.tsResolução de conflitos por evento
Idempotencyworkers/src/modules/idempotency.tsHash de payload para ledger de idempotência
Rate Limitworkers/src/middleware/rate-limit.tsRate limiting com D1
Studentsworkers/src/routes/students.tsHandlers REST para /students
Usersworkers/src/routes/users.tsHandlers REST para /users
Rolesworkers/src/routes/roles.tsHandlers REST para /roles
Classesworkers/src/routes/classes.tsHandlers REST para /classes
Nucleiworkers/src/routes/nuclei.tsHandlers REST para /nuclei
Seedworkers/src/routes/seed.tsDados demo (POST /_seed, dev only)
Security.txtworkers/src/routes/security-txt.tsRFC 9116 (/.well-known/security.txt)

Prefixo da API

Todas as rotas da API usam o prefixo /api/v1.

Arquivos-Chave

ArquivoFunção
workers/src/index.tsEntry point + bootstrap do roteador
workers/src/router.tsDefinição de todas as rotas
workers/src/schemas.tsZod schemas para todos os corpos de requisição
workers/src/shared/types.tsUserRole, AuthPrincipal, ErrorEnvelope
workers/src/db/d1.tsFábrica do client D1
workers/src/db/queries.tsQueries reutilizáveis (auth, idempotência)
workers/src/middleware/auth.tsVerificação JWT + dev mode + role guard
workers/src/middleware/pipeline.tsHelper route() + middlewares built-in
workers/src/middleware/rate-limit.tsRate limiting via D1
workers/src/shared/errors.tsClasse HttpError
migrations/0001_init.sqlSchema core (users, students, events, audit)
migrations/0002_auth_sessions.sqlSessões de refresh token
migrations/0007_rate_limits.sqlRate limiting

Fonte: workers/CONTEXT.md

Distribuído sob licença MIT.