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 t 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'; | ||||
import type { Media } from 'lib/types/media-types.js'; | import type { Media } from 'lib/types/media-types.js'; | ||||
import { messageTypes } from 'lib/types/message-types-enum.js'; | import { messageTypes } from 'lib/types/message-types-enum.js'; | ||||
import { | import { | ||||
type SendTextMessageRequest, | type SendTextMessageRequest, | ||||
type SendMultimediaMessageRequest, | type SendMultimediaMessageRequest, | ||||
type SendReactionMessageRequest, | type SendReactionMessageRequest, | ||||
type SendEditMessageRequest, | type SendEditMessageRequest, | ||||
type FetchMessageInfosResponse, | type FetchMessageInfosResponse, | ||||
type FetchMessageInfosRequest, | type FetchMessageInfosRequest, | ||||
defaultNumberPerThread, | defaultNumberPerThread, | ||||
type SendMessageResponse, | type SendMessageResponse, | ||||
type SendEditMessageResponse, | type SendEditMessageResponse, | ||||
type FetchPinnedMessagesRequest, | type FetchPinnedMessagesRequest, | ||||
type FetchPinnedMessagesResult, | type FetchPinnedMessagesResult, | ||||
messageTruncationStatusesValidator, | |||||
rawMessageInfoValidator, | |||||
} 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-types.js'; | import { threadPermissions } from 'lib/types/thread-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'; | ||||
import { | import { | ||||
tRegex, | tRegex, | ||||
tShape, | tShape, | ||||
tMediaMessageMedia, | tMediaMessageMedia, | ||||
} from 'lib/utils/validation-utils.js'; | } from 'lib/utils/validation-utils.js'; | ||||
Show All 21 Lines | |||||
import { validateInput } from '../utils/validation-utils.js'; | import { validateInput } from '../utils/validation-utils.js'; | ||||
const sendTextMessageRequestInputValidator = tShape({ | const sendTextMessageRequestInputValidator = tShape({ | ||||
threadID: t.String, | threadID: t.String, | ||||
localID: t.maybe(t.String), | localID: t.maybe(t.String), | ||||
text: t.String, | text: t.String, | ||||
sidebarCreation: t.maybe(t.Boolean), | sidebarCreation: t.maybe(t.Boolean), | ||||
}); | }); | ||||
export const sendMessageResponseValidator: TInterface<SendMessageResponse> = | |||||
tShape<SendMessageResponse>({ newMessageInfo: rawMessageInfoValidator }); | |||||
async function textMessageCreationResponder( | async function textMessageCreationResponder( | ||||
viewer: Viewer, | viewer: Viewer, | ||||
input: any, | input: any, | ||||
): Promise<SendMessageResponse> { | ): Promise<SendMessageResponse> { | ||||
const request: SendTextMessageRequest = input; | const request: SendTextMessageRequest = input; | ||||
await validateInput(viewer, sendTextMessageRequestInputValidator, request); | await validateInput(viewer, sendTextMessageRequestInputValidator, request); | ||||
const { threadID, localID, text: rawText, sidebarCreation } = request; | const { threadID, localID, text: rawText, sidebarCreation } = request; | ||||
Show All 37 Lines | ): Promise<SendMessageResponse> { | ||||
return { newMessageInfo: rawMessageInfos[0] }; | return { newMessageInfo: rawMessageInfos[0] }; | ||||
} | } | ||||
const fetchMessageInfosRequestInputValidator = tShape({ | const fetchMessageInfosRequestInputValidator = tShape({ | ||||
cursors: t.dict(t.String, t.maybe(t.String)), | cursors: t.dict(t.String, t.maybe(t.String)), | ||||
numberPerThread: t.maybe(t.Number), | numberPerThread: t.maybe(t.Number), | ||||
}); | }); | ||||
export const fetchMessageInfosResponseValidator: TInterface<FetchMessageInfosResponse> = | |||||
tShape<FetchMessageInfosResponse>({ | |||||
rawMessageInfos: t.list(rawMessageInfoValidator), | |||||
truncationStatuses: messageTruncationStatusesValidator, | |||||
userInfos: userInfosValidator, | |||||
}); | |||||
async function messageFetchResponder( | async function messageFetchResponder( | ||||
viewer: Viewer, | viewer: Viewer, | ||||
input: any, | input: any, | ||||
): Promise<FetchMessageInfosResponse> { | ): Promise<FetchMessageInfosResponse> { | ||||
const request: FetchMessageInfosRequest = input; | const request: FetchMessageInfosRequest = input; | ||||
await validateInput(viewer, fetchMessageInfosRequestInputValidator, request); | await validateInput(viewer, fetchMessageInfosRequestInputValidator, request); | ||||
const response = await fetchMessageInfos( | const response = await fetchMessageInfos( | ||||
viewer, | viewer, | ||||
▲ Show 20 Lines • Show All 171 Lines • ▼ Show 20 Lines | ): Promise<SendMessageResponse> { | ||||
return { newMessageInfo: rawMessageInfos[0] }; | return { newMessageInfo: rawMessageInfos[0] }; | ||||
} | } | ||||
const editMessageRequestInputValidator = tShape({ | const editMessageRequestInputValidator = tShape({ | ||||
targetMessageID: t.String, | targetMessageID: t.String, | ||||
text: t.String, | text: t.String, | ||||
}); | }); | ||||
export const sendEditMessageResponseValidator: TInterface<SendEditMessageResponse> = | |||||
tShape<SendEditMessageResponse>({ | |||||
newMessageInfos: t.list(rawMessageInfoValidator), | |||||
}); | |||||
async function editMessageCreationResponder( | async function editMessageCreationResponder( | ||||
viewer: Viewer, | viewer: Viewer, | ||||
input: any, | input: any, | ||||
): Promise<SendEditMessageResponse> { | ): Promise<SendEditMessageResponse> { | ||||
const request: SendEditMessageRequest = input; | const request: SendEditMessageRequest = input; | ||||
await validateInput(viewer, editMessageRequestInputValidator, input); | await validateInput(viewer, editMessageRequestInputValidator, input); | ||||
const { targetMessageID, text: rawText } = request; | const { targetMessageID, text: rawText } = request; | ||||
▲ Show 20 Lines • Show All 67 Lines • ▼ Show 20 Lines | ): Promise<SendEditMessageResponse> { | ||||
const newMessageInfos = await createMessages(viewer, messagesData); | const newMessageInfos = await createMessages(viewer, messagesData); | ||||
return { newMessageInfos }; | return { newMessageInfos }; | ||||
} | } | ||||
const fetchPinnedMessagesResponderInputValidator = tShape({ | const fetchPinnedMessagesResponderInputValidator = tShape({ | ||||
threadID: t.String, | threadID: t.String, | ||||
}); | }); | ||||
export const fetchPinnedMessagesResultValidator: TInterface<FetchPinnedMessagesResult> = | |||||
tShape<FetchPinnedMessagesResult>({ | |||||
pinnedMessages: t.list(rawMessageInfoValidator), | |||||
}); | |||||
async function fetchPinnedMessagesResponder( | async function fetchPinnedMessagesResponder( | ||||
viewer: Viewer, | viewer: Viewer, | ||||
input: any, | input: any, | ||||
): Promise<FetchPinnedMessagesResult> { | ): Promise<FetchPinnedMessagesResult> { | ||||
const request: FetchPinnedMessagesRequest = input; | const request: FetchPinnedMessagesRequest = input; | ||||
await validateInput( | await validateInput( | ||||
viewer, | viewer, | ||||
fetchPinnedMessagesResponderInputValidator, | fetchPinnedMessagesResponderInputValidator, | ||||
Show All 13 Lines |