Files
sgse-app/packages/backend/convex/tables/documentacao.ts

153 lines
5.0 KiB
TypeScript

import { defineTable } from 'convex/server';
import { v } from 'convex/values';
export const documentacaoTables = {
// Documentos principais
documentacao: defineTable({
titulo: v.string(),
conteudo: v.string(), // Conteúdo em Markdown
conteudoHtml: v.optional(v.string()), // Conteúdo renderizado em HTML
conteudoBusca: v.string(), // Versão normalizada para busca (lowercase, sem acentos)
categoriaId: v.optional(v.id('documentacaoCategorias')),
tags: v.array(v.string()),
tipo: v.union(
v.literal('query'),
v.literal('mutation'),
v.literal('action'),
v.literal('component'),
v.literal('route'),
v.literal('modulo'),
v.literal('manual'),
v.literal('outro')
),
versao: v.string(), // Versão do documento (ex: "1.0.0")
arquivoOrigem: v.optional(v.string()), // Caminho do arquivo que gerou este documento
funcaoOrigem: v.optional(v.string()), // Nome da função/componente que gerou este documento
hashOrigem: v.optional(v.string()), // Hash do arquivo/função para detectar mudanças
metadados: v.optional(
v.object({
parametros: v.optional(v.array(v.string())),
retorno: v.optional(v.string()),
dependencias: v.optional(v.array(v.string())),
exemplos: v.optional(v.array(v.string())),
algoritmo: v.optional(v.string())
})
),
ativo: v.boolean(),
criadoPor: v.id('usuarios'),
criadoEm: v.number(),
atualizadoPor: v.optional(v.id('usuarios')),
atualizadoEm: v.number(),
visualizacoes: v.number(), // Contador de visualizações
geradoAutomaticamente: v.boolean() // Se foi gerado pela varredura automática
})
.index('by_categoria', ['categoriaId'])
.index('by_tipo', ['tipo'])
.index('by_busca', ['conteudoBusca'])
.index('by_ativo', ['ativo'])
.index('by_criado_em', ['criadoEm'])
.index('by_atualizado_em', ['atualizadoEm'])
.index('by_arquivo_origem', ['arquivoOrigem'])
.index('by_hash_origem', ['hashOrigem']),
// Categorias hierárquicas (Módulos, Seções, Funções)
documentacaoCategorias: defineTable({
nome: v.string(),
descricao: v.optional(v.string()),
icone: v.optional(v.string()), // Nome do ícone (lucide-svelte)
cor: v.optional(
v.union(
v.literal('primary'),
v.literal('secondary'),
v.literal('accent'),
v.literal('success'),
v.literal('warning'),
v.literal('error'),
v.literal('info')
)
),
parentId: v.optional(v.id('documentacaoCategorias')), // Para hierarquia
ordem: v.number(), // Ordem de exibição
ativo: v.boolean(),
criadoPor: v.id('usuarios'),
criadoEm: v.number(),
atualizadoEm: v.number()
})
.index('by_parent', ['parentId'])
.index('by_ordem', ['ordem'])
.index('by_ativo', ['ativo']),
// Tags para busca e organização
documentacaoTags: defineTable({
nome: v.string(),
descricao: v.optional(v.string()),
cor: v.optional(
v.union(
v.literal('primary'),
v.literal('secondary'),
v.literal('accent'),
v.literal('success'),
v.literal('warning'),
v.literal('error'),
v.literal('info')
)
),
usadoEm: v.number(), // Contador de quantos documentos usam esta tag
ativo: v.boolean(),
criadoPor: v.id('usuarios'),
criadoEm: v.number()
})
.index('by_nome', ['nome'])
.index('by_ativo', ['ativo']),
// Histórico de varreduras realizadas
documentacaoVarredura: defineTable({
tipo: v.union(v.literal('automatica'), v.literal('manual')),
status: v.union(
v.literal('em_andamento'),
v.literal('concluida'),
v.literal('erro'),
v.literal('cancelada')
),
documentosEncontrados: v.number(), // Quantidade de documentos encontrados
documentosNovos: v.number(), // Quantidade de novos documentos criados
documentosAtualizados: v.number(), // Quantidade de documentos atualizados
arquivosAnalisados: v.number(), // Quantidade de arquivos analisados
erros: v.optional(v.array(v.string())), // Lista de erros encontrados
duracaoMs: v.optional(v.number()), // Duração em milissegundos
executadoPor: v.id('usuarios'),
iniciadoEm: v.number(),
concluidoEm: v.optional(v.number())
})
.index('by_status', ['status'])
.index('by_tipo', ['tipo'])
.index('by_executado_por', ['executadoPor'])
.index('by_iniciado_em', ['iniciadoEm']),
// Configurações de agendamento de varredura
documentacaoConfig: defineTable({
ativo: v.boolean(),
diasSemana: v.array(
v.union(
v.literal('domingo'),
v.literal('segunda'),
v.literal('terca'),
v.literal('quarta'),
v.literal('quinta'),
v.literal('sexta'),
v.literal('sabado')
)
), // Dias da semana para executar varredura
horario: v.string(), // Horário no formato "HH:MM" (ex: "08:00")
fusoHorario: v.optional(v.string()), // Fuso horário (padrão: "America/Recife")
ultimaExecucao: v.optional(v.number()), // Timestamp da última execução
proximaExecucao: v.optional(v.number()), // Timestamp da próxima execução agendada
configuradoPor: v.id('usuarios'),
configuradoEm: v.number(),
atualizadoPor: v.optional(v.id('usuarios')),
atualizadoEm: v.number()
})
.index('by_ativo', ['ativo'])
};