fix: improve role assignment logic and permission handling in dashboard components

This commit is contained in:
2025-10-27 08:41:53 -03:00
parent 2c2b792b4a
commit 6bfc0c2ced
19 changed files with 2105 additions and 118 deletions

View File

@@ -0,0 +1,121 @@
@echo off
chcp 65001 >nul
echo.
echo ═══════════════════════════════════════════════════════════
echo 🔐 CRIAR ARQUIVO .env - SGSE (Convex Local)
echo ═══════════════════════════════════════════════════════════
echo.
echo [1/4] Verificando se .env já existe...
if exist .env (
echo.
echo ⚠️ ATENÇÃO: Arquivo .env já existe!
echo.
echo Deseja sobrescrever? (S/N^)
set /p resposta="> "
if /i not "%resposta%"=="S" (
echo.
echo ❌ Operação cancelada. Arquivo .env mantido.
pause
exit /b
)
)
echo.
echo [2/4] Criando arquivo .env...
(
echo # ══════════════════════════════════════════════════════════
echo # CONFIGURAÇÃO DE AMBIENTE - SGSE
echo # Gerado automaticamente em: %date% %time%
echo # ══════════════════════════════════════════════════════════
echo.
echo # Segurança Better Auth
echo # Secret para criptografia de tokens de autenticação
echo BETTER_AUTH_SECRET=+Nfg4jTxPv1giF5MlmyYTxpU/VkS3QaDOvgSWd+QmbY=
echo.
echo # URL da aplicação
echo # Desenvolvimento: http://localhost:5173
echo # Produção: https://sgse.pe.gov.br ^(alterar quando for para produção^)
echo SITE_URL=http://localhost:5173
echo.
echo # ══════════════════════════════════════════════════════════
echo # IMPORTANTE - SEGURANÇA
echo # ══════════════════════════════════════════════════════════
echo # 1. Este arquivo NÃO deve ser commitado no Git
echo # 2. Antes de ir para produção, gere um NOVO secret
echo # 3. Em produção, altere SITE_URL para a URL real
echo # ══════════════════════════════════════════════════════════
) > .env
if not exist .env (
echo.
echo ❌ ERRO: Falha ao criar arquivo .env
echo.
pause
exit /b 1
)
echo ✅ Arquivo .env criado com sucesso!
echo.
echo [3/4] Verificando .gitignore...
if not exist .gitignore (
echo # Arquivos de ambiente > .gitignore
echo .env >> .gitignore
echo .env.local >> .gitignore
echo .env.*.local >> .gitignore
echo ✅ .gitignore criado
) else (
findstr /C:".env" .gitignore >nul
if errorlevel 1 (
echo .env >> .gitignore
echo .env.local >> .gitignore
echo .env.*.local >> .gitignore
echo ✅ .env adicionado ao .gitignore
) else (
echo ✅ .env já está no .gitignore
)
)
echo.
echo [4/4] Resumo da configuração:
echo.
echo ┌─────────────────────────────────────────────────────────┐
echo │ ✅ Arquivo criado: packages/backend/.env │
echo │ │
echo │ Variáveis configuradas: │
echo │ • BETTER_AUTH_SECRET: Configurado │
echo │ • SITE_URL: http://localhost:5173 │
echo └─────────────────────────────────────────────────────────┘
echo.
echo ═══════════════════════════════════════════════════════════
echo 📋 PRÓXIMOS PASSOS
echo ═══════════════════════════════════════════════════════════
echo.
echo 1. Reinicie o servidor Convex:
echo ^> cd packages\backend
echo ^> bunx convex dev
echo.
echo 2. Reinicie o servidor Web (em outro terminal^):
echo ^> cd apps\web
echo ^> bun run dev
echo.
echo 3. Verifique que as mensagens de erro pararam
echo.
echo ═══════════════════════════════════════════════════════════
echo ⚠️ LEMBRE-SE
echo ═══════════════════════════════════════════════════════════
echo.
echo • NÃO commite o arquivo .env no Git
echo • Gere um NOVO secret antes de ir para produção
echo • Altere SITE_URL quando for para produção
echo.
pause

View File

