projeto
Sistema de gestão de clínicas (TCC)
Aplicação web para clínicas médicas: agendamentos, prontuários e controle de acesso. Projeto de conclusão de curso.
contexto
O projeto se chamava med.ai. A ideia original era integrar IA pra gravar a consulta e gerar a anamnese automaticamente, mas no meio do desenvolvimento decidi retirar a IA do escopo.
Foi meu TCC em Sistemas de Informação. O objetivo principal era aprender, era minha primeira aplicação com React, Node.js e banco relacional funcionando juntos. O problema que o sistema propõe resolver é real: clínicas pequenas que ainda gerenciam agendamentos em papel ou planilha, com vários profissionais dividindo a mesma agenda.
o que foi construído
Agendamento
- Calendário com FullCalendar nas views mensal, semanal e diária
- Drag-and-drop nas views semana e dia: arrastar o evento atualiza o horário no banco
- Máquina de estados com quatro momentos: agendado, confirmado, iniciado, realizado
- O médico pode reabrir uma consulta encerrada
- Sem verificação de conflito de horário, dois agendamentos no mesmo slot são tecnicamente possíveis
Prontuário
- Editor rich text com draft-js + react-draft-wysiwyg
- O médico pode definir um template padrão de anamnese no perfil, carregado automaticamente ao abrir uma consulta nova
- Anamnese armazenada como TEXT no banco
Notificações por e-mail
- Busca agendamentos do dia seguinte que ainda não têm token
- Gera token com crypto.randomBytes(20) e salva no agendamento
- Envia e-mail com link de confirmação via nodemailer
- Endpoint público valida o token e marca o agendamento como confirmado
Multi-tenant
- O sistema suporta múltiplas clínicas com dados isolados
- consultorio_id é incluído no JWT no login e todas as queries filtram por ele
- Chave primária composta (id, consultorio_id) em todas as tabelas reforça o isolamento no banco
Controle de acesso
- Dois flags no cadastro de usuário: médico e admin
- Médicos veem o menu de atendimentos e podem abrir consultas
- Admins veem o formulário de cadastro de novos usuários
- A proteção está só no frontend, o backend não valida o papel antes das operações
decisões técnicas
JWT em cookie httpOnly
O token de autenticação fica num cookie com httpOnly: true, então não toca o JavaScript do frontend. Na época eu não conhecia direito os termos XSS ou roubo de token via document.cookie, escolhi por intuição depois de ler alguns exemplos. Hoje sei o nome do que estava evitando.
Multi-tenant no JWT e no banco
Incluir consultorio_id no JWT e filtrar todas as queries por ele não estava planejado desde o início. Apareceu no meio do desenvolvimento quando entendi que o sistema poderia hospedar mais de uma clínica. A chave composta no banco veio depois, como reforço, pra que um erro na camada de aplicação não vazasse dados entre clínicas.
Rate limiting no login
O endpoint de login tem limite de 8 tentativas por 15 minutos por IP. Veio de leituras sobre segurança enquanto desenvolvia.
o que aprendi
A IA saiu do escopo e ficou um sistema de gestão básico. No começo isso me incomodou, porque o projeto tinha virado algo menos interessante do que o planejado. Olhando hoje, o que ficou tem algumas decisões que não eram óbvias pra mim na época: o multi-tenant, o JWT em cookie httpOnly, a máquina de estados no agendamento.
O controle de acesso por perfil ficou só no frontend. O backend deixa qualquer usuário autenticado chamar qualquer rota.
Foi meu primeiro projeto com essa stack e com essa complexidade. Aprendi mais sobre como organizar um backend, modelar banco e conectar com o frontend do que em qualquer disciplina.