NoteBugsDocs

Começo

Visão geral do sistema

Como o NoteBugs está montado, e onde cada regra é aplicada.

Stack

CamadaO quê
AplicaçãoNext.js 15 (App Router) e React 19, um container só
BancoPostgreSQL, acessado por Prisma
Arquivosvolume em disco ou bucket S3-like, decidido por tipo de conteúdo
EntregaDocker Compose; as migrations rodam no entrypoint

Não há serviço externo obrigatório, fila, cache nem worker. O agendamento do backup é um timer do próprio processo, e não um serviço à parte.

O que acontece antes de qualquer rota

Toda requisição passa pelas mesmas três conferências antes de chegar ao código de negócio, nesta ordem:

  1. 1Limite de requisições, antes de qualquer consulta ao banco.
  2. 2Identidade: quem está chamando, resolvido uma vez só por requisição.
  3. 3Papel: o que essa identidade alcança, conferido contra a matriz de permissões.

Uma rota nova nasce fechada

A regra padrão da matriz é: leitura pede VIEWER, escrita pede MEMBER. Uma rota que não esteja cadastrada continua exigindo identidade: nenhuma nasce aberta.

As regras de negócio são conferidas num lugar só

Cada regra é conferida de dentro da transação, e nunca reescrita rota a rota. É por isso que a API se comporta igual vindo da interface ou de um curl.

RegraO que ela garante
Posição do card na colunaa ordem é a mesma para todo mundo, mesmo com dois arrastes ao mesmo tempo
Card e epic no mesmo projetoum card só entra em epic do próprio projeto
Prazo do card contra o alvo do epicnenhuma data já escolhida é sobrescrita sem pedido explícito
Fronteira do espaço de trabalhonada atravessa de um espaço para outro
Conjunto de colunas em vigoro columnId enviado pertence ao quadro daquele card
Composição do card a partir do modeloo que veio no pedido vence; o modelo preenche o resto
Onde os bytes são gravadosdisco ou bucket, conforme o tipo de conteúdo
O que cada papel alcançavale sempre o mais restrito dos dois eixos

A interface aplica essas mesmas regras para avisar antes de a requisição sair, mas quem recusa é sempre o servidor: um cliente desatualizado não contorna nenhuma delas.

Data, hora e fuso

O container roda em UTC. Prazo de card e de epic carrega o fuso em que foi declarado (dueAtZone), e é isso que faz o mesmo dia valer para todo leitor, esteja ele onde estiver.

Mensagem de erro nunca traz data formatada

Formatar no servidor erraria o dia, porque o container está em UTC. Quem formata é o cliente, que conhece o fuso de quem está lendo.