Чат: поиск сообщений по всем командам, а не только по текущей

Mattermost search per-team — опрашиваем все команды пользователя параллельно
и сливаем результаты с дедупликацией по id. ЛС/групповые попадают в выдачу
любой команды. Сбой одной команды не валит весь поиск.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-28 21:24:35 +03:00
parent 7606592ed8
commit 97bf274c6b
+20 -8
View File
@@ -543,19 +543,31 @@ function chatSearchMessages(terms) {
var messagesEl = document.getElementById('chat-messages');
if (!resultsEl) return;
if (!terms) { chatCloseSearch(); return; }
if (!chatCurrentTeamId) return;
// Пошук по УСІХ командах (Mattermost search — per-team), результати зливаємо.
// ЛС/групові не прив'язані до команди й потрапляють у видачу будь-якої з них.
var teamIds = Object.keys(chatTeamsById);
if (!teamIds.length && chatCurrentTeamId) teamIds = [chatCurrentTeamId];
if (!teamIds.length) return;
resultsEl.style.display = 'flex';
if (messagesEl) messagesEl.style.display = 'none';
resultsEl.innerHTML = '<div style="text-align:center; font-size:0.8125rem; color:var(--color-muted-foreground); padding:1rem;">Пошук…</div>';
chatApiFetch('/teams/' + chatCurrentTeamId + '/posts/search', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({terms: terms, is_or_search: false, per_page: 30}),
}).then(function (data) {
var ids = data.order || [];
var posts = ids.map(function (id) { return data.posts[id]; }).filter(Boolean);
var body = JSON.stringify({terms: terms, is_or_search: false, per_page: 30});
var merged = {}; // id -> post (дедуплікація між командами)
Promise.all(teamIds.map(function (tid) {
return chatApiFetch('/teams/' + tid + '/posts/search', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: body,
}).then(function (data) {
(data.order || []).forEach(function (id) {
if (data.posts && data.posts[id]) merged[id] = data.posts[id];
});
}).catch(function () { /* збій однієї команди не валить весь пошук */ });
})).then(function () {
var posts = Object.keys(merged).map(function (id) { return merged[id]; });
return chatResolveUsernames(posts).then(function () {
chatRenderSearchResults(posts);
});