58 lines
2.4 KiB
Markdown
58 lines
2.4 KiB
Markdown
# План: Мульти-пользовательские промпты
|
||
|
||
**v1.0.86+**
|
||
|
||
## Схема БД
|
||
|
||
```sql
|
||
CREATE TABLE IF NOT EXISTS prompts (
|
||
id TEXT PRIMARY KEY, -- {user_id}_{timestamp}, например "0000_20260621143000"
|
||
user_id TEXT NOT NULL, -- "0000" для тестов, потом Keycloak ID
|
||
name TEXT NOT NULL, -- имя промпта
|
||
content TEXT NOT NULL, -- тело промпта
|
||
created_at TIMESTAMPTZ DEFAULT now(),
|
||
updated_at TIMESTAMPTZ DEFAULT now()
|
||
);
|
||
```
|
||
|
||
## API: prompt.cfm
|
||
|
||
| action | Метод | Что |
|
||
|--------|-------|-----|
|
||
| `list&user_id=0000` | GET | Список промптов юзера |
|
||
| `save` | POST `{id?, user_id, name, content}` | Создать (без id) или обновить (с id) |
|
||
| `delete&id=...` | GET/POST | Удалить промпт |
|
||
| `duplicate&id=...` | GET/POST | Копия с новым ID = user_id + now |
|
||
|
||
Ответ всегда JSON `{ok: true/false, ...}`.
|
||
|
||
## UI (index.cfm)
|
||
|
||
Вместо текущего `<textarea>` + кнопок «Сохранить»/«По умолчанию»:
|
||
|
||
### Компоненты:
|
||
1. `<select>` — выпадающий список промптов (имя + время создания)
|
||
2. Кнопка «Новый» — очищает поля, ждёт ввода имени + текста
|
||
3. Кнопка «Дублировать» — копирует выбранный с именем «Копия ...»
|
||
4. Кнопка «Удалить» — с подтверждением
|
||
5. `<input>` — поле имени промпта
|
||
6. `<textarea>` — тело промпта (как сейчас)
|
||
7. Кнопка «Сохранить» — сохраняет текущий
|
||
|
||
### Формат времени:
|
||
"21.06.2026 14:30" (DD.MM.YYYY HH:MM)
|
||
|
||
## Порядок реализации
|
||
|
||
1. **Фаза 1** — БД: таблица `prompts`
|
||
2. **Фаза 2** — prompt.cfm: API list/save/delete/duplicate
|
||
3. **Фаза 3** — index.cfm: UI с селектом, новым/дубль/удалить/сохранить
|
||
4. **Фаза 4** — миграция: текущий промпт из localStorage → первый промпт в БД
|
||
|
||
## Примечания
|
||
|
||
- Пока `user_id = "0000"` (тестовый)
|
||
- Keycloak: `user_id` = sub из JWT
|
||
- Таблица одна на всех юзеров, ID самодостаточен
|
||
- localStorage пока оставить как fallback
|