dash_sdk/platform/
identities_contract_keys_query.rs

1use dapi_grpc::platform::v0::get_identities_contract_keys_request::GetIdentitiesContractKeysRequestV0;
2use dapi_grpc::platform::v0::get_identities_contract_keys_request::Version::V0;
3use dapi_grpc::platform::v0::GetIdentitiesContractKeysRequest;
4use dpp::identity::Purpose;
5use rs_dapi_client::transport::{
6    AppliedRequestSettings, BoxFuture, TransportError, TransportRequest,
7};
8
9use crate::platform::query::Query;
10use crate::platform::Identifier;
11use crate::Error;
12
13/// Request that is used to query identities' contract keys
14#[derive(Debug, Clone, dash_platform_macros::Mockable)]
15#[cfg_attr(feature = "mocks", derive(serde::Serialize, serde::Deserialize))]
16pub struct IdentitiesContractKeysQuery {
17    /// The identities' identifiers that we want to query
18    pub identities_ids: Vec<Identifier>,
19    /// The contract identifier
20    pub contract_id: Identifier,
21    /// An optional document type if the keys are on a document type instead of the contract
22    pub document_type_name: Option<String>,
23    /// The purposes we want to query for
24    pub purposes: Vec<Purpose>,
25}
26
27impl IdentitiesContractKeysQuery {
28    /// Create new IdentitiesContractKeysQuery for provided identities ids, contract id, the document
29    /// type (if we want to make the query on the document type level), and purposes
30    pub fn new(
31        identities_ids: Vec<Identifier>,
32        contract_id: Identifier,
33        document_type_name: Option<String>,
34        purposes: Vec<Purpose>,
35    ) -> Result<Self, Error> {
36        Ok(Self {
37            identities_ids,
38            contract_id,
39            document_type_name,
40            purposes,
41        })
42    }
43}
44
45impl TryFrom<IdentitiesContractKeysQuery> for GetIdentitiesContractKeysRequest {
46    type Error = Error;
47    fn try_from(dapi_request: IdentitiesContractKeysQuery) -> Result<Self, Self::Error> {
48        let IdentitiesContractKeysQuery {
49            identities_ids,
50            contract_id,
51            document_type_name,
52            purposes,
53        } = dapi_request;
54        //todo: transform this into PlatformVersionedTryFrom
55        Ok(GetIdentitiesContractKeysRequest {
56            version: Some(V0(GetIdentitiesContractKeysRequestV0 {
57                identities_ids: identities_ids.into_iter().map(|a| a.to_vec()).collect(),
58                contract_id: contract_id.to_vec(),
59                document_type_name,
60                purposes: purposes.into_iter().map(|purpose| purpose as i32).collect(),
61                prove: true,
62            })),
63        })
64    }
65}
66
67impl Query<GetIdentitiesContractKeysRequest> for IdentitiesContractKeysQuery {
68    fn query(self, prove: bool) -> Result<GetIdentitiesContractKeysRequest, Error> {
69        let IdentitiesContractKeysQuery {
70            identities_ids,
71            contract_id,
72            document_type_name,
73            purposes,
74        } = self;
75        Ok(GetIdentitiesContractKeysRequest {
76            version: Some(V0(GetIdentitiesContractKeysRequestV0 {
77                identities_ids: identities_ids.into_iter().map(|a| a.to_vec()).collect(),
78                contract_id: contract_id.to_vec(),
79                document_type_name,
80                purposes: purposes.into_iter().map(|purpose| purpose as i32).collect(),
81                prove,
82            })),
83        })
84    }
85}
86
87impl TransportRequest for IdentitiesContractKeysQuery {
88    type Client = <GetIdentitiesContractKeysRequest as TransportRequest>::Client;
89    type Response = <GetIdentitiesContractKeysRequest as TransportRequest>::Response;
90    const SETTINGS_OVERRIDES: rs_dapi_client::RequestSettings =
91        <GetIdentitiesContractKeysRequest as TransportRequest>::SETTINGS_OVERRIDES;
92
93    fn request_name(&self) -> &'static str {
94        "getIdentitiesContractKeysRequest"
95    }
96
97    fn method_name(&self) -> &'static str {
98        "get_identities_contract_keys"
99    }
100
101    fn execute_transport<'c>(
102        self,
103        client: &'c mut Self::Client,
104        settings: &AppliedRequestSettings,
105    ) -> BoxFuture<'c, Result<Self::Response, TransportError>> {
106        let request: GetIdentitiesContractKeysRequest = self
107            .try_into()
108            .expect("IdentitiesContractKeysQuery should always be valid");
109        request.execute_transport(client, settings)
110    }
111}