desmos_bindings/relationships/
querier.rs

1//! Contains a querier to query data from the Desmos x/relationships module.
2
3#[cfg(feature = "iterators")]
4use crate::{
5    iter::page_iterator::{Page, PageIterator},
6    relationships::types::{Relationship, UserBlock},
7};
8#[cfg(feature = "iterators")]
9use cosmwasm_std::Binary;
10
11use crate::cosmos_types::PageRequest;
12use crate::relationships::types::*;
13use cosmwasm_std::{Addr, Empty, QuerierWrapper, StdResult};
14
15/// Querier allows to query data from the Desmos x/relationships module.
16pub struct RelationshipsQuerier<'a> {
17    querier: crate::relationships::types::RelationshipsQuerier<'a, Empty>,
18}
19
20impl<'a> RelationshipsQuerier<'a> {
21    /// Creates a new instance of [`RelationshipsQuerier`].
22    ///
23    /// # Example
24    /// ```
25    /// use cosmwasm_std::{DepsMut, MessageInfo};
26    /// use desmos_bindings::relationships::querier::RelationshipsQuerier;
27    ///
28    /// pub fn contract_action(deps: DepsMut, _: MessageInfo) {
29    ///     let querier = RelationshipsQuerier::new(&deps.querier);
30    /// }
31    /// ```
32    pub fn new(querier: &'a QuerierWrapper<'a, Empty>) -> Self {
33        Self {
34            querier: crate::relationships::types::RelationshipsQuerier::new(querier),
35        }
36    }
37
38    /// Queries the relationships inside a subspaces.
39    ///
40    /// * `subspace_id` - Subspace to query the relationships for.
41    /// * `user` - Optional address of the user for which to query the relationships.
42    /// * `counterparty` - Optional address of the counterparty of the relationships (used only if the
43    /// `user` is provided).
44    /// * `pagination` - Optional pagination configs.
45    pub fn query_relationships(
46        &self,
47        subspace_id: u64,
48        user: Option<Addr>,
49        counterparty: Option<Addr>,
50        pagination: Option<PageRequest>,
51    ) -> StdResult<QueryRelationshipsResponse> {
52        self.querier.relationships(
53            subspace_id,
54            user.unwrap_or_else(|| Addr::unchecked("")).into(),
55            counterparty.unwrap_or_else(|| Addr::unchecked("")).into(),
56            pagination.map(Into::into),
57        )
58    }
59
60    /// Gives an iterator to scan over a user's relationships created in a subspace or
61    /// all the relationships created in a subspace.
62    ///
63    /// * `subspace_id` - Subspace to query the relationships for.
64    /// * `user` - Optional address of the user for which to query the relationships.
65    /// * `page_size` - Size of the page requested to the chain.
66    #[cfg(feature = "iterators")]
67    pub fn iterate_relationships(
68        &self,
69        subspace_id: u64,
70        user: Option<Addr>,
71        page_size: u64,
72    ) -> PageIterator<Relationship, Binary> {
73        PageIterator::new(
74            Box::new(move |key, limit| {
75                self.query_relationships(
76                    subspace_id,
77                    user.clone(),
78                    None,
79                    Some(PageRequest {
80                        key: key.unwrap_or_default().to_vec(),
81                        limit: limit.into(),
82                        reverse: false,
83                        count_total: false,
84                        offset: 0,
85                    }),
86                )
87                .map(|response| Page {
88                    items: response.relationships,
89                    next_page_key: response.pagination.and_then(|response| {
90                        (!response.next_key.is_empty()).then_some(Binary::from(response.next_key))
91                    }),
92                })
93            }),
94            page_size,
95        )
96    }
97
98    /// Queries the blocks created inside a subspace.
99    ///
100    /// * `subspace_id` - Subspace to query the blocks for.
101    /// * `blocker` - Optional address of the blocker to query the blocks for.
102    /// * `blocked` - Optional address of the blocked user to query the block for (used only if
103    /// the `blocker` is provided).
104    /// * `pagination` - Optional pagination configs.
105    pub fn query_blocks(
106        &self,
107        subspace_id: u64,
108        blocker: Option<Addr>,
109        blocked: Option<Addr>,
110        pagination: Option<PageRequest>,
111    ) -> StdResult<QueryBlocksResponse> {
112        self.querier.blocks(
113            subspace_id,
114            blocker.unwrap_or_else(|| Addr::unchecked("")).into(),
115            blocked.unwrap_or_else(|| Addr::unchecked("")).into(),
116            pagination.map(Into::into),
117        )
118    }
119
120    /// Gives an iterator to scan over the users blocked from a specific user in a subspace or
121    /// all the blocks performed from the users in a subspace.
122    ///
123    /// * `subspace_id` - Subspace to query the blocks for.
124    /// * `blocker` - Optional address of the blocker to query the blocks for.
125    /// * `page_size` - Size of the page requested to the chain.
126    #[cfg(feature = "iterators")]
127    pub fn iterate_blocks(
128        &self,
129        subspace_id: u64,
130        blocker: Option<Addr>,
131        page_size: u64,
132    ) -> PageIterator<UserBlock, Binary> {
133        PageIterator::new(
134            Box::new(move |key, limit| {
135                self.query_blocks(
136                    subspace_id,
137                    blocker.clone(),
138                    None,
139                    Some(PageRequest {
140                        key: key.unwrap_or_default().to_vec(),
141                        limit: limit.into(),
142                        reverse: false,
143                        count_total: false,
144                        offset: 0,
145                    }),
146                )
147                .map(|response| Page {
148                    items: response.blocks,
149                    next_page_key: response.pagination.and_then(|response| {
150                        (!response.next_key.is_empty()).then_some(Binary::from(response.next_key))
151                    }),
152                })
153            }),
154            page_size,
155        )
156    }
157}
158
159#[cfg(test)]
160mod tests {
161    use super::*;
162    use crate::mocks::mock_queriers::mock_desmos_dependencies;
163    use crate::relationships::mocks::{MockRelationshipsQueries, MOCK_TARGET, MOCK_USER};
164    use cosmwasm_std::Addr;
165
166    #[test]
167    fn test_query_relationships() {
168        let owned_deps = mock_desmos_dependencies();
169        let deps = owned_deps.as_ref();
170        let querier = RelationshipsQuerier::new(&deps.querier);
171        let response = querier
172            .query_relationships(
173                0,
174                Some(Addr::unchecked(MOCK_USER)),
175                Some(Addr::unchecked(MOCK_TARGET)),
176                None,
177            )
178            .unwrap();
179        let expected = MockRelationshipsQueries::get_mocked_relationships_response();
180        assert_eq!(expected, response)
181    }
182
183    #[test]
184    fn test_iterate_relationships() {
185        let owned_deps = mock_desmos_dependencies();
186        let deps = owned_deps.as_ref();
187        let querier = RelationshipsQuerier::new(&deps.querier);
188        let mut it = querier.iterate_relationships(0, Some(Addr::unchecked("")), 10);
189        let expected = MockRelationshipsQueries::get_mocked_relationships_response();
190        assert_eq!(expected.relationships[0], it.next().unwrap().unwrap(),);
191        assert!(it.next().is_none());
192    }
193
194    #[test]
195    fn test_query_blocks() {
196        let owned_deps = mock_desmos_dependencies();
197        let deps = owned_deps.as_ref();
198        let querier = RelationshipsQuerier::new(&deps.querier);
199        let response = querier
200            .query_blocks(
201                0,
202                Some(Addr::unchecked(MOCK_USER)),
203                Some(Addr::unchecked(MOCK_TARGET)),
204                None,
205            )
206            .unwrap();
207        let expected = MockRelationshipsQueries::get_mocked_blocks_response();
208        assert_eq!(expected, response)
209    }
210
211    #[test]
212    fn test_iterate_blocks() {
213        let owned_deps = mock_desmos_dependencies();
214        let deps = owned_deps.as_ref();
215        let querier = RelationshipsQuerier::new(&deps.querier);
216        let mut it = querier.iterate_blocks(0, Some(Addr::unchecked("")), 10);
217        let expected = MockRelationshipsQueries::get_mocked_blocks_response();
218        assert_eq!(expected.blocks[0], it.next().unwrap().unwrap(),);
219        assert!(it.next().is_none());
220    }
221}