docs(chat): define owner editor conflict, history, and patch contracts

This commit is contained in:
evgeny committed 2026-10-27 07:09:50 +01:00
1 parent e3ea2ef78f
commit 98741e47d8
1 file changed
+13 -6
+13 -6
View File
@@ -337,26 +337,33 @@ void chat_core_set_my_avatar_trampoline(void* arg);
struct chat_member_tags;
// Загрузить текущие adm_tags мембера в память. Возвращает NULL если мембера нет.
/* Загрузить проверенный owner-снимок полного участника:NULL при отсутствии/placeholder/SQL/подписи/формате.
* Объект принадлежит caller до free,используется в uasync и освобождается до остановки chat-сервиса. */
struct chat_member_tags* chat_member_tags_load(struct UTUN_INSTANCE* inst, const char* ch_id, uint64_t node_id);
// Установить ключ. val=NULL → удалить ключ. ver — особый, автоинкремент при commit.
/* Изменить желаемое поле:0/-1;отказ не меняет editor. val=NULL удаляет поле;admin/moder принимают yes/no.
* Пустой ключ/ver запрещены,версию выбирает commit;место для ver резервируется в лимите16 ключей. */
int chat_member_tags_set(struct chat_member_tags* t, const char* key, const char* val);
// Получить значение ключа. Возвращает NULL если ключ не найден.
const char* chat_member_tags_get(struct chat_member_tags* t, const char* key);
// Заменить все теги данными из JSON-строки (плоский, строковые значения).
/* Заменить желаемые теги:0/-1,при отказе editor не меняется. Весь объект<=8192 байта,уникальные
* непустые ключи,только строки;admin/moder yes/no. Необязательный ver обязан совпадать с исходным снимком. */
int chat_member_tags_replace(struct chat_member_tags* t, const char* json);
/* Сохранить: сериализовать в JSON, инкрементировать ver, подписать канальным Ed25519,
* записать через member_sync_put() → синхронизируется всем. */
/* Собственный BEGIN IMMEDIATE проверяет исходный owner-снимок и фиксирует новую подпись/версию/Merkle.
* 0 — committed/no-op,-2 — конфликт с изменившимся owner-блоком,-1 — прочий отказ;чужая транзакция запрещена.
* Отказ сохраняет editor/БД,успех обновляет editor для следующей правки. No-op сохраняет версию/подпись.
* Версия1..INT_MAX;admin/moder сохраняют историю,отключение дописывает d<seconds>. Приватный ключ очищается.
* Уведомления после commit без cursor;при неудачном rollback запрашивается stop/закрытие БД владельцем. */
int chat_member_tags_commit(struct UTUN_INSTANCE* inst, struct chat_member_tags* t);
// Освободить без сохранения.
void chat_member_tags_free(struct chat_member_tags* t);
// Трамплин для gui_bridge: arg = struct chat_member_tags_req* (доверенная память).
/* Трамплин для gui_bridge:владеет req/u_free. json — частичный объект желаемых полей,неуказанные сохраняются;
* необязательный ver проверяет снимок формы. Пустая строка — no-op;ошибки логируются без commit. */
struct chat_member_tags_req {
struct UTUN_INSTANCE* inst;
char ch_id[64];