Initial commit DBMaker - Oficiais e Funcionando
This commit is contained in:
706
docs/ARQUITETURA_TECNICA.md
Normal file
706
docs/ARQUITETURA_TECNICA.md
Normal file
@@ -0,0 +1,706 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user