Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/responders/message-responders.js
Show All 9 Lines | |||||
} 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 { | import { | ||||
messageTypes, | messageTypes, | ||||
type SendTextMessageRequest, | type SendTextMessageRequest, | ||||
type SendMultimediaMessageRequest, | type SendMultimediaMessageRequest, | ||||
type SendReactionMessageRequest, | type SendReactionMessageRequest, | ||||
type SendEditMessageRequest, | |||||
type FetchMessageInfosResponse, | type FetchMessageInfosResponse, | ||||
type FetchMessageInfosRequest, | type FetchMessageInfosRequest, | ||||
defaultNumberPerThread, | defaultNumberPerThread, | ||||
type SendMessageResponse, | type SendMessageResponse, | ||||
type SendEditMessageResponse, | |||||
} from 'lib/types/message-types.js'; | } from 'lib/types/message-types.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 { ServerError } from 'lib/utils/errors.js'; | import { ServerError } from 'lib/utils/errors.js'; | ||||
import { | import { | ||||
tRegex, | tRegex, | ||||
tShape, | tShape, | ||||
tMediaMessageMedia, | tMediaMessageMedia, | ||||
▲ Show 20 Lines • Show All 250 Lines • ▼ Show 20 Lines | if (localID) { | ||||
messageData = { ...messageData, localID }; | messageData = { ...messageData, localID }; | ||||
} | } | ||||
const rawMessageInfos = await createMessages(viewer, [messageData]); | const rawMessageInfos = await createMessages(viewer, [messageData]); | ||||
return { newMessageInfo: rawMessageInfos[0] }; | return { newMessageInfo: rawMessageInfos[0] }; | ||||
} | } | ||||
const editMessageRequestInputValidator = tShape({ | |||||
targetMessageID: t.String, | |||||
text: t.String, | |||||
}); | |||||
async function editMessageCreationResponder( | |||||
viewer: Viewer, | |||||
input: any, | |||||
): Promise<SendEditMessageResponse> { | |||||
const request: SendEditMessageRequest = input; | |||||
await validateInput(viewer, editMessageRequestInputValidator, input); | |||||
const { targetMessageID, text: rawText } = request; | |||||
const text = trimMessage(rawText); | |||||
if (!targetMessageID || !text) { | |||||
throw new ServerError('invalid_parameters'); | |||||
} | |||||
const targetMessageInfo = await fetchMessageInfoByID(viewer, targetMessageID); | |||||
if (!targetMessageInfo || !targetMessageInfo.id) { | |||||
throw new ServerError('invalid_parameters'); | |||||
} | |||||
if (targetMessageInfo.type !== messageTypes.TEXT) { | |||||
throw new ServerError('invalid_parameters'); | |||||
} | |||||
const { threadID } = targetMessageInfo; | |||||
const [serverThreadInfos, hasPermission] = await Promise.all([ | |||||
fetchServerThreadInfos(SQL`t.id = ${threadID}`), | |||||
checkThreadPermission(viewer, threadID, threadPermissions.EDIT_MESSAGE), | |||||
]); | |||||
const targetMessageThreadInfo = serverThreadInfos.threadInfos[threadID]; | |||||
if (targetMessageThreadInfo.sourceMessageID === targetMessageID) { | |||||
// We are editing first message of the sidebar | |||||
// If client wants to do that it sends id of the sourceMessage instead | |||||
throw new ServerError('invalid_parameters'); | |||||
} | |||||
if (!hasPermission) { | |||||
throw new ServerError('invalid_parameters'); | |||||
} | |||||
if (targetMessageInfo.creatorID !== viewer.id) { | |||||
throw new ServerError('invalid_parameters'); | |||||
} | |||||
const messagesData = []; | |||||
const messageData: EditMessageData = { | |||||
type: messageTypes.EDIT_MESSAGE, | |||||
threadID, | |||||
creatorID: viewer.id, | |||||
time: Date.now(), | |||||
targetMessageID, | |||||
text, | |||||
}; | |||||
messagesData.push(messageData); | |||||
const newMessageInfos = await createMessages(viewer, messagesData); | |||||
return { newMessageInfos }; | |||||
} | |||||
export { | export { | ||||
textMessageCreationResponder, | textMessageCreationResponder, | ||||
messageFetchResponder, | messageFetchResponder, | ||||
multimediaMessageCreationResponder, | multimediaMessageCreationResponder, | ||||
reactionMessageCreationResponder, | reactionMessageCreationResponder, | ||||
editMessageCreationResponder, | |||||
}; | }; |