From 98741e47d832274bd52a1eb0d8a7a58fc79c00b3 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 07:09:50 +0100 Subject: [PATCH] docs(chat): define owner editor conflict, history, and patch contracts --- src/chat/chat_core.h | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/chat/chat_core.h b/src/chat/chat_core.h index dfe282cd..364b32d5 100644 --- a/src/chat/chat_core.h +++ b/src/chat/chat_core.h @@ -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. Приватный ключ очищается. + * Уведомления после 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];