@@ -0,0 +1,84 @@
# 🔐 Guia de Variáveis de Ambiente - Backend Convex
## 📋 Variáveis Obrigatórias
### 1. BETTER_AUTH_SECRET
**Status:** 🔴 **OBRIGATÓRIO em Produção**
**Descrição:** Chave secreta para criptografia de tokens de autenticação
**Como gerar:**
```powershell
# Windows PowerShell
[Convert]::ToBase64String([System.Security.Cryptography.RandomNumberGenerator]::GetBytes(32))
```
```bash
# Linux/Mac
openssl rand -base64 32
```
**Onde configurar:** Convex Dashboard > Settings > Environment Variables
---
### 2. SITE_URL
**Status:** 🔴 **OBRIGATÓRIO**
**Descrição:** URL base da aplicação
**Valores:**
- Desenvolvimento: `http://localhost:5173`
- Produção: `https://sgse.pe.gov.br` (substitua pela URL real)
**Onde configurar:** Convex Dashboard > Settings > Environment Variables
---
## ⚙️ Como as variáveis são usadas
Estas variáveis são carregadas em `packages/backend/convex/auth.ts`:
```typescript
// Fallback para desenvolvimento local
const siteUrl = process.env.SITE_URL || process.env.CONVEX_SITE_URL || "http://localhost:5173";
const authSecret = process.env.BETTER_AUTH_SECRET;
```
### Comportamento:
1. **`siteUrl`:**
- Primeiro tenta usar `SITE_URL`
- Se não existir, tenta `CONVEX_SITE_URL`
- Se nenhum estiver configurado, usa `http://localhost:5173` (apenas para desenvolvimento)
2. **`authSecret`:**
- Usa `BETTER_AUTH_SECRET` se configurado
- Se não configurado, Better Auth usará um secret padrão (⚠️ INSEGURO em produção!)
---
## ✅ Checklist de Configuração
### Desenvolvimento Local
- [ ] Sistema funciona sem configurar (usa valores padrão)
- [ ] Mensagens de aviso são esperadas e podem ser ignoradas
### Produção
- [ ] `BETTER_AUTH_SECRET` configurado no Convex Dashboard
- [ ] `SITE_URL` configurado no Convex Dashboard
- [ ] Secret gerado usando método seguro
- [ ] URL de produção está correta
- [ ] Mensagens de erro não aparecem mais
---
## 📖 Mais Informações
Consulte o arquivo `CONFIGURACAO_PRODUCAO.md` na raiz do projeto para instruções detalhadas.

View File

