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']) };