Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F2925109
D12274.id40838.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
7 KB
Referenced Files
None
Subscribers
None
D12274.id40838.diff
View Options
diff --git a/services/identity/src/database.rs b/services/identity/src/database.rs
--- a/services/identity/src/database.rs
+++ b/services/identity/src/database.rs
@@ -58,7 +58,9 @@
mod one_time_keys;
mod token;
mod workflows;
-pub use device_list::{DeviceListRow, DeviceListUpdate, DeviceRow};
+pub use device_list::{
+ DeviceListRow, DeviceListUpdate, DeviceRow, PlatformDetails,
+};
use self::device_list::Prekey;
diff --git a/services/identity/src/database/device_list.rs b/services/identity/src/database/device_list.rs
--- a/services/identity/src/database/device_list.rs
+++ b/services/identity/src/database/device_list.rs
@@ -901,6 +901,40 @@
Ok(())
}
+ #[tracing::instrument(skip_all)]
+ pub async fn update_device_platform_details(
+ &self,
+ user_id: impl Into<String>,
+ device_id: impl Into<String>,
+ platform_details: PlatformDetails,
+ ) -> Result<(), Error> {
+ self
+ .client
+ .update_item()
+ .table_name(devices_table::NAME)
+ .key(ATTR_USER_ID, AttributeValue::S(user_id.into()))
+ .key(ATTR_ITEM_ID, DeviceIDAttribute(device_id.into()).into())
+ .condition_expression(
+ "attribute_exists(#user_id) AND attribute_exists(#item_id)",
+ )
+ .update_expression("SET #platform_details = :platform_details")
+ .expression_attribute_names("#user_id", ATTR_USER_ID)
+ .expression_attribute_names("#item_id", ATTR_ITEM_ID)
+ .expression_attribute_names("#platform_details", ATTR_PLATFORM_DETAILS)
+ .expression_attribute_values(":platform_details", platform_details.into())
+ .send()
+ .await
+ .map_err(|e| {
+ error!(
+ errorType = error_types::DEVICE_LIST_DB_LOG,
+ "Failed to update device platform details: {:?}", e
+ );
+ Error::AwsSdk(e.into())
+ })?;
+
+ Ok(())
+ }
+
#[tracing::instrument(skip_all)]
pub async fn get_current_device_list(
&self,
diff --git a/services/identity/src/grpc_services/authenticated.rs b/services/identity/src/grpc_services/authenticated.rs
--- a/services/identity/src/grpc_services/authenticated.rs
+++ b/services/identity/src/grpc_services/authenticated.rs
@@ -1,13 +1,13 @@
use std::collections::HashMap;
use crate::config::CONFIG;
-use crate::database::DeviceListUpdate;
+use crate::database::{DeviceListUpdate, PlatformDetails};
use crate::device_list::SignedDeviceList;
use crate::{
client_service::{handle_db_error, UpdateState, WorkflowInProgress},
constants::{error_types, request_metadata},
database::DatabaseClient,
- grpc_services::shared::get_value,
+ grpc_services::shared::{get_platform_metadata, get_value},
};
use chrono::DateTime;
use comm_opaque2::grpc::protocol_error_to_grpc_status;
@@ -705,6 +705,25 @@
};
return Ok(Response::new(response));
}
+
+ #[tracing::instrument(skip_all)]
+ async fn sync_platform_details(
+ &self,
+ request: tonic::Request<Empty>,
+ ) -> Result<Response<Empty>, tonic::Status> {
+ let (user_id, device_id) = get_user_and_device_id(&request)?;
+ let platform_metadata = get_platform_metadata(&request)?;
+ let platform_details = PlatformDetails::new(platform_metadata, None)
+ .map_err(|_| Status::invalid_argument("Invalid platform metadata"))?;
+
+ self
+ .db_client
+ .update_device_platform_details(user_id, device_id, platform_details)
+ .await
+ .map_err(handle_db_error)?;
+
+ Ok(Response::new(Empty {}))
+ }
}
#[allow(dead_code)]
diff --git a/shared/protos/identity_auth.proto b/shared/protos/identity_auth.proto
--- a/shared/protos/identity_auth.proto
+++ b/shared/protos/identity_auth.proto
@@ -84,6 +84,10 @@
/* Miscellaneous actions */
rpc FindUserIdentities(UserIdentitiesRequest) returns (UserIdentitiesResponse) {}
+
+ // Updates current device PlatformDetails stored on Identity Service.
+ // It doesn't require any imput - all values are passed via request metadata.
+ rpc SyncPlatformDetails(identity.unauth.Empty) returns (identity.unauth.Empty) {}
}
// Helper types
diff --git a/web/protobufs/identity-auth-client.cjs b/web/protobufs/identity-auth-client.cjs
--- a/web/protobufs/identity-auth-client.cjs
+++ b/web/protobufs/identity-auth-client.cjs
@@ -1176,5 +1176,66 @@
};
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.identity.unauth.Empty,
+ * !proto.identity.unauth.Empty>}
+ */
+const methodDescriptor_IdentityClientService_SyncPlatformDetails = new grpc.web.MethodDescriptor(
+ '/identity.auth.IdentityClientService/SyncPlatformDetails',
+ grpc.web.MethodType.UNARY,
+ identity_unauth_pb.Empty,
+ identity_unauth_pb.Empty,
+ /**
+ * @param {!proto.identity.unauth.Empty} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ identity_unauth_pb.Empty.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.identity.unauth.Empty} request The
+ * request proto
+ * @param {?Object<string, string>} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.RpcError, ?proto.identity.unauth.Empty)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream<!proto.identity.unauth.Empty>|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.identity.auth.IdentityClientServiceClient.prototype.syncPlatformDetails =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/identity.auth.IdentityClientService/SyncPlatformDetails',
+ request,
+ metadata || {},
+ methodDescriptor_IdentityClientService_SyncPlatformDetails,
+ callback);
+};
+
+
+/**
+ * @param {!proto.identity.unauth.Empty} request The
+ * request proto
+ * @param {?Object<string, string>=} metadata User defined
+ * call metadata
+ * @return {!Promise<!proto.identity.unauth.Empty>}
+ * Promise that resolves to the response
+ */
+proto.identity.auth.IdentityClientServicePromiseClient.prototype.syncPlatformDetails =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/identity.auth.IdentityClientService/SyncPlatformDetails',
+ request,
+ metadata || {},
+ methodDescriptor_IdentityClientService_SyncPlatformDetails);
+};
+
+
module.exports = proto.identity.auth;
diff --git a/web/protobufs/identity-auth-client.cjs.flow b/web/protobufs/identity-auth-client.cjs.flow
--- a/web/protobufs/identity-auth-client.cjs.flow
+++ b/web/protobufs/identity-auth-client.cjs.flow
@@ -136,6 +136,13 @@
callback: (err: grpcWeb.RpcError,
response: identityAuthStructs.UserIdentitiesResponse) => void
): grpcWeb.ClientReadableStream<identityAuthStructs.UserIdentitiesResponse>;
+
+ syncPlatformDetails(
+ request: identityStructs.Empty,
+ metadata: grpcWeb.Metadata | void,
+ callback: (err: grpcWeb.RpcError,
+ response: identityStructs.Empty) => void
+ ): grpcWeb.ClientReadableStream<identityStructs.Empty>;
}
declare export class IdentityClientServicePromiseClient {
@@ -232,5 +239,11 @@
request: identityAuthStructs.UserIdentitiesRequest,
metadata?: grpcWeb.Metadata
): Promise<identityAuthStructs.UserIdentitiesResponse>;
+
+ syncPlatformDetails(
+ request: identityStructs.Empty,
+ metadata?: grpcWeb.Metadata
+ ): Promise<identityStructs.Empty>;
+
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Oct 9, 2:52 AM (21 h, 18 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2267437
Default Alt Text
D12274.id40838.diff (7 KB)
Attached To
Mode
D12274: [identity][protos] Add RPC to update PlatformDetails
Attached
Detach File
Event Timeline
Log In to Comment