Вики для CRM: ASP.NET Core + SQLite/FTS5 + React/TipTap, авторизация через CRM
This commit is contained in:
46
SPEC.md
Normal file
46
SPEC.md
Normal file
@@ -0,0 +1,46 @@
|
||||
---
|
||||
добавлено: 2026-10-13
|
||||
---
|
||||
# Спецификация. Вики для CRM
|
||||
|
||||
База знаний для людей и агентов, отдельный сайт, встраивается в CRM через боковую панель. Задача владельца в CRM: «Додати в CRM вікі-сторінки зі структурою папок» (`mv2pby2qbv9vdj`, проект Tvorymo shotam). Как встраивать: [[Встраивание страниц в CRM]].
|
||||
|
||||
## Стек
|
||||
|
||||
- Бэкенд на C# (ASP.NET Core): REST API, чтобы к вики было легко обращаться из скиллов и других сервисов.
|
||||
- Данные в SQLite, нагрузка небольшая. Файл базы на постоянном томе Coolify, иначе пропадёт при пересборке.
|
||||
- Хостинг: наш сервер, Coolify storage, код в `gitea.tes.gd`. Агента (`crm-wiki`) создаёт админ.
|
||||
- Домен: `https://wiki-crm.tes.gd`.
|
||||
- Картинки хранятся на диске, на том же постоянном томе, что и SQLite. Отдаются только после проверки токена и доступа к workspace страницы.
|
||||
|
||||
## Авторизация
|
||||
|
||||
- Токен пользователя CRM приходит через `postMessage` (`crm:ready` → `crm:auth`), как на тестовой странице `https://test-crm.tes.gd`.
|
||||
- Токен нужен только для входа: сервер вики проверяет его через Supabase (`GET /auth/v1/user` с publishable-ключом, `exp`, `aud = "authenticated"`). Данные вики в Supabase не хранятся.
|
||||
- Агенты получают такой же доступ, как люди. Отдельный скилл для работы с вики сделаем позже, сейчас на агентах не фокусируемся.
|
||||
|
||||
## Workspace
|
||||
|
||||
- Сейчас CRM workspace во встроенную страницу не передаёт: в `crm:auth` только `access_token`, `expires_at`, `user { id, email, name }` (проверено по `js/pagebridge.js` 2026-10-13). Выбранный workspace CRM держит в `localStorage`.
|
||||
- Нужна доработка протокола от Олега (задача в CRM): поле `workspace: { id, kind, title }` в `crm:auth` и новое сообщение при переключении workspace.
|
||||
- Сервер вики id из сообщения не доверяет, а сверяет доступ: `personal:<uid>` только для владельца, `shared` для всех, `custom` проверяется запросом к таблице `workspaces` Supabase с токеном пользователя (RLS).
|
||||
- У каждой папки и страницы поле `workspace_id`, дерево показывает только текущий workspace.
|
||||
|
||||
## Первая версия
|
||||
|
||||
1. Страницы: название и текст в визуальном редакторе как в Notion (заголовки, списки, жирный, ссылки, таблицы, картинки). Хранить текст в Markdown или в JSON редактора с экспортом в Markdown — решает агент, но API должен отдавать Markdown.
|
||||
2. Папки с любой вложенностью, дерево сбоку (раскрыть, свернуть), хлебные крошки сверху.
|
||||
3. Действия: создать, переименовать, переместить, удалить с подтверждением.
|
||||
4. Ссылки между страницами по id: не ломаются при переименовании и переносе.
|
||||
5. Поиск по названиям и тексту (SQLite FTS5).
|
||||
6. Стили CRM: `tvorymo-ui.css` и `crm.css` ссылками, `body.side-off`.
|
||||
7. Защита от одновременной правки: проверка версии страницы при сохранении.
|
||||
|
||||
## Потом
|
||||
|
||||
- История изменений и откат версий.
|
||||
- Скилл для агентов.
|
||||
|
||||
## Зависимости
|
||||
|
||||
- Фильтр по workspace зависит от задачи Олега `mv6p5b92slw1an` (она блокирует задачу вики в CRM). До её выкатки делать всё остальное; workspace брать из сообщения, если поле есть, иначе временно работать в общем workspace (`shared`).
|
||||
Reference in New Issue
Block a user