diff --git a/lib/shared/dm-ops/dm-op-specs.js b/lib/shared/dm-ops/dm-op-specs.js index c0e9dc348..6830805d9 100644 --- a/lib/shared/dm-ops/dm-op-specs.js +++ b/lib/shared/dm-ops/dm-op-specs.js @@ -1,43 +1,45 @@ // @flow import { addMembersSpec } from './add-members-spec.js'; import { addViewerToThreadMembersSpec } from './add-viewer-to-thread-members-spec.js'; import { changeThreadReadStatusSpec } from './change-thread-read-status-spec.js'; import { changeThreadSettingsSpec } from './change-thread-settings-spec.js'; import { changeThreadSubscriptionSpec } from './change-thread-subscription.js'; import { createEntrySpec } from './create-entry-spec.js'; import { createSidebarSpec } from './create-sidebar-spec.js'; import { createThreadSpec } from './create-thread-spec.js'; import { deleteEntrySpec } from './delete-entry-spec.js'; import type { DMOperationSpec } from './dm-op-spec.js'; import { editEntrySpec } from './edit-entry-spec.js'; import { joinThreadSpec } from './join-thread-spec.js'; import { leaveThreadSpec } from './leave-thread-spec.js'; import { removeMembersSpec } from './remove-members-spec.js'; import { sendEditMessageSpec } from './send-edit-message-spec.js'; import { sendMultimediaMessageSpec } from './send-multimedia-message-spec.js'; import { sendReactionMessageSpec } from './send-reaction-message-spec.js'; import { sendTextMessageSpec } from './send-text-message-spec.js'; +import { updateRelationshipSpec } from './update-relationship-spec.js'; import { type DMOperationType, dmOperationTypes } from '../../types/dm-ops.js'; export const dmOpSpecs: { +[DMOperationType]: DMOperationSpec, } = Object.freeze({ [dmOperationTypes.CREATE_THREAD]: createThreadSpec, [dmOperationTypes.CREATE_SIDEBAR]: createSidebarSpec, [dmOperationTypes.SEND_TEXT_MESSAGE]: sendTextMessageSpec, [dmOperationTypes.SEND_MULTIMEDIA_MESSAGE]: sendMultimediaMessageSpec, [dmOperationTypes.SEND_REACTION_MESSAGE]: sendReactionMessageSpec, [dmOperationTypes.SEND_EDIT_MESSAGE]: sendEditMessageSpec, [dmOperationTypes.ADD_MEMBERS]: addMembersSpec, [dmOperationTypes.ADD_VIEWER_TO_THREAD_MEMBERS]: addViewerToThreadMembersSpec, [dmOperationTypes.JOIN_THREAD]: joinThreadSpec, [dmOperationTypes.LEAVE_THREAD]: leaveThreadSpec, [dmOperationTypes.REMOVE_MEMBERS]: removeMembersSpec, [dmOperationTypes.CHANGE_THREAD_SETTINGS]: changeThreadSettingsSpec, [dmOperationTypes.CHANGE_THREAD_SUBSCRIPTION]: changeThreadSubscriptionSpec, [dmOperationTypes.CHANGE_THREAD_READ_STATUS]: changeThreadReadStatusSpec, [dmOperationTypes.CREATE_ENTRY]: createEntrySpec, [dmOperationTypes.DELETE_ENTRY]: deleteEntrySpec, [dmOperationTypes.EDIT_ENTRY]: editEntrySpec, + [dmOperationTypes.UPDATE_RELATIONSHIP]: updateRelationshipSpec, }); diff --git a/lib/shared/dm-ops/update-relationship-spec.js b/lib/shared/dm-ops/update-relationship-spec.js new file mode 100644 index 000000000..271fb91a3 --- /dev/null +++ b/lib/shared/dm-ops/update-relationship-spec.js @@ -0,0 +1,110 @@ +// @flow + +import type { + DMOperationSpec, + ProcessDMOperationUtilities, +} from './dm-op-spec.js'; +import type { DMUpdateRelationshipOperation } from '../../types/dm-ops.js'; +import { messageTypes } from '../../types/message-types-enum.js'; +import { rawMessageInfoFromMessageData } from '../message-utils.js'; + +async function createMessageDataFromDMOperation( + dmOperation: DMUpdateRelationshipOperation, + viewerID: string, + utilities: ProcessDMOperationUtilities, +) { + const { threadID, creatorID, time, operation } = dmOperation; + if (operation !== 'farcaster_mutual') { + return { + type: messageTypes.UPDATE_RELATIONSHIP, + threadID, + creatorID, + targetID: viewerID, + time, + operation, + }; + } + const { findUserIdentities } = utilities; + const { identities: userIdentities } = await findUserIdentities([ + creatorID, + viewerID, + ]); + const creatorFID = userIdentities[creatorID]?.farcasterID; + const targetFID = userIdentities[viewerID]?.farcasterID; + if (!creatorFID || !targetFID) { + const errorMap = { creatorID: creatorFID, viewerID: targetFID }; + throw new Error( + 'could not fetch FID for either creator or target: ' + + JSON.stringify(errorMap), + ); + } + return { + type: messageTypes.UPDATE_RELATIONSHIP, + threadID, + creatorID, + creatorFID, + targetID: viewerID, + targetFID, + time, + operation, + }; +} + +const updateRelationshipSpec: DMOperationSpec = + Object.freeze({ + notificationsCreationData: async ( + dmOperation: DMUpdateRelationshipOperation, + viewerID: string, + utilities: ProcessDMOperationUtilities, + ) => { + const messageData = await createMessageDataFromDMOperation( + dmOperation, + viewerID, + utilities, + ); + return { messageDatas: [messageData] }; + }, + processDMOperation: async ( + dmOperation: DMUpdateRelationshipOperation, + viewerID: string, + utilities: ProcessDMOperationUtilities, + ) => { + const { messageID } = dmOperation; + const messageData = await createMessageDataFromDMOperation( + dmOperation, + viewerID, + utilities, + ); + const rawMessageInfos = [ + rawMessageInfoFromMessageData(messageData, messageID), + ]; + return { + rawMessageInfos, + updateInfos: [], + }; + }, + canBeProcessed: async ( + dmOperation: DMUpdateRelationshipOperation, + viewerID: string, + utilities: ProcessDMOperationUtilities, + ) => { + try { + await createMessageDataFromDMOperation( + dmOperation, + viewerID, + utilities, + ); + return { + isProcessingPossible: true, + }; + } catch (e) { + return { + isProcessingPossible: false, + reason: { type: 'invalid' }, + }; + } + }, + supportsAutoRetry: true, + }); + +export { updateRelationshipSpec };