🚀 Initial commit - PDIMaker v1.0.0
Sistema completo de gestão de PDI com: - Autenticação com email/senha e Google OAuth - Workspaces privados isolados - Sistema de convites com código único - Interface profissional com Next.js 14 - Backend NestJS com PostgreSQL - Docker com Nginx e SSL Desenvolvido por Sergio Correa
This commit is contained in:
257
SISTEMA_AUTENTICACAO.md
Normal file
257
SISTEMA_AUTENTICACAO.md
Normal file
@@ -0,0 +1,257 @@
|
||||
# 🔐 Sistema de Autenticação e Workspaces - PDIMaker
|
||||
|
||||
## 📋 Visão Geral
|
||||
|
||||
Sistema completo de autenticação e gerenciamento de workspaces similar ao **mentorado.tech**, onde funcionários, gestores e RH compartilham um workspace privado e isolado.
|
||||
|
||||
---
|
||||
|
||||
## ✨ Funcionalidades Implementadas
|
||||
|
||||
### 1. **Autenticação com Google OAuth**
|
||||
- ✅ Login social com Google
|
||||
- ✅ Criação automática de usuário no primeiro login
|
||||
- ✅ Sessão JWT segura
|
||||
- ✅ Redirecionamento inteligente
|
||||
|
||||
### 2. **Sistema de Workspaces**
|
||||
- ✅ Workspaces privados (1 Funcionário + 1 Gestor + 1 RH opcional)
|
||||
- ✅ Slug único para cada workspace
|
||||
- ✅ Isolamento completo entre workspaces
|
||||
- ✅ Status de workspace (ACTIVE, PENDING_INVITE, ARCHIVED)
|
||||
|
||||
### 3. **Sistema de Convites**
|
||||
- ✅ Geração de código único (24 caracteres)
|
||||
- ✅ Convite por email
|
||||
- ✅ Expiração automática (7 dias)
|
||||
- ✅ Validação de acesso
|
||||
|
||||
### 4. **Fluxo de Onboarding**
|
||||
- ✅ Página inicial para novos usuários
|
||||
- ✅ Opção de aceitar convite
|
||||
- ✅ Opção de criar novo workspace
|
||||
- ✅ Redirecionamento automático
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Fluxo de Uso
|
||||
|
||||
### **Cenário 1: Criar Workspace como Gestor**
|
||||
|
||||
1. Gestor faz login → Vai para `/onboarding`
|
||||
2. Clica em "Criar Workspace"
|
||||
3. Seleciona "Gestor (Mentor)"
|
||||
4. Informa email do funcionário
|
||||
5. Sistema:
|
||||
- Cria o workspace
|
||||
- Gera código de convite
|
||||
- Exibe o código para compartilhar
|
||||
6. Gestor compartilha código com o funcionário
|
||||
|
||||
### **Cenário 2: Aceitar Convite como Funcionário**
|
||||
|
||||
1. Funcionário faz login → Vai para `/onboarding`
|
||||
2. Clica em "Tenho um código"
|
||||
3. Cola o código recebido
|
||||
4. Clica em "Aceitar Convite"
|
||||
5. Sistema:
|
||||
- Valida o código
|
||||
- Ativa o workspace
|
||||
- Redireciona para o workspace
|
||||
|
||||
---
|
||||
|
||||
## 📁 Estrutura de Arquivos Criados
|
||||
|
||||
```
|
||||
frontend/
|
||||
├── app/
|
||||
│ ├── page.tsx # Home (redireciona)
|
||||
│ ├── login/page.tsx # Página de login
|
||||
│ ├── dashboard/page.tsx # Dashboard principal
|
||||
│ ├── onboarding/page.tsx # Primeira vez do usuário
|
||||
│ ├── workspaces/page.tsx # Lista de workspaces
|
||||
│ ├── workspace/
|
||||
│ │ ├── create/page.tsx # Criar workspace
|
||||
│ │ └── [slug]/page.tsx # Workspace individual
|
||||
│ └── api/
|
||||
│ ├── workspaces/
|
||||
│ │ └── create/route.ts # API criar workspace
|
||||
│ └── invites/
|
||||
│ └── accept/route.ts # API aceitar convite
|
||||
│
|
||||
├── lib/
|
||||
│ ├── auth/
|
||||
│ │ └── config.ts # Configuração NextAuth
|
||||
│ ├── types/
|
||||
│ │ └── next-auth.d.ts # Tipos TypeScript
|
||||
│ └── utils/
|
||||
│ └── invite-code.ts # Geração de códigos
|
||||
│
|
||||
└── middleware.ts # Proteção de rotas
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ Banco de Dados
|
||||
|
||||
### **Tabelas Criadas:**
|
||||
|
||||
1. **`users`** - Usuários do sistema
|
||||
- id, email, name, avatar, role, googleId
|
||||
- createdAt, updatedAt, lastLoginAt
|
||||
|
||||
2. **`workspaces`** - Workspaces privados
|
||||
- id, slug, employeeId, managerId, hrId
|
||||
- status, config, createdAt, updatedAt
|
||||
|
||||
3. **`invites`** - Convites pendentes
|
||||
- id, email, role, token, invitedBy
|
||||
- workspaceId, status, expiresAt, acceptedAt
|
||||
|
||||
### **ENUMs:**
|
||||
- Role: EMPLOYEE, MANAGER, HR_ADMIN
|
||||
- WorkspaceStatus: ACTIVE, PENDING_INVITE, ARCHIVED
|
||||
- InviteStatus: PENDING, ACCEPTED, EXPIRED, CANCELLED
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Segurança
|
||||
|
||||
### **Middleware de Proteção**
|
||||
```typescript
|
||||
// Rotas públicas
|
||||
["/", "/login", "/about", "/api/auth"]
|
||||
|
||||
// Rotas protegidas
|
||||
Todas as outras (requerem autenticação)
|
||||
|
||||
// Verificação de workspace
|
||||
/workspace/[slug] - Valida se usuário tem acesso
|
||||
```
|
||||
|
||||
### **Validações**
|
||||
- ✅ Token JWT seguro
|
||||
- ✅ Verificação de email no convite
|
||||
- ✅ Expiração de convites (7 dias)
|
||||
- ✅ Status de convite (evita reuso)
|
||||
- ✅ Isolamento de workspaces
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Interface
|
||||
|
||||
### **Design Similar ao mentorado.tech:**
|
||||
- Background corporativo
|
||||
- Cards com glassmorphism
|
||||
- Código de convite destacado
|
||||
- Status visual (Mentor/Mentorado/RH)
|
||||
- Cores por role:
|
||||
- 🟣 Roxo: Funcionário/Mentorado
|
||||
- 🟢 Verde: Gestor/Mentor
|
||||
- 🟠 Laranja: RH
|
||||
|
||||
---
|
||||
|
||||
## 📝 Próximos Passos
|
||||
|
||||
### **Funcionalidades Adicionais:**
|
||||
|
||||
1. **Email de Convite**
|
||||
- Integrar SendGrid ou Resend
|
||||
- Template de email com código
|
||||
- Link direto para aceitar
|
||||
|
||||
2. **Dashboard do Workspace**
|
||||
- Diário de Atividades
|
||||
- Metas e PDI
|
||||
- Reuniões 1:1
|
||||
- Testes Vocacionais
|
||||
|
||||
3. **Permissões por Role**
|
||||
- Funcionário: visualizar, criar entradas
|
||||
- Gestor: visualizar tudo, dar feedback
|
||||
- RH: visualizar todos workspaces
|
||||
|
||||
4. **Notificações**
|
||||
- Novo feedback
|
||||
- Reunião agendada
|
||||
- Meta atualizada
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Como Testar
|
||||
|
||||
### **1. Configurar Google OAuth**
|
||||
|
||||
Adicione no `.env`:
|
||||
```bash
|
||||
GOOGLE_CLIENT_ID=seu_client_id
|
||||
GOOGLE_CLIENT_SECRET=seu_client_secret
|
||||
NEXTAUTH_SECRET=seu_secret_seguro
|
||||
NEXTAUTH_URL=https://pdimaker.com.br
|
||||
DATABASE_URL=postgresql://postgres:senha@postgres:5432/pdimaker_prod
|
||||
```
|
||||
|
||||
### **2. Acessar a Aplicação**
|
||||
|
||||
```bash
|
||||
# Acessar
|
||||
https://pdimaker.com.br
|
||||
|
||||
# Fluxo:
|
||||
1. Fazer login com Google
|
||||
2. Vai para /onboarding
|
||||
3. Escolher "Criar Workspace" ou "Tenho um código"
|
||||
4. Criar workspace ou aceitar convite
|
||||
5. Acessar workspace em /workspace/[slug]
|
||||
```
|
||||
|
||||
### **3. Testar Convite**
|
||||
|
||||
```bash
|
||||
# Usuário 1 (Gestor):
|
||||
1. Login → Criar Workspace → Informar email do funcionário
|
||||
2. Copiar código gerado: cmhrtjzk6001jox4z9dzb5al
|
||||
3. Compartilhar com funcionário
|
||||
|
||||
# Usuário 2 (Funcionário):
|
||||
1. Login → Tenho um código
|
||||
2. Colar código: cmhrtjzk6001jox4z9dzb5al
|
||||
3. Aceitar convite
|
||||
4. Workspace ativo!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### **Erro: "Convite não encontrado"**
|
||||
- Verificar se código está correto (24 caracteres)
|
||||
- Verificar se convite não expirou (7 dias)
|
||||
- Verificar no banco: `SELECT * FROM invites WHERE token = 'codigo';`
|
||||
|
||||
### **Erro: "Este convite não é para você"**
|
||||
- Email do usuário logado deve ser o mesmo do convite
|
||||
- Verificar: `SELECT email FROM invites WHERE token = 'codigo';`
|
||||
|
||||
### **Erro: Banco de dados**
|
||||
- Verificar conexão: `docker exec pdimaker-db pg_isready`
|
||||
- Verificar tabelas: `docker exec pdimaker-db psql -U postgres -d pdimaker_prod -c "\dt"`
|
||||
|
||||
---
|
||||
|
||||
## 📊 Estatísticas
|
||||
|
||||
- **Arquivos criados:** 15+
|
||||
- **Linhas de código:** ~2000
|
||||
- **Tabelas do banco:** 3 principais
|
||||
- **Rotas API:** 2 principais
|
||||
- **Páginas:** 6 principais
|
||||
|
||||
---
|
||||
|
||||
**Versão:** 1.0.0
|
||||
**Data:** 19 de Novembro de 2025
|
||||
**Status:** ✅ Pronto para uso
|
||||
|
||||
Reference in New Issue
Block a user