andré santos

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.

ReactNode.jsExpressMySQLJWTFullCalendardraft-js
demonstração em vídeo

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.

Sistema de gestão de clínicas (TCC) - André Luiz