const { Pool } = require('pg'); async function run() { const pool = new Pool({ connectionString: 'postgresql://postgres:postgres@localhost:5432/xflow' }); const canvasId = 'xflow-project'; // Define a fresh set of nodes that thoroughly represent the project const nodes = [ // 1. Core Architecture { id: 'arch-1', type: 'text', x: 0, y: 0, width: 400, height: 350, text: '# 🏗️ Глобальная Архитектура\n\n- **Nuxt 3** - Full-stack фреймворк (SSR + API)\n- **Prisma ORM** - Типизированный доступ к данным\n- **PostgreSQL** - Надежное хранилище\n- **Firebase Auth** - Вход через Google\n- **Vue Flow** - Ядро интерактивного холста\n- **TailwindCSS** - Современная стилизация', style: { background: '#1e293b', border: '#3b82f6' } }, // 2. Database & Prisma { id: 'prisma-schema', type: 'text', x: -500, y: 100, width: 450, height: 500, text: '# 🗄️ База Данных & Prisma\n\n```prisma\nmodel User {\n id String @id\n email String @unique\n username String @unique\n role String @default(\"user\")\n canvases Canvas[]\n groups GroupMember[]\n}\n\nmodel Canvas {\n id String @id\n name String\n nodes Json // Obsidian format\n edges Json\n owner User @relation(...)\n}\n\nmodel Group {\n id String @id\n members GroupMember[]\n}\n```\n\n**Особенности:**\n- Использование `Json` полей для гибкости холста\n- Каскадное удаление данных\n- Связи многие-ко-многим для групп', style: { background: '#1e293b', border: '#10b981' } }, // 3. Auth & Security { id: 'auth-system', type: 'text', x: -500, y: 650, width: 450, height: 350, text: '# 🔐 Безопасность и Auth\n\n1. **Firebase**: Клиентская аутентификация Google.\n2. **Google Token**: Отправляется на `/api/auth/google`.\n3. **Prisma Upsert**: Пользователь создается или обновляется в БД.\n4. **JWT**: Сервер генерирует токен (с ID и ролью).\n5. **Middleware**: Проверка JWT через `requireAuth` в серверных роутах.\n6. **RBAC**: Роли `admin` и `user` контролируют доступ.', style: { background: '#1e293b', border: '#ef4444' } }, // 4. Git Synchronization { id: 'git-sync', type: 'text', x: 500, y: 100, width: 450, height: 400, text: '# 🔄 Git Синхронизация (Gitea)\n\n- **useGitSync**: Composable для управления статусом.\n- **Real-Sync API**: Обрабатывает `init` и `sync`.\n- **Gitea Integration**:\n - Автоматическое создание репозиториев.\n - Коммиты при каждом сохранении карты.\n - Хранение `.canvas` файлов в Git для версионности.\n - Токены доступа через `.env` переменные.', style: { background: '#1e293b', border: '#f59e0b' } }, // 5. Frontend Reactivity { id: 'state-reactivity', type: 'text', x: 500, y: 550, width: 450, height: 350, text: '# 🧪 Реактивность и Состояние\n\n- **elements**: Массив всех узлов и ребер Vue Flow.\n- **selectedNode**: Реактивный объект для панели свойств.\n- **useUnsavedChanges**: Отслеживание изменений (Dirty state).\n- **commitNodeChange**: Синхронизация данных из панели свойств обратно в массив элементов перед сохранением.', style: { background: '#1e293b', border: '#8b5cf6' } }, // 6. Features & Updates { id: 'feat-1', type: 'text', x: 0, y: 400, width: 400, height: 450, text: '# ✨ Ключевые Фичи\n\n- **Кросс-ссылки**: Навигация между картами.\n- **Канбан**: Сводная таблица задач по пользователям.\n- **Типы Узлов**:\n - `Text` (Markdown)\n - `Task` (State machine)\n - `AI Prompt` (LLM ready)\n - `Webhook` (External trigger)\n - `Git Sync` (Version control)\n- **Импорт/Экспорт**: Полная совместимость с Obsidian.', style: { background: '#1e293b', border: '#06b6d4' } }, // 7. Recent Session { id: 'session-apr-28', type: 'text', x: 0, y: 900, width: 400, height: 250, text: '# 🔥 Сессия 28 Апреля (Итоги)\n\n- ✅ Починена потеря метаданных в Prisma.\n- ✅ Реализована навигация (двойной клик по ссылкам).\n- ✅ Внедрена система ролей и прав.\n- ✅ Добавлен выпадающий список для связей карт.\n- ✅ Синхронизированы Firebase и БД ID.', style: { background: '#064e3b', border: '#10b981' } } ]; const edges = [ { id: 'e1', source: 'arch-1', target: 'prisma-schema' }, { id: 'e2', source: 'arch-1', target: 'auth-system' }, { id: 'e3', source: 'arch-1', target: 'git-sync' }, { id: 'e4', source: 'arch-1', target: 'state-reactivity' }, { id: 'e5', source: 'arch-1', target: 'feat-1' }, { id: 'e6', source: 'feat-1', target: 'session-apr-28' }, { id: 'e7', source: 'prisma-schema', target: 'auth-system' } ]; await pool.query( `INSERT INTO "Canvas" (id, name, nodes, edges, "ownerId", "isPublic", "createdAt", "updatedAt") VALUES ($1, $2, $3, $4, 'GqbpMyUW0NaxjIy5nvCiXCiQu9t2', true, NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET nodes = $3, edges = $4, name = $2, "updatedAt" = NOW()`, [canvasId, '🗺️ Глобальная Архитектура XFlow', JSON.stringify(nodes), JSON.stringify(edges)] ); console.log('Main project canvas rebuilt with deep architectural details (Prisma, Git, Auth, State)'); await pool.end(); } run().catch(console.error);