план: мульти-пользовательские промпты
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
# План: Мульти-пользовательские промпты
|
||||
|
||||
**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
|
||||
Reference in New Issue
Block a user