Changeset View
Changeset View
Standalone View
Standalone View
lib/shared/messages/update-relationship-message-spec.js
// @flow | // @flow | ||||
import invariant from 'invariant'; | import invariant from 'invariant'; | ||||
import { | import { | ||||
type CreateMessageInfoParams, | type CreateMessageInfoParams, | ||||
type MessageSpec, | type MessageSpec, | ||||
pushTypes, | pushTypes, | ||||
} from './message-spec.js'; | } from './message-spec.js'; | ||||
import { assertSingleMessageInfo } from './utils.js'; | import { assertSingleMessageInfo } from './utils.js'; | ||||
import { messageTypes } from '../../types/message-types-enum.js'; | import { messageTypes } from '../../types/message-types-enum.js'; | ||||
import type { | import type { | ||||
ClientDBMessageInfo, | ClientDBMessageInfo, | ||||
MessageInfo, | MessageInfo, | ||||
} from '../../types/message-types.js'; | } from '../../types/message-types.js'; | ||||
import { | import { | ||||
type RawUpdateRelationshipMessageInfo, | type RawLegacyUpdateRelationshipMessageInfo, | ||||
rawUpdateRelationshipMessageInfoValidator, | rawLegacyUpdateRelationshipMessageInfoValidator, | ||||
type UpdateRelationshipMessageData, | type LegacyUpdateRelationshipMessageData, | ||||
type UpdateRelationshipMessageInfo, | type LegacyUpdateRelationshipMessageInfo, | ||||
} from '../../types/messages/update-relationship.js'; | } from '../../types/messages/legacy-update-relationship.js'; | ||||
import type { ThreadInfo } from '../../types/minimally-encoded-thread-permissions-types.js'; | import type { ThreadInfo } from '../../types/minimally-encoded-thread-permissions-types.js'; | ||||
import type { NotifTexts } from '../../types/notif-types.js'; | import type { NotifTexts } from '../../types/notif-types.js'; | ||||
import type { RelativeUserInfo } from '../../types/user-types.js'; | import type { RelativeUserInfo } from '../../types/user-types.js'; | ||||
import { type EntityText, ET } from '../../utils/entity-text.js'; | import { type EntityText, ET } from '../../utils/entity-text.js'; | ||||
type UpdateRelationshipMessageSpec = MessageSpec< | type UpdateRelationshipMessageSpec = MessageSpec< | ||||
UpdateRelationshipMessageData, | LegacyUpdateRelationshipMessageData, | ||||
RawUpdateRelationshipMessageInfo, | RawLegacyUpdateRelationshipMessageInfo, | ||||
UpdateRelationshipMessageInfo, | LegacyUpdateRelationshipMessageInfo, | ||||
> & { | > & { | ||||
// We need to explicitly type this as non-optional so that | // We need to explicitly type this as non-optional so that | ||||
// it can be referenced from messageContentForClientDB below | // it can be referenced from messageContentForClientDB below | ||||
+messageContentForServerDB: ( | +messageContentForServerDB: ( | ||||
data: UpdateRelationshipMessageData | RawUpdateRelationshipMessageInfo, | data: | ||||
| LegacyUpdateRelationshipMessageData | |||||
| RawLegacyUpdateRelationshipMessageInfo, | |||||
) => string, | ) => string, | ||||
... | ... | ||||
}; | }; | ||||
export const updateRelationshipMessageSpec: UpdateRelationshipMessageSpec = | export const updateRelationshipMessageSpec: UpdateRelationshipMessageSpec = | ||||
Object.freeze({ | Object.freeze({ | ||||
messageContentForServerDB( | messageContentForServerDB( | ||||
data: UpdateRelationshipMessageData | RawUpdateRelationshipMessageInfo, | data: | ||||
| LegacyUpdateRelationshipMessageData | |||||
| RawLegacyUpdateRelationshipMessageInfo, | |||||
): string { | ): string { | ||||
return JSON.stringify({ | return JSON.stringify({ | ||||
operation: data.operation, | operation: data.operation, | ||||
targetID: data.targetID, | targetID: data.targetID, | ||||
}); | }); | ||||
}, | }, | ||||
messageContentForClientDB(data: RawUpdateRelationshipMessageInfo): string { | messageContentForClientDB( | ||||
data: RawLegacyUpdateRelationshipMessageInfo, | |||||
): string { | |||||
return updateRelationshipMessageSpec.messageContentForServerDB(data); | return updateRelationshipMessageSpec.messageContentForServerDB(data); | ||||
}, | }, | ||||
rawMessageInfoFromServerDBRow( | rawMessageInfoFromServerDBRow( | ||||
row: Object, | row: Object, | ||||
): RawUpdateRelationshipMessageInfo { | ): RawLegacyUpdateRelationshipMessageInfo { | ||||
const content = JSON.parse(row.content); | const content = JSON.parse(row.content); | ||||
return { | return { | ||||
type: messageTypes.LEGACY_UPDATE_RELATIONSHIP, | type: messageTypes.LEGACY_UPDATE_RELATIONSHIP, | ||||
id: row.id.toString(), | id: row.id.toString(), | ||||
threadID: row.threadID.toString(), | threadID: row.threadID.toString(), | ||||
time: row.time, | time: row.time, | ||||
creatorID: row.creatorID.toString(), | creatorID: row.creatorID.toString(), | ||||
targetID: content.targetID, | targetID: content.targetID, | ||||
operation: content.operation, | operation: content.operation, | ||||
}; | }; | ||||
}, | }, | ||||
rawMessageInfoFromClientDB( | rawMessageInfoFromClientDB( | ||||
clientDBMessageInfo: ClientDBMessageInfo, | clientDBMessageInfo: ClientDBMessageInfo, | ||||
): RawUpdateRelationshipMessageInfo { | ): RawLegacyUpdateRelationshipMessageInfo { | ||||
invariant( | invariant( | ||||
clientDBMessageInfo.content !== undefined && | clientDBMessageInfo.content !== undefined && | ||||
clientDBMessageInfo.content !== null, | clientDBMessageInfo.content !== null, | ||||
'content must be defined for UpdateRelationship', | 'content must be defined for UpdateRelationship', | ||||
); | ); | ||||
const content = JSON.parse(clientDBMessageInfo.content); | const content = JSON.parse(clientDBMessageInfo.content); | ||||
const rawUpdateRelationshipMessageInfo: RawUpdateRelationshipMessageInfo = | const rawUpdateRelationshipMessageInfo: RawLegacyUpdateRelationshipMessageInfo = | ||||
{ | { | ||||
type: messageTypes.LEGACY_UPDATE_RELATIONSHIP, | type: messageTypes.LEGACY_UPDATE_RELATIONSHIP, | ||||
id: clientDBMessageInfo.id, | id: clientDBMessageInfo.id, | ||||
threadID: clientDBMessageInfo.thread, | threadID: clientDBMessageInfo.thread, | ||||
time: parseInt(clientDBMessageInfo.time), | time: parseInt(clientDBMessageInfo.time), | ||||
creatorID: clientDBMessageInfo.user, | creatorID: clientDBMessageInfo.user, | ||||
targetID: content.targetID, | targetID: content.targetID, | ||||
operation: content.operation, | operation: content.operation, | ||||
}; | }; | ||||
return rawUpdateRelationshipMessageInfo; | return rawUpdateRelationshipMessageInfo; | ||||
}, | }, | ||||
createMessageInfo( | createMessageInfo( | ||||
rawMessageInfo: RawUpdateRelationshipMessageInfo, | rawMessageInfo: RawLegacyUpdateRelationshipMessageInfo, | ||||
creator: RelativeUserInfo, | creator: RelativeUserInfo, | ||||
params: CreateMessageInfoParams, | params: CreateMessageInfoParams, | ||||
): ?UpdateRelationshipMessageInfo { | ): ?LegacyUpdateRelationshipMessageInfo { | ||||
const target = params.createRelativeUserInfos([ | const target = params.createRelativeUserInfos([ | ||||
rawMessageInfo.targetID, | rawMessageInfo.targetID, | ||||
])[0]; | ])[0]; | ||||
if (!target) { | if (!target) { | ||||
return null; | return null; | ||||
} | } | ||||
return { | return { | ||||
type: messageTypes.LEGACY_UPDATE_RELATIONSHIP, | type: messageTypes.LEGACY_UPDATE_RELATIONSHIP, | ||||
id: rawMessageInfo.id, | id: rawMessageInfo.id, | ||||
threadID: rawMessageInfo.threadID, | threadID: rawMessageInfo.threadID, | ||||
creator, | creator, | ||||
target, | target, | ||||
time: rawMessageInfo.time, | time: rawMessageInfo.time, | ||||
operation: rawMessageInfo.operation, | operation: rawMessageInfo.operation, | ||||
}; | }; | ||||
}, | }, | ||||
rawMessageInfoFromMessageData( | rawMessageInfoFromMessageData( | ||||
messageData: UpdateRelationshipMessageData, | messageData: LegacyUpdateRelationshipMessageData, | ||||
id: ?string, | id: ?string, | ||||
): RawUpdateRelationshipMessageInfo { | ): RawLegacyUpdateRelationshipMessageInfo { | ||||
invariant(id, 'RawUpdateRelationshipMessageInfo needs id'); | invariant(id, 'RawUpdateRelationshipMessageInfo needs id'); | ||||
return { ...messageData, id }; | return { ...messageData, id }; | ||||
}, | }, | ||||
// ESLint doesn't recognize that invariant always throws | // ESLint doesn't recognize that invariant always throws | ||||
// eslint-disable-next-line consistent-return | // eslint-disable-next-line consistent-return | ||||
robotext(messageInfo: UpdateRelationshipMessageInfo): EntityText { | robotext(messageInfo: LegacyUpdateRelationshipMessageInfo): EntityText { | ||||
const creator = ET.user({ userInfo: messageInfo.creator }); | const creator = ET.user({ userInfo: messageInfo.creator }); | ||||
if (messageInfo.operation === 'request_sent') { | if (messageInfo.operation === 'request_sent') { | ||||
const target = ET.user({ userInfo: messageInfo.target }); | const target = ET.user({ userInfo: messageInfo.target }); | ||||
return ET`${creator} sent ${target} a friend request`; | return ET`${creator} sent ${target} a friend request`; | ||||
} else if (messageInfo.operation === 'request_accepted') { | } else if (messageInfo.operation === 'request_accepted') { | ||||
const targetPossessive = ET.user({ | const targetPossessive = ET.user({ | ||||
userInfo: messageInfo.target, | userInfo: messageInfo.target, | ||||
possessive: true, | possessive: true, | ||||
}); | }); | ||||
return ET`${creator} accepted ${targetPossessive} friend request`; | return ET`${creator} accepted ${targetPossessive} friend request`; | ||||
} | } | ||||
invariant( | invariant( | ||||
false, | false, | ||||
`Invalid operation ${messageInfo.operation} ` + | `Invalid operation ${messageInfo.operation} ` + | ||||
`of message with type ${messageInfo.type}`, | `of message with type ${messageInfo.type}`, | ||||
); | ); | ||||
}, | }, | ||||
unshimMessageInfo( | unshimMessageInfo( | ||||
unwrapped: RawUpdateRelationshipMessageInfo, | unwrapped: RawLegacyUpdateRelationshipMessageInfo, | ||||
): RawUpdateRelationshipMessageInfo { | ): RawLegacyUpdateRelationshipMessageInfo { | ||||
return unwrapped; | return unwrapped; | ||||
}, | }, | ||||
async notificationTexts( | async notificationTexts( | ||||
messageInfos: $ReadOnlyArray<MessageInfo>, | messageInfos: $ReadOnlyArray<MessageInfo>, | ||||
threadInfo: ThreadInfo, | threadInfo: ThreadInfo, | ||||
): Promise<NotifTexts> { | ): Promise<NotifTexts> { | ||||
const messageInfo = assertSingleMessageInfo(messageInfos); | const messageInfo = assertSingleMessageInfo(messageInfos); | ||||
Show All 14 Lines | Object.freeze({ | ||||
}, | }, | ||||
generatesNotifs: async () => pushTypes.NOTIF, | generatesNotifs: async () => pushTypes.NOTIF, | ||||
canBeSidebarSource: true, | canBeSidebarSource: true, | ||||
canBePinned: false, | canBePinned: false, | ||||
validator: rawUpdateRelationshipMessageInfoValidator, | validator: rawLegacyUpdateRelationshipMessageInfoValidator, | ||||
}); | }); |