Construindo um Backend de Gerenciamento de Projetos
Estou construindo uma ferramenta colaborativa de gerenciamento de projetos para o meu estágio na CodeAlpha.
Funciona como um Trello ou Asana simplificado. Os usuários criam projetos, convidam membros e movem tarefas entre quadros. Utilizo Express.js, Prisma e Socket.io para alimentá-lo.
Aqui estão as lições técnicas que aprendi enquanto construía o backend.
Gerenciando Relacionamentos de Dados
Usuários e projetos possuem um relacionamento muitos-para-muitos (many-to-many). Utilizo uma tabela ProjectMember para conectá-los. Esta tabela armazena dados extras, como a função (role) do usuário.
Adicionei uma restrição de unicidade (unique constraint) a esta tabela. Isso garante que um usuário apareça apenas uma vez por projeto. Também cria uma chave composta para buscas rápidas.
Para o quadro Kanban, mantive as coisas simples. O status de uma tarefa é definido pelo quadro ao qual ela pertence. Mover uma tarefa de "To Do" para "Done" é apenas uma questão de atualizar o seu board ID.
Erros de Arquitetura
Aprendi uma lição difícil sobre conexões de banco de dados. Não crie um novo PrismaClient em cada arquivo de rota. Isso cria conexões demais e derruba sua aplicação.
Em vez disso, crie uma instância compartilhada em um único arquivo. Importe essa mesma instância em cada rota. Isso mantém seu pool de conexões estável.
Autorização e Segurança
Utilizo um middleware protect para proteger as rotas. Ele verifica o JWT no cabeçalho Authorization.
Utilizo optional chaining ao ler os cabeçalhos. Isso evita que o app trave caso um cabeçalho esteja ausente.
Para este projeto, utilizo um token de acesso de 7 dias. Embora aplicativos em produção utilizem tokens de curta duração e refresh tokens, um token de longa duração funciona bem para este escopo específico.
Integridade de Dados com Transações
Criar um projeto requer três etapas:
- Criar o registro do projeto
- Atribuir o proprietário
- Criar os quadros padrão
Se uma etapa falhar, seus dados podem ficar corrompidos. Utilizo prisma.$transaction para envolver essas etapas. Se qualquer parte falhar, todo o processo sofre rollback. Isso mantém seu banco de dados limpo.
Common Logic Errors
Encontrei dois bugs comuns:
Arrays de Relação: Quando você inclui relações em uma consulta, o Prisma retorna um array. Você não pode acessar uma propriedade diretamente na relação. Você deve primeiro selecionar o primeiro item do array.
Ordem das Rotas: O Express processa as rotas de cima para baixo. Se você colocar uma rota com um parâmetro antes de uma rota específica, o Express fará a correspondência com a errada. Sempre coloque rotas específicas acima de rotas parametrizadas.
Esses padrões de backend agora fazem parte do meu fluxo de trabalho.