@@ -19,7 +19,6 @@ import type * as dashboard from "../dashboard.js";
import type * as funcionarios from "../funcionarios.js";
import type * as healthCheck from "../healthCheck.js";
import type * as http from "../http.js";
import type * as inicializarPermissoes from "../inicializarPermissoes.js";
import type * as logsAcesso from "../logsAcesso.js";
import type * as menuPermissoes from "../menuPermissoes.js";
import type * as monitoramento from "../monitoramento.js";
@@ -56,7 +55,6 @@ declare const fullApi: ApiFromModules<{
funcionarios: typeof funcionarios;
healthCheck: typeof healthCheck;
http: typeof http;
inicializarPermissoes: typeof inicializarPermissoes;
logsAcesso: typeof logsAcesso;
menuPermissoes: typeof menuPermissoes;
monitoramento: typeof monitoramento;

View File

@@ -6,7 +6,9 @@ import { query } from "./_generated/server";
import { betterAuth } from "better-auth";
import schema from "./betterAuth/schema";
const siteUrl = process.env.SITE_URL!;
// Configurações de ambiente para produção
const siteUrl = process.env.SITE_URL || process.env.CONVEX_SITE_URL || "http://localhost:5173";
const authSecret = process.env.BETTER_AUTH_SECRET;
// The component client has methods needed for integrating Convex with Better Auth,
// as well as helper methods for general use.
@@ -21,6 +23,8 @@ export const createAuth = (
{ optionsOnly } = { optionsOnly: false }
) => {
return betterAuth({
// Secret para criptografia de tokens - OBRIGATÓRIO em produção
secret: authSecret,
// disable logging when createAuth is called just to generate options.
// this is not required, but there's a lot of noise in logs without it.
logger: {

View File

@@ -1,76 +0,0 @@
/**
* Script para inicializar permissões de menu no sistema
*/
import { mutation } from "./_generated/server";
export const inicializarTodasPermissoes = mutation({
args: {},
handler: async (ctx) => {
console.log("🔐 Inicializando permissões de menu...");
// Buscar roles
const roles = await ctx.db.query("roles").collect();
const admin = roles.find((r) => r.nome === "admin");
const ti = roles.find((r) => r.nome === "ti");
const usuarioAvancado = roles.find((r) => r.nome === "usuario_avancado");
const usuario = roles.find((r) => r.nome === "usuario");
if (!admin || !ti || !usuarioAvancado || !usuario) {
throw new Error("Roles não encontradas");
}
// Menus do sistema
const menus = [
"/recursos-humanos",
"/recursos-humanos/funcionarios",
"/recursos-humanos/simbolos",
"/financeiro",
"/controladoria",
"/licitacoes",
"/compras",
"/juridico",
"/comunicacao",
"/programas-esportivos",
"/secretaria-executiva",
"/gestao-pessoas",
"/ti",
];
let contador = 0;
// Admin e TI: acesso total é automático no código, não precisa criar permissões
// Eles são filtrados no verificarAcesso (nivel <= 1)
// Usuario Avançado: SEM acesso por padrão (TI define depois)
for (const menu of menus) {
await ctx.db.insert("menuPermissoes", {
roleId: usuarioAvancado._id,
menuPath: menu,
podeAcessar: false,
podeConsultar: false,
podeGravar: false,
});
contador++;
}
console.log(`${contador} permissões criadas para usuario_avancado`);
// Usuario: SEM acesso por padrão (TI define depois)
contador = 0;
for (const menu of menus) {
await ctx.db.insert("menuPermissoes", {
roleId: usuario._id,
menuPath: menu,
podeAcessar: false,
podeConsultar: false,
podeGravar: false,
});
contador++;
}
console.log(`${contador} permissões criadas para usuario`);
console.log("✅ Permissões inicializadas com sucesso!");
return { success: true, message: "Permissões inicializadas" };
},
});

View File

@@ -9,6 +9,7 @@ export const listar = query({
returns: v.array(
v.object({
_id: v.id("roles"),
_creationTime: v.number(),
nome: v.string(),
descricao: v.string(),
nivel: v.number(),

View File

@@ -0,0 +1,114 @@
# Script para criar arquivo .env
# Usar: .\criar-env.ps1
Write-Host ""
Write-Host "════════════════════════════════════════════════════════════" -ForegroundColor Cyan
Write-Host " 🔐 CRIAR ARQUIVO .env - SGSE (Convex Local)" -ForegroundColor Cyan
Write-Host "════════════════════════════════════════════════════════════" -ForegroundColor Cyan
Write-Host ""
# Verificar se .env já existe
if (Test-Path ".env") {
Write-Host "⚠️ ATENÇÃO: Arquivo .env já existe!" -ForegroundColor Yellow
Write-Host ""
$resposta = Read-Host "Deseja sobrescrever? (S/N)"
if ($resposta -ne "S" -and $resposta -ne "s") {
Write-Host ""
Write-Host "❌ Operação cancelada. Arquivo .env mantido." -ForegroundColor Red
Write-Host ""
pause
exit
}
}
Write-Host ""
Write-Host "[1/3] Criando arquivo .env..." -ForegroundColor Yellow
$conteudo = @"
#
# CONFIGURAÇÃO DE AMBIENTE - SGSE
#
# Segurança Better Auth
BETTER_AUTH_SECRET=+Nfg4jTxPv1giF5MlmyYTxpU/VkS3QaDOvgSWd+QmbY=
# URL da aplicação
SITE_URL=http://localhost:5173
#
# IMPORTANTE - SEGURANÇA
#
# 1. Este arquivo NÃO deve ser commitado no Git
# 2. Antes de ir para produção, gere um NOVO secret
# 3. Em produção, altere SITE_URL para a URL real
#
"@
try {
$conteudo | Out-File -FilePath ".env" -Encoding UTF8 -NoNewline
Write-Host "✅ Arquivo .env criado com sucesso!" -ForegroundColor Green
} catch {
Write-Host "❌ ERRO ao criar arquivo .env: $_" -ForegroundColor Red
pause
exit 1
}
Write-Host ""
Write-Host "[2/3] Verificando .gitignore..." -ForegroundColor Yellow
if (Test-Path ".gitignore") {
$gitignoreContent = Get-Content ".gitignore" -Raw
if ($gitignoreContent -notmatch "\.env") {
Add-Content -Path ".gitignore" -Value "`n.env`n.env.local`n.env.*.local"
Write-Host "✅ .env adicionado ao .gitignore" -ForegroundColor Green
} else {
Write-Host "✅ .env já está no .gitignore" -ForegroundColor Green
}
} else {
@"
.env
.env.local
.env.*.local
"@ | Out-File -FilePath ".gitignore" -Encoding UTF8
Write-Host "✅ .gitignore criado" -ForegroundColor Green
}
Write-Host ""
Write-Host "[3/3] Resumo da configuração:" -ForegroundColor Yellow
Write-Host ""
Write-Host "┌─────────────────────────────────────────────────────────┐" -ForegroundColor Cyan
Write-Host "│ ✅ Arquivo criado: packages/backend/.env │" -ForegroundColor Cyan
Write-Host "│ │" -ForegroundColor Cyan
Write-Host "│ Variáveis configuradas: │" -ForegroundColor Cyan
Write-Host "│ • BETTER_AUTH_SECRET: Configurado ✅ │" -ForegroundColor Cyan
Write-Host "│ • SITE_URL: http://localhost:5173 ✅ │" -ForegroundColor Cyan
Write-Host "└─────────────────────────────────────────────────────────┘" -ForegroundColor Cyan
Write-Host ""
Write-Host "════════════════════════════════════════════════════════════" -ForegroundColor Cyan
Write-Host " 📋 PRÓXIMOS PASSOS" -ForegroundColor Cyan
Write-Host "════════════════════════════════════════════════════════════" -ForegroundColor Cyan
Write-Host ""
Write-Host "1. Reinicie o servidor Convex:" -ForegroundColor White
Write-Host " > bunx convex dev" -ForegroundColor Gray
Write-Host ""
Write-Host "2. Reinicie o servidor Web (em outro terminal):" -ForegroundColor White
Write-Host " > cd ..\..\apps\web" -ForegroundColor Gray
Write-Host " > bun run dev" -ForegroundColor Gray
Write-Host ""
Write-Host "3. Verifique que as mensagens de erro pararam ✅" -ForegroundColor White
Write-Host ""
Write-Host "════════════════════════════════════════════════════════════" -ForegroundColor Cyan
Write-Host " ⚠️ LEMBRE-SE" -ForegroundColor Cyan
Write-Host "════════════════════════════════════════════════════════════" -ForegroundColor Cyan
Write-Host ""
Write-Host "• NÃO commite o arquivo .env no Git" -ForegroundColor Yellow
Write-Host "• Gere um NOVO secret antes de ir para produção" -ForegroundColor Yellow
Write-Host "• Altere SITE_URL quando for para produção" -ForegroundColor Yellow
Write-Host ""
Write-Host "Pressione qualquer tecla para continuar..." -ForegroundColor Gray
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

18
packages/backend/env.txt Normal file
View File

@@ -0,0 +1,18 @@
# ══════════════════════════════════════════════════════════
# CONFIGURAÇÃO DE AMBIENTE - SGSE
# ══════════════════════════════════════════════════════════
# Segurança Better Auth
BETTER_AUTH_SECRET=+Nfg4jTxPv1giF5MlmyYTxpU/VkS3QaDOvgSWd+QmbY=
# URL da aplicação
SITE_URL=http://localhost:5173
# ══════════════════════════════════════════════════════════
# IMPORTANTE - SEGURANÇA
# ══════════════════════════════════════════════════════════
# 1. Este arquivo NÃO deve ser commitado no Git
# 2. Antes de ir para produção, gere um NOVO secret
# 3. Em produção, altere SITE_URL para a URL real
# ══════════════════════════════════════════════════════════