Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/fetchers/message-fetchers.js
Show All 15 Lines | import { | ||||
messageTypes, | messageTypes, | ||||
type MessageType, | type MessageType, | ||||
assertMessageType, | assertMessageType, | ||||
type MessageSelectionCriteria, | type MessageSelectionCriteria, | ||||
type MessageTruncationStatus, | type MessageTruncationStatus, | ||||
messageTruncationStatus, | messageTruncationStatus, | ||||
type FetchMessageInfosResult, | type FetchMessageInfosResult, | ||||
defaultMaxMessageAge, | defaultMaxMessageAge, | ||||
type FetchPinnedMessageInfosRequest, | |||||
type FetchPinnedMessageInfosResult, | |||||
} from 'lib/types/message-types.js'; | } from 'lib/types/message-types.js'; | ||||
import { threadPermissions } from 'lib/types/thread-types.js'; | import { threadPermissions } from 'lib/types/thread-types.js'; | ||||
import { ServerError } from 'lib/utils/errors.js'; | import { ServerError } from 'lib/utils/errors.js'; | ||||
import { | import { | ||||
constructMediaFromMediaMessageContentsAndUploadRows, | constructMediaFromMediaMessageContentsAndUploadRows, | ||||
mediaFromRow, | mediaFromRow, | ||||
} from './upload-fetchers.js'; | } from './upload-fetchers.js'; | ||||
▲ Show 20 Lines • Show All 622 Lines • ▼ Show 20 Lines | const query = SQL` | ||||
LEFT JOIN memberships stm ON m.type = ${messageTypes.CREATE_SUB_THREAD} | LEFT JOIN memberships stm ON m.type = ${messageTypes.CREATE_SUB_THREAD} | ||||
AND stm.thread = m.content AND stm.user = m.user | AND stm.thread = m.content AND stm.user = m.user | ||||
WHERE m.id IN (${messageIDs}) | WHERE m.id IN (${messageIDs}) | ||||
`; | `; | ||||
const [result] = await dbQuery(query); | const [result] = await dbQuery(query); | ||||
return result; | return result; | ||||
} | } | ||||
async function fetchPinnedMessageInfos( | |||||
viewer: Viewer, | |||||
request: FetchPinnedMessageInfosRequest, | |||||
): Promise<?FetchPinnedMessageInfosResult> { | |||||
const messageRowsQuery = SQL` | |||||
SELECT m.id, m.thread AS threadID, m.content, m.time, m.type, m.creation, | |||||
m.user AS creatorID, m.target_message as targetMessageID, | |||||
NULL AS subthread_permissions, u.id AS uploadID, | |||||
rohan: [[ https://github.com/CommE2E/comm/blob/master/keyserver/src/fetchers/message-fetchers.js#L233… | |||||
u.type AS uploadType, u.secret AS uploadSecret, u.extra AS uploadExtra | |||||
FROM messages m | |||||
LEFT JOIN uploads u ON u.container = m.id | |||||
LEFT JOIN memberships mm ON mm.thread = m.thread AND mm.user = ${viewer.id} | |||||
WHERE m.thread = ${request.threadID} | |||||
AND m.pinned = 1 | |||||
AND JSON_EXTRACT(mm.permissions, ${visibleExtractString}) IS TRUE | |||||
`; | |||||
const [messageRows] = await dbQuery(messageRowsQuery); | |||||
if (messageRows.length === 0) { | |||||
return null; | |||||
} | |||||
const derivedMessages = await fetchDerivedMessages(messageRows, viewer); | |||||
const pinnedRawMessageInfos = []; | |||||
for (const messageRow of messageRows) { | |||||
const rawMessageInfo = rawMessageInfoFromRows( | |||||
[messageRow], | |||||
viewer, | |||||
derivedMessages, | |||||
); | |||||
if (rawMessageInfo) { | |||||
pinnedRawMessageInfos.push(rawMessageInfo); | |||||
} | |||||
} | |||||
const shimmedPinnedRawMessageInfos = shimUnsupportedRawMessageInfos( | |||||
pinnedRawMessageInfos, | |||||
viewer.platformDetails, | |||||
); | |||||
return { | |||||
pinnedRawMessageInfos: shimmedPinnedRawMessageInfos, | |||||
}; | |||||
} | |||||
async function fetchDerivedMessages( | async function fetchDerivedMessages( | ||||
rows: $ReadOnlyArray<Object>, | rows: $ReadOnlyArray<Object>, | ||||
viewer?: Viewer, | viewer?: Viewer, | ||||
): Promise< | ): Promise< | ||||
$ReadOnlyMap<string, RawComposableMessageInfo | RawRobotextMessageInfo>, | $ReadOnlyMap<string, RawComposableMessageInfo | RawRobotextMessageInfo>, | ||||
> { | > { | ||||
const requiredIDs = new Set<string>(); | const requiredIDs = new Set<string>(); | ||||
for (const row of rows) { | for (const row of rows) { | ||||
▲ Show 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | export { | ||||
fetchCollapsableNotifs, | fetchCollapsableNotifs, | ||||
fetchMessageInfos, | fetchMessageInfos, | ||||
fetchMessageInfosSince, | fetchMessageInfosSince, | ||||
getMessageFetchResultFromRedisMessages, | getMessageFetchResultFromRedisMessages, | ||||
fetchMessageInfoForLocalID, | fetchMessageInfoForLocalID, | ||||
fetchMessageInfoForEntryAction, | fetchMessageInfoForEntryAction, | ||||
fetchMessageInfoByID, | fetchMessageInfoByID, | ||||
fetchThreadMessagesCount, | fetchThreadMessagesCount, | ||||
fetchPinnedMessageInfos, | |||||
}; | }; |
rawMessageInfoFromRows seems to require subthread_permissions. The other queries that call this method use stm.permissions with LEFT JOIN memberships stm ON m.type = ${messageTypes.CREATE_SUB_THREAD} AND stm.thread = m.content AND stm.user = n.user.
I'm not particularly sure why, in this case, I'd need to left join on memberships when m.type = CREATE_SUB_THREAD, so I've just selected subtread_permissions as NULL.
I tried looking at the git history for any queries that do call this method, but they're mostly from several years ago, so if I'm missing something and I do need it, feel free to let me know