258 lines
6.5 KiB
Markdown
258 lines
6.5 KiB
Markdown
|
|
# 🔐 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
|
||
|
|
|