diff --git a/keyserver/addons/rust-node-addon/src/identity_client/get_farcaster_users.rs b/keyserver/addons/rust-node-addon/src/identity_client/get_farcaster_users.rs --- a/keyserver/addons/rust-node-addon/src/identity_client/get_farcaster_users.rs +++ b/keyserver/addons/rust-node-addon/src/identity_client/get_farcaster_users.rs @@ -25,6 +25,7 @@ user_id: farcaster_user.user_id, username: farcaster_user.username, farcaster_id: farcaster_user.farcaster_id, + supports_farcaster_dcs: farcaster_user.has_farcaster_dcs_token, }) .collect(); @@ -40,4 +41,6 @@ pub username: String, #[napi(js_name = "farcasterID")] pub farcaster_id: String, + #[napi(js_name = "supportsFarcasterDCs")] + pub supports_farcaster_dcs: bool, } diff --git a/lib/reducers/aux-user-reducer.test.js b/lib/reducers/aux-user-reducer.test.js --- a/lib/reducers/aux-user-reducer.test.js +++ b/lib/reducers/aux-user-reducer.test.js @@ -33,6 +33,7 @@ userID: 'userID_2', username: 'username_2', farcasterID: 'farcasterID_2', + supportsFarcasterDCs: false, }, ], }, diff --git a/lib/types/aux-user-types.js b/lib/types/aux-user-types.js --- a/lib/types/aux-user-types.js +++ b/lib/types/aux-user-types.js @@ -21,11 +21,6 @@ +accountMissingStatus?: AccountMissingFromIdentityStatus, }; -export type LocalFarcasterUser = { - ...FarcasterUser, - +supportsFarcasterDCs?: boolean, -}; - export type AuxUserInfos = { +[userID: string]: AuxUserInfo }; export type AuxUserStore = { @@ -33,11 +28,11 @@ }; export type SetAuxUserFIDsPayload = { - +farcasterUsers: $ReadOnlyArray, + +farcasterUsers: $ReadOnlyArray, }; export type AddAuxUserFIDsPayload = { - +farcasterUsers: $ReadOnlyArray, + +farcasterUsers: $ReadOnlyArray, }; export type RemovePeerUsersPayload = { diff --git a/lib/types/identity-service-types.js b/lib/types/identity-service-types.js --- a/lib/types/identity-service-types.js +++ b/lib/types/identity-service-types.js @@ -100,6 +100,7 @@ +userID: string, +username: string, +farcasterID: string, + +supportsFarcasterDCs: boolean, }; export const farcasterUserValidator: TInterface = @@ -107,6 +108,7 @@ userID: tUserID, username: t.String, farcasterID: t.String, + supportsFarcasterDCs: t.Boolean, }); export const farcasterUsersValidator: TList> = t.list( diff --git a/native/native_rust_library/src/identity/farcaster.rs b/native/native_rust_library/src/identity/farcaster.rs --- a/native/native_rust_library/src/identity/farcaster.rs +++ b/native/native_rust_library/src/identity/farcaster.rs @@ -22,6 +22,8 @@ username: String, #[serde(rename = "farcasterID")] farcaster_id: String, + #[serde(rename = "supportsFarcasterDCs")] + supports_farcaster_dcs: bool, } pub mod ffi { @@ -117,6 +119,7 @@ user_id: farcaster_user.user_id, username: farcaster_user.username, farcaster_id: farcaster_user.farcaster_id, + supports_farcaster_dcs: farcaster_user.has_farcaster_dcs_token, }) .collect(); diff --git a/services/identity/src/database/farcaster.rs b/services/identity/src/database/farcaster.rs --- a/services/identity/src/database/farcaster.rs +++ b/services/identity/src/database/farcaster.rs @@ -341,11 +341,14 @@ }; let farcaster_id = attrs.take_attr(USERS_TABLE_FARCASTER_ID_ATTRIBUTE_NAME)?; + let farcaster_dcs_token: Option = + attrs.take_attr(USERS_TABLE_FARCASTER_DCS_TOKEN_ATTRIBUTE_NAME)?; Ok(Self(FarcasterUser { user_id, username, farcaster_id, + has_farcaster_dcs_token: farcaster_dcs_token.is_some(), })) } } diff --git a/services/terraform/modules/shared/dynamodb.tf b/services/terraform/modules/shared/dynamodb.tf --- a/services/terraform/modules/shared/dynamodb.tf +++ b/services/terraform/modules/shared/dynamodb.tf @@ -206,7 +206,7 @@ name = "farcasterID-index" hash_key = "farcasterID" projection_type = "INCLUDE" - non_key_attributes = ["walletAddress", "username"] + non_key_attributes = ["walletAddress", "username", "farcasterDCsToken"] } global_secondary_index { diff --git a/shared/protos/identity_unauth.proto b/shared/protos/identity_unauth.proto --- a/shared/protos/identity_unauth.proto +++ b/shared/protos/identity_unauth.proto @@ -349,4 +349,5 @@ string user_id = 1; string farcaster_id = 2; string username = 3; + bool has_farcaster_dcs_token = 4; } diff --git a/web/grpc/identity-service-client-wrapper.js b/web/grpc/identity-service-client-wrapper.js --- a/web/grpc/identity-service-client-wrapper.js +++ b/web/grpc/identity-service-client-wrapper.js @@ -630,6 +630,7 @@ userID: user.getUserId(), username: user.getUsername(), farcasterID: user.getFarcasterId(), + supportsFarcasterDCs: user.getHasFarcasterDcsToken(), }); } diff --git a/web/protobufs/identity-unauth-structs.cjs b/web/protobufs/identity-unauth-structs.cjs --- a/web/protobufs/identity-unauth-structs.cjs +++ b/web/protobufs/identity-unauth-structs.cjs @@ -6057,7 +6057,8 @@ var f, obj = { userId: jspb.Message.getFieldWithDefault(msg, 1, ""), farcasterId: jspb.Message.getFieldWithDefault(msg, 2, ""), - username: jspb.Message.getFieldWithDefault(msg, 3, "") + username: jspb.Message.getFieldWithDefault(msg, 3, ""), + hasFarcasterDcsToken: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -6106,6 +6107,10 @@ var value = /** @type {string} */ (reader.readString()); msg.setUsername(value); break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setHasFarcasterDcsToken(value); + break; default: reader.skipField(); break; @@ -6156,6 +6161,13 @@ f ); } + f = message.getHasFarcasterDcsToken(); + if (f) { + writer.writeBool( + 4, + f + ); + } }; @@ -6213,6 +6225,24 @@ }; +/** + * optional bool has_farcaster_dcs_token = 4; + * @return {boolean} + */ +proto.identity.unauth.FarcasterUser.prototype.getHasFarcasterDcsToken = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.identity.unauth.FarcasterUser} returns this + */ +proto.identity.unauth.FarcasterUser.prototype.setHasFarcasterDcsToken = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + /** * @enum {number} */ diff --git a/web/protobufs/identity-unauth-structs.cjs.flow b/web/protobufs/identity-unauth-structs.cjs.flow --- a/web/protobufs/identity-unauth-structs.cjs.flow +++ b/web/protobufs/identity-unauth-structs.cjs.flow @@ -674,6 +674,9 @@ getUsername(): string; setUsername(value: string): FarcasterUser; + getHasFarcasterDcsToken(): boolean; + setHasFarcasterDcsToken(value: boolean): FarcasterUser; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): FarcasterUserObject; static toObject(includeInstance: boolean, msg: FarcasterUser): FarcasterUserObject; @@ -686,6 +689,7 @@ userId: string, farcasterId: string, username: string, + hasFarcasterDcsToken: boolean, } export type DeviceType = 0 | 1 | 2 | 3 | 4 | 5;