Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/responders/message-responders.js
Show All 18 Lines | |||||
import { tShape, tMediaMessageMedia } from 'lib/utils/validation-utils'; | import { tShape, tMediaMessageMedia } from 'lib/utils/validation-utils'; | ||||
import createMessages from '../creators/message-creator'; | import createMessages from '../creators/message-creator'; | ||||
import { | import { | ||||
fetchMessageInfos, | fetchMessageInfos, | ||||
fetchMessageInfoForLocalID, | fetchMessageInfoForLocalID, | ||||
} from '../fetchers/message-fetchers'; | } from '../fetchers/message-fetchers'; | ||||
import { checkThreadPermission } from '../fetchers/thread-permission-fetchers'; | import { checkThreadPermission } from '../fetchers/thread-permission-fetchers'; | ||||
import { fetchMedia } from '../fetchers/upload-fetchers'; | import { | ||||
fetchMedia, | |||||
fetchMediaFromMediaMessageContent, | |||||
} from '../fetchers/upload-fetchers'; | |||||
import type { Viewer } from '../session/viewer'; | import type { Viewer } from '../session/viewer'; | ||||
import { assignMedia } from '../updaters/upload-updaters'; | import { | ||||
assignMedia, | |||||
assignMessageContainerToMedia, | |||||
} from '../updaters/upload-updaters'; | |||||
import { validateInput } from '../utils/validation-utils'; | import { validateInput } from '../utils/validation-utils'; | ||||
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, | ||||
}); | }); | ||||
async function textMessageCreationResponder( | async function textMessageCreationResponder( | ||||
▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | async function multimediaMessageCreationResponder( | ||||
input: any, | input: any, | ||||
): Promise<SendMessageResponse> { | ): Promise<SendMessageResponse> { | ||||
const request: SendMultimediaMessageRequest = input; | const request: SendMultimediaMessageRequest = input; | ||||
await validateInput( | await validateInput( | ||||
viewer, | viewer, | ||||
sendMultimediaMessageRequestInputValidator, | sendMultimediaMessageRequestInputValidator, | ||||
request, | request, | ||||
); | ); | ||||
if (request.mediaIDs) { | |||||
return legacyMultimediaMessageCreationResponder(viewer, request); | return legacyMultimediaMessageCreationResponder(viewer, request); | ||||
} | } | ||||
const { threadID, localID, mediaMessageContents } = request; | |||||
if (mediaMessageContents.length === 0) { | |||||
throw new ServerError('invalid_parameters'); | |||||
} | |||||
const hasPermission = await checkThreadPermission( | |||||
viewer, | |||||
threadID, | |||||
threadPermissions.VOICED, | |||||
); | |||||
if (!hasPermission) { | |||||
throw new ServerError('invalid_parameters'); | |||||
} | |||||
const [media, existingMessageInfo] = await Promise.all([ | |||||
fetchMediaFromMediaMessageContent(viewer, mediaMessageContents), | |||||
fetchMessageInfoForLocalID(viewer, localID), | |||||
]); | |||||
if (media.length !== mediaMessageContents.length && !existingMessageInfo) { | |||||
throw new ServerError('invalid_parameters'); | |||||
} | |||||
const messageData = createMediaMessageData({ | |||||
localID, | |||||
threadID, | |||||
creatorID: viewer.id, | |||||
media, | |||||
}); | |||||
const [newMessageInfo] = await createMessages(viewer, [messageData]); | |||||
const { id } = newMessageInfo; | |||||
invariant( | |||||
id !== null && id !== undefined, | |||||
'serverID should be set in createMessages result', | |||||
); | |||||
await assignMessageContainerToMedia(viewer, mediaMessageContents, id); | |||||
return { newMessageInfo }; | |||||
} | |||||
async function legacyMultimediaMessageCreationResponder( | async function legacyMultimediaMessageCreationResponder( | ||||
viewer: Viewer, | viewer: Viewer, | ||||
request: SendMultimediaMessageRequest, | request: SendMultimediaMessageRequest, | ||||
): Promise<SendMessageResponse> { | ): Promise<SendMessageResponse> { | ||||
const { threadID, localID } = request; | const { threadID, localID } = request; | ||||
const mediaIDs = request.mediaIDs | const mediaIDs = request.mediaIDs | ||||
? request.mediaIDs | ? request.mediaIDs | ||||
: request.mediaMessageContents.map(contents => contents.uploadID); | : request.mediaMessageContents.map(contents => contents.uploadID); | ||||
▲ Show 20 Lines • Show All 45 Lines • Show Last 20 Lines |