diff --git a/keyserver/src/responders/message-responders.js b/keyserver/src/responders/message-responders.js --- a/keyserver/src/responders/message-responders.js +++ b/keyserver/src/responders/message-responders.js @@ -60,6 +60,7 @@ } from '../fetchers/upload-fetchers.js'; import { fetchKnownUserInfos } from '../fetchers/user-fetchers.js'; import type { Viewer } from '../session/viewer.js'; +import { updateMessagePinForThread } from '../updaters/thread-updaters.js'; import { assignImages, assignMessageContainerToMedia, @@ -504,7 +505,17 @@ } } - const newMessageInfos = await createMessages(viewer, messagesData); + const [newMessageInfos] = await Promise.all([ + createMessages(viewer, messagesData), + updateMessagePinForThread( + viewer, + { + messageID: targetMessageID, + action: 'unpin', + }, + 'force_silently', + ), + ]); return { newMessageInfos }; } diff --git a/keyserver/src/responders/thread-responders.js b/keyserver/src/responders/thread-responders.js --- a/keyserver/src/responders/thread-responders.js +++ b/keyserver/src/responders/thread-responders.js @@ -54,7 +54,7 @@ leaveThread, updateThread, joinThread, - toggleMessagePinForThread, + updateMessagePinForThread, } from '../updaters/thread-updaters.js'; export const threadDeletionRequestInputValidator: TInterface = @@ -218,7 +218,7 @@ viewer: Viewer, request: ToggleMessagePinRequest, ): Promise { - return await toggleMessagePinForThread(viewer, request); + return await updateMessagePinForThread(viewer, request, 'normal'); } export const roleModificationRequestInputValidator: TUnion = diff --git a/keyserver/src/updaters/thread-updaters.js b/keyserver/src/updaters/thread-updaters.js --- a/keyserver/src/updaters/thread-updaters.js +++ b/keyserver/src/updaters/thread-updaters.js @@ -1011,9 +1011,10 @@ return false; } -async function toggleMessagePinForThread( +async function updateMessagePinForThread( viewer: Viewer, request: ToggleMessagePinRequest, + behavior: 'normal' | 'force_silently', ): Promise { const { messageID, action } = request; @@ -1026,15 +1027,18 @@ const fetchServerThreadInfosResult = await fetchServerThreadInfos({ threadID, }); - const { threadInfos: rawThreadInfos } = rawThreadInfosFromServerThreadInfos( - viewer, - fetchServerThreadInfosResult, - ); - const rawThreadInfo = rawThreadInfos[threadID]; - const canTogglePin = canToggleMessagePin(targetMessage, rawThreadInfo); - if (!canTogglePin) { - throw new ServerError('invalid_parameters'); + if (behavior === 'normal') { + const { threadInfos: rawThreadInfos } = rawThreadInfosFromServerThreadInfos( + viewer, + fetchServerThreadInfosResult, + ); + const rawThreadInfo = rawThreadInfos[threadID]; + + const canTogglePin = canToggleMessagePin(targetMessage, rawThreadInfo); + if (!canTogglePin) { + throw new ServerError('invalid_parameters'); + } } const pinnedValue = action === 'pin' ? 1 : 0; @@ -1062,6 +1066,10 @@ } const createMessagesAsync = async () => { + if (behavior === 'force_silently') { + return ([]: Array); + } + const messageData = { type: messageTypes.TOGGLE_PIN, threadID, @@ -1071,8 +1079,7 @@ creatorID: viewer.userID, time: Date.now(), }; - const newMessageInfos = await createMessages(viewer, [messageData]); - return newMessageInfos; + return await createMessages(viewer, [messageData]); }; const createUpdatesAsync = async () => { @@ -1107,5 +1114,5 @@ leaveThread, updateThread, joinThread, - toggleMessagePinForThread, + updateMessagePinForThread, };