diff --git a/keyserver/src/responders/relationship-responders.js b/keyserver/src/responders/relationship-responders.js --- a/keyserver/src/responders/relationship-responders.js +++ b/keyserver/src/responders/relationship-responders.js @@ -10,8 +10,9 @@ legacyFarcasterRelationshipRequestValidator, relationshipActions, type RelationshipRequestUserInfo, + type RelationshipRequestWithRobotext, + type RelationshipRequestWithoutRobotext, type RelationshipRequest, - relationshipActionsList, } from 'lib/types/relationship-types.js'; import { tShape, tUserID } from 'lib/utils/validation-utils.js'; @@ -54,23 +55,40 @@ createRobotextInThinThread: true, }; } - const request = { - action: legacyRequest.action, - users: requestUserInfos, - }; + const { action } = legacyRequest; + let request: RelationshipRequest; + if (action === 'farcaster' || action === 'friend') { + request = { action, users: requestUserInfos }; + } else { + request = { action, users: requestUserInfos }; + } return await updateRelationships(viewer, request); } -export const updateRelationshipInputValidator: TInterface = - tShape({ - action: t.enums.of(relationshipActionsList, 'relationship action'), - users: t.dict( - tUserID, - tShape({ - createRobotextInThinThread: t.Boolean, - }), - ), - }); +export const updateRelationshipInputValidator: TUnion = + t.union([ + tShape({ + action: t.enums.of(['farcaster', 'friend'], 'relationship action'), + users: t.dict( + tUserID, + tShape({ + createRobotextInThinThread: t.Boolean, + }), + ), + }), + tShape({ + action: t.enums.of( + ['unfriend', 'block', 'unblock', 'acknowledge'], + 'relationship action', + ), + users: t.dict( + tUserID, + tShape({ + createRobotextInThinThread: t.maybe(t.Boolean), + }), + ), + }), + ]); async function updateRelationshipsResponder( viewer: Viewer, diff --git a/lib/hooks/relationship-hooks.js b/lib/hooks/relationship-hooks.js --- a/lib/hooks/relationship-hooks.js +++ b/lib/hooks/relationship-hooks.js @@ -21,6 +21,7 @@ type RelationshipAction, type RelationshipErrors, type RelationshipRequestUserInfo, + type RelationshipRequest, relationshipActions, userRelationshipStatus, } from '../types/relationship-types.js'; @@ -172,10 +173,14 @@ planForUser.plan === 'send_to_thin_thread', }; } - const keyserverResultPromise = updateRelationships({ - action, - users: usersForKeyserverCall, - }); + + let request: RelationshipRequest; + if (action === 'farcaster' || action === 'friend') { + request = { action, users: usersForKeyserverCall }; + } else { + request = { action, users: usersForKeyserverCall }; + } + const keyserverResultPromise = updateRelationships(request); const thickThreadPromises: Array> = []; for (const [userID, planForUser] of planForUsers) { @@ -286,18 +291,22 @@ (action !== relationshipActions.FRIEND && action !== relationshipActions.FARCASTER_MUTUAL) ) { - return await updateRelationships({ - action, - users: Object.fromEntries( + let request: RelationshipRequest; + if (action === 'farcaster' || action === 'friend') { + const users = Object.fromEntries( userIDs.map(userID => [ userID, { - // this param only matters for FRIEND and FARCASTER_MUTUAL createRobotextInThinThread: true, }, ]), - ), - }); + ); + request = { action, users }; + } else { + const users = Object.fromEntries(userIDs.map(userID => [userID, {}])); + request = { action, users }; + } + return await updateRelationships(request); } const missingDeviceListsUserIDs: Array = []; diff --git a/lib/types/relationship-types.js b/lib/types/relationship-types.js --- a/lib/types/relationship-types.js +++ b/lib/types/relationship-types.js @@ -92,10 +92,17 @@ export type RelationshipRequestUserInfo = { +createRobotextInThinThread: boolean, }; -export type RelationshipRequest = { - +action: RelationshipAction, +export type RelationshipRequestWithRobotext = { + +action: 'farcaster' | 'friend', +users: { +[userID: string]: RelationshipRequestUserInfo }, }; +export type RelationshipRequestWithoutRobotext = { + +action: 'unfriend' | 'block' | 'unblock' | 'acknowledge', + +users: { +[userID: string]: $Partial }, +}; +export type RelationshipRequest = + | RelationshipRequestWithRobotext + | RelationshipRequestWithoutRobotext; export const legacyFarcasterRelationshipRequestValidator: TInterface = tShape({