Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/updaters/thread-updaters.js
// @flow | // @flow | ||||
import { filteredThreadIDs } from 'lib/selectors/calendar-filter-selectors.js'; | import { filteredThreadIDs } from 'lib/selectors/calendar-filter-selectors.js'; | ||||
import { getPinnedContentFromMessage } from 'lib/shared/message-utils.js'; | |||||
import { | import { | ||||
threadHasAdminRole, | threadHasAdminRole, | ||||
roleIsAdminRole, | roleIsAdminRole, | ||||
viewerIsMember, | viewerIsMember, | ||||
getThreadTypeParentRequirement, | getThreadTypeParentRequirement, | ||||
validChatNameRegex, | validChatNameRegex, | ||||
} from 'lib/shared/thread-utils.js'; | } from 'lib/shared/thread-utils.js'; | ||||
import { hasMinCodeVersion } from 'lib/shared/version-utils.js'; | import { hasMinCodeVersion } from 'lib/shared/version-utils.js'; | ||||
Show All 26 Lines | import { | ||||
recalculateThreadPermissions, | recalculateThreadPermissions, | ||||
commitMembershipChangeset, | commitMembershipChangeset, | ||||
} from './thread-permission-updaters.js'; | } from './thread-permission-updaters.js'; | ||||
import createMessages from '../creators/message-creator.js'; | import createMessages from '../creators/message-creator.js'; | ||||
import { getRolePermissionBlobs } from '../creators/role-creator.js'; | import { getRolePermissionBlobs } from '../creators/role-creator.js'; | ||||
import { createUpdates } from '../creators/update-creator.js'; | import { createUpdates } from '../creators/update-creator.js'; | ||||
import { dbQuery, SQL } from '../database/database.js'; | import { dbQuery, SQL } from '../database/database.js'; | ||||
import { fetchEntryInfos } from '../fetchers/entry-fetchers.js'; | import { fetchEntryInfos } from '../fetchers/entry-fetchers.js'; | ||||
import { fetchMessageInfos } from '../fetchers/message-fetchers.js'; | import { | ||||
fetchMessageInfos, | |||||
fetchMessageInfoByID, | |||||
} from '../fetchers/message-fetchers.js'; | |||||
import { | import { | ||||
fetchThreadInfos, | fetchThreadInfos, | ||||
fetchServerThreadInfos, | fetchServerThreadInfos, | ||||
determineThreadAncestry, | determineThreadAncestry, | ||||
} from '../fetchers/thread-fetchers.js'; | } from '../fetchers/thread-fetchers.js'; | ||||
import { | import { | ||||
checkThreadPermission, | checkThreadPermission, | ||||
viewerIsMember as fetchViewerIsMember, | viewerIsMember as fetchViewerIsMember, | ||||
▲ Show 20 Lines • Show All 801 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
async function toggleMessagePinForThread( | async function toggleMessagePinForThread( | ||||
viewer: Viewer, | viewer: Viewer, | ||||
request: ToggleMessagePinRequest, | request: ToggleMessagePinRequest, | ||||
): Promise<void> { | ): Promise<void> { | ||||
const { messageID, action } = request; | const { messageID, action } = request; | ||||
const threadQuery = SQL`SELECT thread FROM messages WHERE id = ${messageID}`; | const targetMessage = await fetchMessageInfoByID(viewer, messageID); | ||||
const [threadResult] = await dbQuery(threadQuery); | if (!targetMessage) { | ||||
const threadID = threadResult[0].thread.toString(); | throw new ServerError('invalid_parameters'); | ||||
} | |||||
const { threadID } = targetMessage; | |||||
const hasPermission = await checkThreadPermission( | const hasPermission = await checkThreadPermission( | ||||
viewer, | viewer, | ||||
threadID, | threadID, | ||||
threadPermissions.MANAGE_PINS, | threadPermissions.MANAGE_PINS, | ||||
); | ); | ||||
if (!hasPermission) { | if (!hasPermission) { | ||||
throw new ServerError('invalid_credentials'); | throw new ServerError('invalid_credentials'); | ||||
} | } | ||||
const pinnedValue = action === 'pin' ? 1 : 0; | const pinnedValue = action === 'pin' ? 1 : 0; | ||||
const pinTimeValue = action === 'pin' ? Date.now() : null; | const pinTimeValue = action === 'pin' ? Date.now() : null; | ||||
const togglePinQuery = SQL` | const togglePinQuery = SQL` | ||||
UPDATE messages | UPDATE messages | ||||
SET pinned = ${pinnedValue}, pin_time = ${pinTimeValue} | SET pinned = ${pinnedValue}, pin_time = ${pinTimeValue} | ||||
WHERE id = ${messageID} AND thread = ${threadID} | WHERE id = ${messageID} AND thread = ${threadID} | ||||
`; | `; | ||||
await dbQuery(togglePinQuery); | await dbQuery(togglePinQuery); | ||||
const messageData = { | |||||
type: messageTypes.TOGGLE_PIN, | |||||
threadID, | |||||
targetMessageID: messageID, | |||||
action, | |||||
pinnedContent: getPinnedContentFromMessage(targetMessage), | |||||
creatorID: viewer.userID, | |||||
time: Date.now(), | |||||
}; | |||||
await createMessages(viewer, [messageData]); | |||||
} | } | ||||
export { | export { | ||||
updateRole, | updateRole, | ||||
removeMembers, | removeMembers, | ||||
leaveThread, | leaveThread, | ||||
updateThread, | updateThread, | ||||
joinThread, | joinThread, | ||||
updateThreadMembers, | updateThreadMembers, | ||||
toggleMessagePinForThread, | toggleMessagePinForThread, | ||||
}; | }; |