Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/responders/message-responders.js
// @flow | // @flow | ||||
import invariant from 'invariant'; | import invariant from 'invariant'; | ||||
import _min from 'lodash/fp/min.js'; | |||||
import t, { type TInterface } from 'tcomb'; | import t, { type TInterface } from 'tcomb'; | ||||
import { onlyOneEmojiRegex } from 'lib/shared/emojis.js'; | import { onlyOneEmojiRegex } from 'lib/shared/emojis.js'; | ||||
import { | import { | ||||
createMediaMessageData, | createMediaMessageData, | ||||
trimMessage, | trimMessage, | ||||
} from 'lib/shared/message-utils.js'; | } from 'lib/shared/message-utils.js'; | ||||
import { relationshipBlockedInEitherDirection } from 'lib/shared/relationship-utils.js'; | import { relationshipBlockedInEitherDirection } from 'lib/shared/relationship-utils.js'; | ||||
Show All 10 Lines | import { | ||||
type SendMessageResponse, | type SendMessageResponse, | ||||
type SendEditMessageResponse, | type SendEditMessageResponse, | ||||
type FetchPinnedMessagesRequest, | type FetchPinnedMessagesRequest, | ||||
type FetchPinnedMessagesResult, | type FetchPinnedMessagesResult, | ||||
messageTruncationStatusesValidator, | messageTruncationStatusesValidator, | ||||
rawMessageInfoValidator, | rawMessageInfoValidator, | ||||
type SearchMessagesResponse, | type SearchMessagesResponse, | ||||
type SearchMessagesRequest, | type SearchMessagesRequest, | ||||
type FetchLatestMessagesRequest, | |||||
type FetchLatestMessagesResponse, | |||||
} from 'lib/types/message-types.js'; | } from 'lib/types/message-types.js'; | ||||
import type { EditMessageData } from 'lib/types/messages/edit.js'; | import type { EditMessageData } from 'lib/types/messages/edit.js'; | ||||
import type { ReactionMessageData } from 'lib/types/messages/reaction.js'; | import type { ReactionMessageData } from 'lib/types/messages/reaction.js'; | ||||
import type { TextMessageData } from 'lib/types/messages/text.js'; | import type { TextMessageData } from 'lib/types/messages/text.js'; | ||||
import { threadPermissions } from 'lib/types/thread-permission-types.js'; | import { threadPermissions } from 'lib/types/thread-permission-types.js'; | ||||
import { userInfosValidator } from 'lib/types/user-types.js'; | import { userInfosValidator } from 'lib/types/user-types.js'; | ||||
import { ServerError } from 'lib/utils/errors.js'; | import { ServerError } from 'lib/utils/errors.js'; | ||||
import { values } from 'lib/utils/objects.js'; | import { values } from 'lib/utils/objects.js'; | ||||
Show All 9 Lines | |||||
import { | import { | ||||
fetchMessageInfos, | fetchMessageInfos, | ||||
fetchMessageInfoForLocalID, | fetchMessageInfoForLocalID, | ||||
fetchMessageInfoByID, | fetchMessageInfoByID, | ||||
fetchThreadMessagesCount, | fetchThreadMessagesCount, | ||||
fetchPinnedMessageInfos, | fetchPinnedMessageInfos, | ||||
searchMessagesInSingleChat, | searchMessagesInSingleChat, | ||||
} from '../fetchers/message-fetchers.js'; | } from '../fetchers/message-fetchers.js'; | ||||
import { fetchServerThreadInfos } from '../fetchers/thread-fetchers.js'; | import { | ||||
fetchServerThreadInfos, | |||||
fetchThreadsWithLatestMessages, | |||||
} from '../fetchers/thread-fetchers.js'; | |||||
import { checkThreadPermission } from '../fetchers/thread-permission-fetchers.js'; | import { checkThreadPermission } from '../fetchers/thread-permission-fetchers.js'; | ||||
import { | import { | ||||
fetchImages, | fetchImages, | ||||
fetchMediaFromMediaMessageContent, | fetchMediaFromMediaMessageContent, | ||||
} from '../fetchers/upload-fetchers.js'; | } from '../fetchers/upload-fetchers.js'; | ||||
import { fetchKnownUserInfos } from '../fetchers/user-fetchers.js'; | import { fetchKnownUserInfos } from '../fetchers/user-fetchers.js'; | ||||
import type { Viewer } from '../session/viewer.js'; | import type { Viewer } from '../session/viewer.js'; | ||||
import { | import { | ||||
▲ Show 20 Lines • Show All 445 Lines • ▼ Show 20 Lines | ): Promise<SearchMessagesResponse> { | ||||
); | ); | ||||
return validateOutput( | return validateOutput( | ||||
viewer.platformDetails, | viewer.platformDetails, | ||||
searchMessagesResponseValidator, | searchMessagesResponseValidator, | ||||
response, | response, | ||||
); | ); | ||||
} | } | ||||
const fetchLatestMessagesInputValidator = tShape<FetchLatestMessagesRequest>({ | |||||
home: t.Boolean, | |||||
fromMessage: tID, | |||||
}); | |||||
const fetchLatestMessagesResponseValidator = | |||||
tShape<FetchLatestMessagesResponse>({ | |||||
rawMessageInfos: t.list(rawMessageInfoValidator), | |||||
truncationStatuses: messageTruncationStatusesValidator, | |||||
oldestMessage: t.maybe(tID), | |||||
}); | |||||
async function fetchLatestMessages( | |||||
viewer: Viewer, | |||||
input: mixed, | |||||
): Promise<FetchLatestMessagesResponse> { | |||||
const request = await validateInput( | |||||
viewer, | |||||
fetchLatestMessagesInputValidator, | |||||
input, | |||||
); | |||||
const { allThreads, threadsExcludingParents } = | |||||
await fetchThreadsWithLatestMessages( | |||||
viewer.userID, | |||||
request.home, | |||||
request.fromMessage, | |||||
); | |||||
if (allThreads.length === 0) { | |||||
return { rawMessageInfos: [], truncationStatuses: {}, oldestMessage: null }; | |||||
} | |||||
const threadCursors = {}; | |||||
for (const threadID of allThreads) { | |||||
threadCursors[threadID] = null; | |||||
} | |||||
const response = await fetchMessageInfos(viewer, { threadCursors }, 1); | |||||
ashoat: If we don't need any messages for sidebars (since the previews are not needed), then why are we… | |||||
const oldestMessage = _min( | |||||
response.rawMessageInfos | |||||
.filter(message => threadsExcludingParents.has(message.threadID)) | |||||
.map(message => Number(message.id)), | |||||
).toString(); | |||||
return validateOutput( | |||||
viewer.platformDetails, | |||||
fetchLatestMessagesResponseValidator, | |||||
{ ...response, oldestMessage }, | |||||
); | |||||
} | |||||
export { | export { | ||||
textMessageCreationResponder, | textMessageCreationResponder, | ||||
messageFetchResponder, | messageFetchResponder, | ||||
multimediaMessageCreationResponder, | multimediaMessageCreationResponder, | ||||
reactionMessageCreationResponder, | reactionMessageCreationResponder, | ||||
editMessageCreationResponder, | editMessageCreationResponder, | ||||
fetchPinnedMessagesResponder, | fetchPinnedMessagesResponder, | ||||
searchMessagesResponder, | searchMessagesResponder, | ||||
fetchLatestMessages, | |||||
}; | }; |
If we don't need any messages for sidebars (since the previews are not needed), then why are we querying for them here?