Sistema completo de agendamento de consultas para psicóloga, desenvolvido em Next.js com integração ao Google Calendar e notificações WhatsApp.
- Funcionalidades:
- Exibe informações gerais sobre a psicóloga (Dra. Jandira Frederick).
- Apresenta os serviços oferecidos.
- Inclui uma seção de Perguntas Frequentes (FAQ).
- Fornece informações de contato (telefone, e-mail, endereço).
- Possui um botão "Agendar Consulta" que abre o formulário em um modal.
- Contém um link "Entrar" para a página de login.
- Status: ✅ CONCLUÍDO
- Funcionalidades:
- Permite ao usuário selecionar uma data e hora disponíveis para a consulta.
- Coleta informações essenciais do paciente (nome completo, e-mail, telefone, CPF e motivo da consulta).
- Validação de dados em tempo real (e-mail, telefone, CPF).
- Tratamento de conflito de horários (se o slot for ocupado no último segundo).
- Redirecionamento para o Painel do Paciente após agendamento bem-sucedido.
- Envio de e-mail de confirmação para paciente e administrador.
- Para novos usuários, envia e-mail de boas-vindas com link para definir senha.
- Status: ✅ CONCLUÍDO
- Funcionalidades:
- Permite login via credenciais (e-mail e senha) e Google.
- Redirecionamento baseado na
roledo usuário (ADMIN para/admin, PACIENTE para/portal/paciente). - Mensagens de erro claras para credenciais inválidas ou e-mail não reconhecido.
- Link para "Esqueci minha senha" (com fluxo de redefinição seguro).
- Link para "Registre-se" (direciona para o fluxo de agendamento/cadastro).
- Status: ✅ CONCLUÍDO
- Funcionalidades:
- Dashboard de Boas-Vindas: Mensagem personalizada e destaque para a próxima consulta.
- Listagem de Agendamentos: Seções para "Próximas Consultas" (com opção de confirmar/cancelar) e "Histórico de Consultas".
- Minhas Recomendações: Aba para visualizar recomendações da psicóloga para consultas passadas.
- Gerenciamento de Perfil: Permite ao paciente atualizar suas informações (nome, CPF, foto).
- Botão para agendar uma nova consulta.
- Botão para sair da sessão (Logout).
- Status: ✅ CONCLUÍDO
- Funcionalidades:
- Gerenciar Agendamentos: Visualiza lista de todos os agendamentos com filtros por status (Pendente, Confirmado, Cancelado, Pré-agendado, Realizado) e por período (dia, semana, mês). Permite atualizar status e cancelar/deletar agendamentos.
- Gerenciar Disponibilidade: Permite selecionar dias no calendário, gerar horários agendáveis em lote, remover horários específicos e bloquear dias/períodos inteiros (férias, feriados).
- Gerenciar Pacientes: Acesso a uma página dedicada para listar pacientes, visualizar detalhes (incluindo prontuário) e editar o prontuário. Permite adicionar recomendações a agendamentos específicos.
- Gerenciar Usuários Admin: Permite adicionar, editar e excluir usuários com a
roleADMIN.
- Status: ✅ CONCLUÍDO
- Bloqueio de Horários na UI: Horários já agendados (
isBooked: true) são visualmente desabilitados no calendário de agendamento. - Notificações Transacionais (E-mail):
- Confirmação de Pré-Agendamento: Envio automático de e-mail para paciente e administrador.
- Notificação de Cancelamento: Envio automático de e-mail para paciente e administrador.
- Fluxo de Senha para Novo Usuário: Novos usuários recebem um link por e-mail para definir sua senha após o primeiro agendamento.
- Segurança do Fluxo "Esqueci a Senha": Implementação de geração e validação de tokens seguros com expiração.
- Feedback Visual em Transições: Botões de submissão ficam desabilitados e exibem texto de carregamento durante operações de rede.
- Rate Limiting (Middleware): Implementado um middleware básico para limitar requisições por IP nas rotas de API.
- Status: ✅ CONCLUÍDO (com ressalvas para produção no Rate Limiting e gatilhos de lembretes).
- Frontend: Next.js 14, React, TypeScript
- Styling: Tailwind CSS
- Validação: React Hook Form + Zod
- Ícones: Lucide React, React Icons
- Banco de Dados: Prisma (SQLite)
- Autenticação: NextAuth.js
- E-mail: Nodemailer
- Utilitários de Data: date-fns
- Deployment: Vercel (recomendado)
- Node.js 18+
- Conta Google Cloud Platform (para Google Auth e Google Calendar, se for integrar)
- Conta Twilio (para WhatsApp, se for integrar)
git clone <repository-url>
cd psicologa-agendamentonpm installcp .env.example .env.localEdite o arquivo .env.local com suas credenciais:
NEXTAUTH_URL: URL base da sua aplicação (ex:http://localhost:3000em desenvolvimento, ou sua URL de produção).NEXTAUTH_SECRET: Uma string longa e aleatória para assinar tokens JWT. Pode ser gerada comopenssl rand -base64 32.
- Acesse o Google Cloud Console
- Crie um novo projeto ou selecione um existente.
- Vá para "APIs e Serviços" > "Credenciais".
- Crie credenciais de "ID do cliente OAuth" para "Aplicativo da Web".
- Adicione
http://localhost:3000/api/auth/callback/google(e sua URL de produção) como "URIs de redirecionamento autorizados". - Obtenha seu Client ID e Client Secret.
Adicione as seguintes variáveis ao seu arquivo .env.local:
GOOGLE_CLIENT_ID: Seu Client ID do Google OAuth.GOOGLE_CLIENT_SECRET: Seu Client Secret do Google OAuth.
Para o envio de e-mails de confirmação e redefinição de senha, configure as seguintes variáveis:
EMAIL_SERVER_HOST: Host do servidor SMTP (ex:smtp.seudominio.comousmtp.gmail.com).EMAIL_SERVER_PORT: Porta do servidor SMTP (ex:587para TLS,465para SSL).EMAIL_SERVER_USER: Usuário do e-mail (geralmente o endereço de e-mail).EMAIL_SERVER_PASSWORD: Senha do e-mail.EMAIL_FROM: Endereço de e-mail do remetente (ex:"Dra. Jandira Frederick" <[email protected]>).ADMIN_EMAIL: O e-mail do administrador para receber notificações (ex:[email protected]).
DATABASE_URL: URL de conexão com o banco de dados. Para SQLite local, mantenhafile:./dev.db.
Após configurar o .env.local, aplique as migrações do banco de dados:
npx prisma migrate devSiga as instruções no terminal para nomear a migração.
npm run devAcesse http://localhost:3000
- Acesse a página inicial (
/). - Clique em "Agendar Consulta" para abrir o formulário.
- Selecione a data e horário disponível. Horários já agendados estarão desabilitados.
- Preencha seus dados (nome, e-mail, telefone, CPF, motivo da consulta).
- Confirme o agendamento.
- Se for um novo usuário, você receberá um e-mail com um link para definir sua senha e acessar o portal.
- Acesse o Portal do Paciente (
/portal/paciente) para ver seus agendamentos, recomendações e gerenciar seu perfil.
- Acesse a página de login (
/auth/signin). - Faça login com uma conta de administrador.
- Você será redirecionado para o Painel Administrativo (
/admin). - Gerencie agendamentos, disponibilidade, pacientes e outros usuários administradores através do menu lateral.
- ✅ Autenticação Segura: Utiliza NextAuth.js com suporte a credenciais e Google OAuth.
- ✅ Autorização Baseada em Role: Acesso restrito a áreas administrativas e de paciente com base na
roledo usuário. - ✅ Fluxo de Senha Seguro: Implementado fluxo de redefinição de senha com tokens temporários e criptografia de senhas (bcrypt).
- ✅ Validação de Entrada de Dados: Zod e React Hook Form garantem a validação robusta dos dados de formulário.
- ✅ Proteção contra Conflitos: O sistema verifica a disponibilidade de horários no último segundo para evitar agendamentos duplicados.
- ✅ Rate Limiting: Um middleware básico foi implementado para limitar o número de requisições às APIs por IP, ajudando a prevenir ataques de força bruta e spam.
O middleware de Rate Limiting implementado em src/middleware.ts utiliza um Map em memória para armazenar o contador de requisições por IP. Esta abordagem é adequada apenas para ambientes de desenvolvimento e testes.
Para implantação em produção, é CRÍTICO substituir o Map em memória por uma solução de cache distribuído (como Redis, Upstash, ou um serviço de rate limiting oferecido pela sua plataforma de hospedagem como a Vercel).
Sem um cache distribuído, o rate limiting não funcionará corretamente em ambientes com múltiplas instâncias do servidor (o que é comum em produção para escalabilidade), e os limites seriam redefinidos a cada reinício do servidor.
src/
├── app/
│ ├── api/ # Rotas de API (admin, agendamentos, auth, portal, bookable-slots, horarios-bloqueados)
│ ├── admin/ # Páginas e layout do painel administrativo
│ ├── auth/ # Páginas de autenticação (login, forgot-password, reset-password)
│ ├── portal/ # Páginas e layout do portal do paciente
│ ├── favicon.ico
│ ├── globals.css
│ ├── layout.tsx # Layout principal da aplicação
│ └── page.tsx # Página inicial (Home Page)
├── components/ # Componentes reutilizáveis (formulários, botões, etc.)
│ ├── AgendamentoFormMelhorado.tsx
│ ├── AdminBookableSlotManager.tsx
│ ├── AdminUserManagement.tsx
│ ├── BookableSlotPicker.tsx
│ ├── ForgotPasswordForm.tsx
│ ├── LoginForm.tsx
│ ├── ResetPasswordForm.tsx
│ ├── SignInButtons.tsx
│ └── ... (outros componentes)
├── lib/ # Funções utilitárias e configurações
│ ├── auth.ts # Configuração do NextAuth.js
│ ├── email.ts # Serviço de envio de e-mails
│ ├── prisma.ts # Cliente Prisma
│ ├── utils.ts # Funções utilitárias (ex: validação de CPF)
│ └── ...
├── prisma/ # Esquema do banco de dados e migrações
│ └── schema.prisma
├── public/ # Arquivos estáticos
├── middleware.ts # Middleware de Rate Limiting
└── ...
Para dúvidas sobre configuração ou personalização:
- Consulte a documentação das APIs e bibliotecas utilizadas.
- Verifique os logs de erro no console do navegador e no terminal do servidor.
Este projeto é proprietário e destinado ao uso específico da Dra. Jandira Frederick.
Desenvolvido com ❤️ para facilitar o acesso à saúde mental