707 lines
22 KiB
Markdown
707 lines
22 KiB
Markdown
# SteelBook - Arquitetura Técnica Completa
|
||
|
||
## 📋 Índice
|
||
1. [Visão Geral](#visão-geral)
|
||
2. [Arquitetura do Sistema](#arquitetura-do-sistema)
|
||
3. [Banco de Dados](#banco-de-dados)
|
||
4. [Fluxo de Dados](#fluxo-de-dados)
|
||
5. [Componentes Principais](#componentes-principais)
|
||
6. [Autenticação e Segurança](#autenticação-e-segurança)
|
||
|
||
---
|
||
|
||
## Visão Geral
|
||
|
||
**SteelBook** é uma aplicação web moderna para gerenciamento de Databooks técnicos. Permite criar, organizar e gerar documentação completa com suporte a múltiplos formatos, categorização inteligente e integração com IA.
|
||
|
||
**Stack Tecnológico:**
|
||
- **Frontend:** React 18 + TypeScript + Vite
|
||
- **Styling:** Tailwind CSS
|
||
- **Backend:** Supabase (PostgreSQL + Auth)
|
||
- **State Management:** TanStack Query (React Query)
|
||
- **UI Components:** Lucide Icons
|
||
|
||
---
|
||
|
||
## Arquitetura do Sistema
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ FRONTEND (React) │
|
||
│ ┌──────────────────────────────────────────────────────┐ │
|
||
│ │ Pages: Dashboard, DatabookView, Templates, etc. │ │
|
||
│ │ Components: Modal, Button, Input, LoadingSpinner │ │
|
||
│ │ Hooks: useQuery, useMutation (TanStack Query) │ │
|
||
│ └──────────────────────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ SUPABASE (Backend) │
|
||
│ ┌──────────────────────────────────────────────────────┐ │
|
||
│ │ PostgreSQL Database │ │
|
||
│ │ - Tabelas de Dados │ │
|
||
│ │ - Row Level Security (RLS) │ │
|
||
│ │ - Triggers e Functions │ │
|
||
│ └──────────────────────────────────────────────────────┘ │
|
||
│ ┌──────────────────────────────────────────────────────┐ │
|
||
│ │ Authentication (JWT) │ │
|
||
│ │ - Email/Password │ │
|
||
│ │ - Session Management │ │
|
||
│ └──────────────────────────────────────────────────────┘ │
|
||
│ ┌──────────────────────────────────────────────────────┐ │
|
||
│ │ Storage (Bucket) │ │
|
||
│ │ - Documentos (PDF, Imagens) │ │
|
||
│ │ - Logos e Marca d'água │ │
|
||
│ └──────────────────────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## Banco de Dados
|
||
|
||
### Tabelas Principais
|
||
|
||
#### 1. **usuarios**
|
||
Gerencia usuários do sistema com diferentes perfis.
|
||
|
||
```sql
|
||
CREATE TABLE usuarios (
|
||
id UUID PRIMARY KEY,
|
||
email VARCHAR(255) UNIQUE NOT NULL,
|
||
nome_completo VARCHAR(255) NOT NULL,
|
||
perfil VARCHAR(50) -- 'admin', 'gerente_qualidade', 'engenheiro', 'cliente'
|
||
ativo BOOLEAN DEFAULT TRUE,
|
||
created_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
**Perfis:**
|
||
- `admin`: Acesso total ao sistema
|
||
- `gerente_qualidade`: Gerencia qualidade e aprovações
|
||
- `engenheiro`: Cria e edita databooks
|
||
- `cliente`: Visualiza apenas seus projetos
|
||
|
||
---
|
||
|
||
#### 2. **clientes**
|
||
Informações dos clientes/empresas.
|
||
|
||
```sql
|
||
CREATE TABLE clientes (
|
||
id UUID PRIMARY KEY,
|
||
nome VARCHAR(255) NOT NULL,
|
||
contato VARCHAR(255),
|
||
email VARCHAR(255),
|
||
telefone VARCHAR(20),
|
||
ativo BOOLEAN DEFAULT TRUE,
|
||
created_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
#### 3. **templates_topicos**
|
||
Tópicos padrão que compõem um databook.
|
||
|
||
```sql
|
||
CREATE TABLE templates_topicos (
|
||
id UUID PRIMARY KEY,
|
||
numero_topico VARCHAR(20) NOT NULL, -- Ex: "1", "1.1", "2.3"
|
||
titulo VARCHAR(255) NOT NULL,
|
||
descricao TEXT,
|
||
obrigatorio BOOLEAN DEFAULT FALSE,
|
||
ordem INTEGER,
|
||
tipo_documentos TEXT[], -- ['pdf', 'jpg', 'png']
|
||
tags_padrao TEXT[],
|
||
categoria VARCHAR(100), -- Referência à categoria
|
||
created_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
**Hierarquia de Tópicos:**
|
||
- Nível 1: `1`, `2`, `3` (tópicos principais)
|
||
- Nível 2: `1.1`, `1.2`, `2.1` (subtópicos)
|
||
- Nível 3: `1.1.1`, `1.1.2` (sub-subtópicos)
|
||
|
||
---
|
||
|
||
#### 4. **templates_customizados**
|
||
Templates personalizados criados a partir dos tópicos padrão.
|
||
|
||
```sql
|
||
CREATE TABLE templates_customizados (
|
||
id UUID PRIMARY KEY,
|
||
nome VARCHAR(255) UNIQUE NOT NULL,
|
||
tipo VARCHAR(50) -- 'novo' ou 'derivado'
|
||
template_pai_id UUID REFERENCES templates_customizados(id),
|
||
topicos_selecionados TEXT[], -- IDs dos tópicos
|
||
total_topicos INTEGER,
|
||
total_obrigatorios INTEGER,
|
||
descricao TEXT,
|
||
ativo BOOLEAN DEFAULT TRUE,
|
||
criado_por UUID REFERENCES usuarios(id),
|
||
created_at TIMESTAMP DEFAULT NOW(),
|
||
updated_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
#### 5. **projetos**
|
||
Projetos/Databooks em desenvolvimento.
|
||
|
||
```sql
|
||
CREATE TABLE projetos (
|
||
id UUID PRIMARY KEY,
|
||
numero_projeto VARCHAR(100) UNIQUE NOT NULL,
|
||
nome_projeto VARCHAR(255) NOT NULL,
|
||
cliente_id UUID REFERENCES clientes(id),
|
||
template_id UUID REFERENCES templates_customizados(id),
|
||
status VARCHAR(50) -- 'rascunho', 'em_andamento', 'revisao', 'finalizado'
|
||
progresso_percentual INTEGER DEFAULT 0, -- Calculado automaticamente
|
||
data_inicio DATE,
|
||
data_entrega_prevista DATE,
|
||
responsavel_id UUID REFERENCES usuarios(id),
|
||
created_at TIMESTAMP DEFAULT NOW(),
|
||
updated_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
**Status do Projeto:**
|
||
- `rascunho`: Criado mas não iniciado
|
||
- `em_andamento`: Documentos sendo adicionados
|
||
- `revisao`: Aguardando aprovação
|
||
- `finalizado`: Databook gerado e entregue
|
||
|
||
---
|
||
|
||
#### 6. **databooks_mestres**
|
||
Configurações e metadados do databook final.
|
||
|
||
```sql
|
||
CREATE TABLE databooks_mestres (
|
||
id UUID PRIMARY KEY,
|
||
projeto_id UUID NOT NULL REFERENCES projetos(id),
|
||
cliente_nome VARCHAR(255),
|
||
cliente_contato VARCHAR(255),
|
||
cliente_email VARCHAR(255),
|
||
cliente_telefone VARCHAR(20),
|
||
produto_nome VARCHAR(255) NOT NULL,
|
||
produto_tipo VARCHAR(100),
|
||
produto_descricao TEXT,
|
||
produto_normas TEXT[],
|
||
numero_projeto VARCHAR(100),
|
||
ordem_compra VARCHAR(100),
|
||
data_inicio DATE,
|
||
data_entrega_prevista DATE,
|
||
responsavel_id UUID,
|
||
revisao_numero VARCHAR(20) DEFAULT 'Rev. 0',
|
||
revisao_data TIMESTAMP DEFAULT NOW(),
|
||
revisao_autor_id UUID,
|
||
revisao_motivo TEXT,
|
||
logo_empresa_url TEXT,
|
||
logo_cliente_url TEXT,
|
||
marca_agua_url TEXT,
|
||
cor_primaria VARCHAR(7), -- Hex color
|
||
cor_secundaria VARCHAR(7),
|
||
titulo_principal VARCHAR(255),
|
||
subtitulo VARCHAR(255),
|
||
texto_rodape_capa TEXT,
|
||
tamanho_pagina VARCHAR(20) -- 'A4' ou 'Letter'
|
||
orientacao VARCHAR(20) -- 'retrato' ou 'paisagem'
|
||
margem_superior_mm NUMERIC(5,2) DEFAULT 20,
|
||
margem_lateral_mm NUMERIC(5,2) DEFAULT 20,
|
||
incluir_marca_agua BOOLEAN DEFAULT TRUE,
|
||
incluir_numero_pagina BOOLEAN DEFAULT TRUE,
|
||
created_at TIMESTAMP DEFAULT NOW(),
|
||
updated_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
#### 7. **secoes_databook**
|
||
Seções do databook (uma por tópico).
|
||
|
||
```sql
|
||
CREATE TABLE secoes_databook (
|
||
id UUID PRIMARY KEY,
|
||
projeto_id UUID NOT NULL REFERENCES projetos(id),
|
||
topico_id UUID REFERENCES templates_topicos(id),
|
||
numero_secao VARCHAR(20) NOT NULL, -- Ex: "1", "1.1"
|
||
titulo VARCHAR(255) NOT NULL,
|
||
ordem INTEGER,
|
||
status VARCHAR(50) -- 'completo', 'incompleto', 'nao_aplicavel'
|
||
total_documentos INTEGER DEFAULT 0,
|
||
created_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
#### 8. **documentos_auto_indexados**
|
||
Documentos carregados em cada seção.
|
||
|
||
```sql
|
||
CREATE TABLE documentos_auto_indexados (
|
||
id UUID PRIMARY KEY,
|
||
databook_id UUID NOT NULL REFERENCES projetos(id),
|
||
secao_id UUID REFERENCES secoes_databook(id),
|
||
secao_numero VARCHAR(20),
|
||
titulo VARCHAR(255) NOT NULL,
|
||
numero_documento VARCHAR(100),
|
||
revisao VARCHAR(20),
|
||
arquivo_url TEXT NOT NULL, -- URL do Supabase Storage
|
||
arquivo_tipo VARCHAR(50), -- 'pdf', 'jpg', 'png'
|
||
conteudo_texto TEXT, -- Texto extraído (OCR)
|
||
tags_automaticas TEXT[], -- Geradas por IA
|
||
tags_usuario TEXT[], -- Adicionadas manualmente
|
||
relevancia_score NUMERIC(3,2), -- 0.00 a 1.00
|
||
confianca_classificacao NUMERIC(3,2),
|
||
ordem_na_secao INTEGER,
|
||
data_documento DATE,
|
||
aprovado BOOLEAN DEFAULT FALSE,
|
||
processado_por_ia VARCHAR(50), -- 'openai', 'claude', etc
|
||
processado_em TIMESTAMP,
|
||
criado_em TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
#### 9. **categorias**
|
||
Categorias para organizar tópicos e documentos.
|
||
|
||
```sql
|
||
CREATE TABLE categorias (
|
||
id UUID PRIMARY KEY,
|
||
nome VARCHAR(100) UNIQUE NOT NULL,
|
||
descricao TEXT,
|
||
cor VARCHAR(7) DEFAULT '#3B82F6', -- Hex color
|
||
icone VARCHAR(50),
|
||
ativo BOOLEAN DEFAULT TRUE,
|
||
created_at TIMESTAMP DEFAULT NOW(),
|
||
updated_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
**Categorias Padrão:**
|
||
- Certificados (#10B981 - Verde)
|
||
- Desenhos (#3B82F6 - Azul)
|
||
- Relatórios (#F59E0B - Laranja)
|
||
- Procedimentos (#8B5CF6 - Roxo)
|
||
- Normas (#EF4444 - Vermelho)
|
||
|
||
---
|
||
|
||
#### 10. **configuracoes_pastas**
|
||
Mapeamento de pastas locais/nuvem para sincronização.
|
||
|
||
```sql
|
||
CREATE TABLE configuracoes_pastas (
|
||
id UUID PRIMARY KEY,
|
||
tipo_documento VARCHAR(100) NOT NULL,
|
||
caminho_local TEXT NOT NULL,
|
||
caminho_subtipo VARCHAR(100),
|
||
caminho_completo TEXT,
|
||
categoria_id UUID REFERENCES categorias(id),
|
||
habilitado BOOLEAN DEFAULT TRUE,
|
||
frequencia_atualizacao VARCHAR(50) -- 'manual', 'ao_criar', 'diario', 'semanal'
|
||
ultima_atualizacao TIMESTAMP,
|
||
incluir_subpastas BOOLEAN DEFAULT TRUE,
|
||
formatos_aceitos TEXT[],
|
||
tamanho_maximo_mb INTEGER DEFAULT 50,
|
||
tags_obrigatorias TEXT[],
|
||
palavras_chave_filtro TEXT[],
|
||
palavras_chave_excluir TEXT[],
|
||
ordem_docs VARCHAR(50) -- 'data', 'nome', 'relevancia'
|
||
criado_por UUID REFERENCES usuarios(id),
|
||
created_at TIMESTAMP DEFAULT NOW(),
|
||
updated_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
#### 11. **integracao_ia**
|
||
Configurações de provedores de IA.
|
||
|
||
```sql
|
||
CREATE TABLE integracao_ia (
|
||
id UUID PRIMARY KEY,
|
||
provider VARCHAR(50) -- 'openai', 'claude', 'gemini'
|
||
api_key_encriptada TEXT NOT NULL,
|
||
modelo_padrao VARCHAR(100),
|
||
maximo_tokens INTEGER DEFAULT 2000,
|
||
ativo BOOLEAN DEFAULT FALSE,
|
||
testado_em TIMESTAMP,
|
||
teste_status VARCHAR(50),
|
||
teste_mensagem TEXT,
|
||
criado_por UUID REFERENCES usuarios(id),
|
||
created_at TIMESTAMP DEFAULT NOW(),
|
||
updated_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
#### 12. **log_processamento_ia**
|
||
Histórico de processamentos com IA.
|
||
|
||
```sql
|
||
CREATE TABLE log_processamento_ia (
|
||
id UUID PRIMARY KEY,
|
||
databook_id UUID NOT NULL REFERENCES projetos(id),
|
||
inicio_processamento TIMESTAMP,
|
||
fim_processamento TIMESTAMP,
|
||
duracao_segundos INTEGER,
|
||
total_documentos_encontrados INTEGER,
|
||
total_documentos_indexados INTEGER,
|
||
total_erros INTEGER,
|
||
pastas_varridas TEXT[],
|
||
provider_ia VARCHAR(50),
|
||
modelo_usado VARCHAR(100),
|
||
tokens_utilizados INTEGER,
|
||
status VARCHAR(50) -- 'sucesso', 'parcial', 'erro'
|
||
mensagem_erro TEXT,
|
||
iniciado_por UUID REFERENCES usuarios(id),
|
||
created_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
#### 13. **permissoes_usuario_detalhadas**
|
||
Controle granular de permissões por usuário.
|
||
|
||
```sql
|
||
CREATE TABLE permissoes_usuario_detalhadas (
|
||
id UUID PRIMARY KEY,
|
||
usuario_id UUID NOT NULL REFERENCES usuarios(id),
|
||
pode_criar_template BOOLEAN DEFAULT FALSE,
|
||
pode_editar_template BOOLEAN DEFAULT FALSE,
|
||
pode_deletar_template BOOLEAN DEFAULT FALSE,
|
||
pode_criar_databook BOOLEAN DEFAULT FALSE,
|
||
pode_editar_databook BOOLEAN DEFAULT FALSE,
|
||
pode_deletar_databook BOOLEAN DEFAULT FALSE,
|
||
pode_upload_documentos BOOLEAN DEFAULT FALSE,
|
||
pode_aprovar_documentos BOOLEAN DEFAULT FALSE,
|
||
pode_gerar_pdf BOOLEAN DEFAULT FALSE,
|
||
pode_visualizar_preview BOOLEAN DEFAULT FALSE,
|
||
pode_acessar_logs BOOLEAN DEFAULT FALSE,
|
||
pode_configurar_ia BOOLEAN DEFAULT FALSE,
|
||
pode_configurar_pastas BOOLEAN DEFAULT FALSE,
|
||
pode_gerenciar_usuarios BOOLEAN DEFAULT FALSE,
|
||
acesso_apenas_seus_projetos BOOLEAN DEFAULT TRUE,
|
||
pode_visualizar_precos BOOLEAN DEFAULT FALSE,
|
||
created_at TIMESTAMP DEFAULT NOW(),
|
||
updated_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
### Relacionamentos Principais
|
||
|
||
```
|
||
usuarios
|
||
├─ 1:N → projetos (responsavel_id)
|
||
├─ 1:N → templates_customizados (criado_por)
|
||
├─ 1:N → configuracoes_pastas (criado_por)
|
||
├─ 1:N → integracao_ia (criado_por)
|
||
├─ 1:N → log_processamento_ia (iniciado_por)
|
||
└─ 1:1 → permissoes_usuario_detalhadas
|
||
|
||
clientes
|
||
└─ 1:N → projetos
|
||
|
||
templates_topicos
|
||
├─ 1:N → secoes_databook
|
||
└─ N:M → templates_customizados (via topicos_selecionados)
|
||
|
||
templates_customizados
|
||
├─ 1:N → projetos
|
||
└─ 0:1 → templates_customizados (template_pai_id - auto-referência)
|
||
|
||
projetos
|
||
├─ 1:1 → databooks_mestres
|
||
├─ 1:N → secoes_databook
|
||
├─ 1:N → documentos_auto_indexados
|
||
└─ 1:N → log_processamento_ia
|
||
|
||
secoes_databook
|
||
├─ 1:N → documentos_auto_indexados
|
||
└─ 0:1 → templates_topicos
|
||
|
||
categorias
|
||
├─ 1:N → templates_topicos
|
||
└─ 1:N → configuracoes_pastas
|
||
```
|
||
|
||
---
|
||
|
||
## Fluxo de Dados
|
||
|
||
### 1. Criação de um Novo Databook
|
||
|
||
```
|
||
1. Usuário clica "Novo Databook"
|
||
↓
|
||
2. Seleciona Cliente e Template
|
||
↓
|
||
3. Sistema cria registro em 'projetos'
|
||
↓
|
||
4. Sistema cria 'databooks_mestres' com configurações padrão
|
||
↓
|
||
5. Sistema cria 'secoes_databook' (uma por tópico do template)
|
||
↓
|
||
6. Databook pronto para receber documentos
|
||
```
|
||
|
||
### 2. Upload de Documentos
|
||
|
||
```
|
||
1. Usuário seleciona arquivo (PDF, JPG, PNG)
|
||
↓
|
||
2. Frontend valida tipo e tamanho
|
||
↓
|
||
3. Upload para Supabase Storage
|
||
↓
|
||
4. Sistema cria registro em 'documentos_auto_indexados'
|
||
↓
|
||
5. Se IA ativada: Processa com OCR/Análise
|
||
↓
|
||
6. Atualiza 'secoes_databook.total_documentos'
|
||
↓
|
||
7. Recalcula 'projetos.progresso_percentual'
|
||
```
|
||
|
||
### 3. Cálculo de Progresso
|
||
|
||
```
|
||
Progresso = (Seções com documentos / Total de tópicos) × 100
|
||
|
||
Exemplo:
|
||
- Total de tópicos: 28
|
||
- Seções com documentos: 7
|
||
- Progresso: (7/28) × 100 = 25%
|
||
```
|
||
|
||
### 4. Geração de PDF
|
||
|
||
```
|
||
1. Usuário clica "Gerar PDF"
|
||
↓
|
||
2. Sistema busca todos os dados do databook
|
||
↓
|
||
3. Renderiza preview com React
|
||
↓
|
||
4. Converte para PDF (html2pdf/jsPDF)
|
||
↓
|
||
5. Aplica marca d'água, numeração, cores
|
||
↓
|
||
6. Download automático
|
||
```
|
||
|
||
---
|
||
|
||
## Componentes Principais
|
||
|
||
### Frontend Structure
|
||
|
||
```
|
||
src/
|
||
├── pages/
|
||
│ ├── Dashboard.tsx # Visão geral de projetos
|
||
│ ├── DatabookView.tsx # Visualização do databook
|
||
│ ├── Templates.tsx # Gerenciamento de templates
|
||
│ ├── TopicosGestao.tsx # Gerenciamento de tópicos
|
||
│ ├── Configuracoes.tsx # Painel de configurações
|
||
│ └── Login.tsx # Autenticação
|
||
│
|
||
├── components/
|
||
│ ├── common/
|
||
│ │ ├── Button.tsx # Botão reutilizável
|
||
│ │ ├── Input.tsx # Input reutilizável
|
||
│ │ ├── Modal.tsx # Modal reutilizável
|
||
│ │ ├── LoadingSpinner.tsx # Spinner de carregamento
|
||
│ │ └── Navbar.tsx # Barra de navegação
|
||
│ │
|
||
│ ├── configuracoes/
|
||
│ │ ├── PastasTab.tsx # Mapeamento de pastas
|
||
│ │ ├── CategoriasTab.tsx # Gerenciamento de categorias
|
||
│ │ ├── UsuariosTab.tsx # Gerenciamento de usuários
|
||
│ │ ├── LogsTab.tsx # Visualização de logs
|
||
│ │ └── IATab.tsx # Configuração de IA
|
||
│ │
|
||
│ └── databook/
|
||
│ ├── DatabookPreview.tsx # Preview do databook
|
||
│ ├── DocumentUpload.tsx # Upload de documentos
|
||
│ └── SectionEditor.tsx # Editor de seções
|
||
│
|
||
├── lib/
|
||
│ ├── supabase.ts # Cliente Supabase
|
||
│ ├── mutations.ts # Funções de mutação
|
||
│ ├── toast.ts # Sistema de notificações
|
||
│ └── utils.ts # Funções utilitárias
|
||
│
|
||
└── types/
|
||
└── index.ts # Tipos TypeScript
|
||
```
|
||
|
||
---
|
||
|
||
## Autenticação e Segurança
|
||
|
||
### Fluxo de Autenticação
|
||
|
||
```
|
||
1. Usuário faz login com email/senha
|
||
↓
|
||
2. Supabase valida credenciais
|
||
↓
|
||
3. Retorna JWT token
|
||
↓
|
||
4. Token armazenado no localStorage
|
||
↓
|
||
5. Incluído em todas as requisições
|
||
↓
|
||
6. Supabase valida token em cada request
|
||
```
|
||
|
||
### Row Level Security (RLS)
|
||
|
||
Todas as tabelas têm RLS habilitado com políticas:
|
||
|
||
```sql
|
||
-- Exemplo: Usuários veem apenas seus próprios projetos
|
||
CREATE POLICY "Usuários veem seus projetos"
|
||
ON projetos FOR SELECT
|
||
USING (responsavel_id = auth.uid());
|
||
|
||
-- Exemplo: Apenas admins podem deletar
|
||
CREATE POLICY "Apenas admins deletam"
|
||
ON projetos FOR DELETE
|
||
USING (
|
||
EXISTS (
|
||
SELECT 1 FROM usuarios
|
||
WHERE id = auth.uid() AND perfil = 'admin'
|
||
)
|
||
);
|
||
```
|
||
|
||
### Segurança de Dados
|
||
|
||
- **Senhas:** Hash com bcrypt (Supabase Auth)
|
||
- **API Keys:** Encriptadas no banco
|
||
- **Tokens:** JWT com expiração
|
||
- **HTTPS:** Obrigatório em produção
|
||
- **CORS:** Configurado para domínios autorizados
|
||
|
||
---
|
||
|
||
## Queries Importantes
|
||
|
||
### Buscar Progresso de um Projeto
|
||
|
||
```sql
|
||
SELECT
|
||
p.id,
|
||
p.numero_projeto,
|
||
COUNT(DISTINCT CASE WHEN d.id IS NOT NULL THEN s.id END) as secoes_com_docs,
|
||
COUNT(DISTINCT t.id) as total_topicos,
|
||
ROUND(
|
||
(COUNT(DISTINCT CASE WHEN d.id IS NOT NULL THEN s.id END)::float /
|
||
COUNT(DISTINCT t.id)) * 100
|
||
) as progresso_percentual
|
||
FROM projetos p
|
||
LEFT JOIN secoes_databook s ON p.id = s.projeto_id
|
||
LEFT JOIN templates_topicos t ON s.topico_id = t.id
|
||
LEFT JOIN documentos_auto_indexados d ON s.id = d.secao_id
|
||
WHERE p.id = $1
|
||
GROUP BY p.id, p.numero_projeto;
|
||
```
|
||
|
||
### Buscar Documentos de uma Seção
|
||
|
||
```sql
|
||
SELECT
|
||
d.*,
|
||
c.nome as categoria_nome,
|
||
c.cor as categoria_cor
|
||
FROM documentos_auto_indexados d
|
||
LEFT JOIN categorias c ON d.secao_numero = c.nome
|
||
WHERE d.secao_id = $1
|
||
ORDER BY d.ordem_na_secao ASC;
|
||
```
|
||
|
||
### Buscar Tópicos com Cores de Categoria
|
||
|
||
```sql
|
||
SELECT
|
||
t.*,
|
||
c.cor as categoria_cor
|
||
FROM templates_topicos t
|
||
LEFT JOIN categorias c ON t.categoria = c.nome
|
||
WHERE t.id = ANY($1::uuid[])
|
||
ORDER BY t.ordem ASC;
|
||
```
|
||
|
||
---
|
||
|
||
## Variáveis de Ambiente
|
||
|
||
```env
|
||
VITE_SUPABASE_URL=https://seu-projeto.supabase.co
|
||
VITE_SUPABASE_ANON_KEY=sua-chave-anonima
|
||
VITE_API_URL=http://localhost:5173
|
||
```
|
||
|
||
---
|
||
|
||
## Deployment
|
||
|
||
### Produção
|
||
|
||
1. Build: `npm run build`
|
||
2. Deploy em Vercel/Netlify
|
||
3. Configurar variáveis de ambiente
|
||
4. Ativar HTTPS
|
||
5. Configurar CORS no Supabase
|
||
|
||
### Banco de Dados
|
||
|
||
1. Executar migrations em produção
|
||
2. Configurar backups automáticos
|
||
3. Monitorar performance
|
||
4. Manter índices atualizados
|
||
|
||
---
|
||
|
||
## Troubleshooting
|
||
|
||
### Erro 400 ao atualizar
|
||
|
||
- Verificar se coluna existe na tabela
|
||
- Validar tipos de dados
|
||
- Checar RLS policies
|
||
|
||
### Progresso não atualiza
|
||
|
||
- Verificar se documentos estão sendo salvos
|
||
- Checar se secoes_databook.total_documentos está sendo atualizado
|
||
- Recarregar página para forçar recálculo
|
||
|
||
### Upload falha
|
||
|
||
- Verificar tamanho do arquivo
|
||
- Checar permissões do bucket
|
||
- Validar tipo de arquivo
|
||
|
||
---
|
||
|
||
## Contato e Suporte
|
||
|
||
Para dúvidas sobre a arquitetura, consulte a documentação do usuário ou entre em contato com o time de desenvolvimento.
|