fix: improve role assignment logic and permission handling in dashboard components
This commit is contained in:
121
packages/backend/CRIAR_ENV.bat
Normal file
121
packages/backend/CRIAR_ENV.bat
Normal 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
|
||||
|
||||
84
packages/backend/VARIAVEIS_AMBIENTE.md
Normal file
84
packages/backend/VARIAVEIS_AMBIENTE.md
Normal 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.
|
||||
|
||||
2
packages/backend/convex/_generated/api.d.ts
vendored
2
packages/backend/convex/_generated/api.d.ts
vendored
@@ -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;
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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" };
|
||||
},
|
||||
});
|
||||
|
||||
@@ -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(),
|
||||
|
||||
114
packages/backend/criar-env.ps1
Normal file
114
packages/backend/criar-env.ps1
Normal 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
18
packages/backend/env.txt
Normal 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
|
||||
# ══════════════════════════════════════════════════════════
|
||||
|
||||
Reference in New Issue
Block a user