Skip to main content

zulip_api/message/
never_subscribed.rs

1use serde::{Deserialize, Serialize};
2
3use crate::message::channel_permission::*;
4use crate::{field_access, impl_default, impl_display, StreamPostPolicy, TopicsPolicy};
5
6/// Represents one of the channels that is visible to the user, and the user has never been subscribed to.
7///
8/// Important for clients containing UI where one can browse channels to subscribe to.
9///
10/// **Changes**: Before Zulip 10.0 (feature level 362), archived channels did not appear in this list, even if the `archived_channels` `client capability` was declared by the client.  Prior to Zulip 10.0 (feature level 349), if a user was in `can_administer_channel_group` of a channel that they never subscribed to, but not an organization administrator, the channel in question would not be part of this array.
11#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
12pub struct NeverSubscribed {
13    #[serde(skip_serializing_if = "Option::is_none")]
14    stream_id: Option<u64>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    name: Option<String>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    is_archived: Option<bool>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    description: Option<String>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    date_created: Option<u64>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    creator_id: Option<u64>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    invite_only: Option<bool>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    rendered_description: Option<String>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    is_web_public: Option<bool>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    stream_post_policy: Option<StreamPostPolicy>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    message_retention_days: Option<u64>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    history_public_to_subscribers: Option<bool>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    topics_policy: Option<TopicsPolicy>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    first_message_id: Option<u64>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    folder_id: Option<u64>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    is_recently_active: Option<bool>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    is_announcement_only: Option<bool>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    can_add_subscribers_group: Option<CanAddSubscribersGroup>,
49    #[serde(skip_serializing_if = "Option::is_none")]
50    can_remove_subscribers_group: Option<CanRemoveSubscribersGroup>,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    can_administer_channel_group: Option<CanAdministerChannelGroup>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    can_delete_any_message_group: Option<CanDeleteAnyMessageGroup>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    can_delete_own_message_group: Option<CanDeleteOwnMessageGroup>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    can_move_messages_out_of_channel_group: Option<CanMoveMessagesOutOfChannelGroup>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    can_move_messages_within_channel_group: Option<CanMoveMessagesWithinChannelGroup>,
61    #[serde(skip_serializing_if = "Option::is_none")]
62    can_send_message_group: Option<CanSendMessageGroup>,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    can_subscribe_group: Option<CanSubscribeGroup>,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    can_resolve_topics_group: Option<CanResolveTopicsGroup>,
67    #[serde(skip_serializing_if = "Option::is_none")]
68    subscriber_count: Option<u64>,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    stream_weekly_traffic: Option<u64>,
71    #[serde(skip_serializing_if = "Option::is_none")]
72    subscribers: Option<Vec<u64>>,
73    #[serde(skip_serializing_if = "Option::is_none")]
74    partial_subscribers: Option<Vec<u64>>,
75}
76
77impl NeverSubscribed {
78    /// Creates a new [NeverSubscribed].
79    pub const fn new() -> Self {
80        Self {
81            stream_id: None,
82            name: None,
83            is_archived: None,
84            description: None,
85            date_created: None,
86            creator_id: None,
87            invite_only: None,
88            rendered_description: None,
89            is_web_public: None,
90            stream_post_policy: None,
91            message_retention_days: None,
92            history_public_to_subscribers: None,
93            topics_policy: None,
94            first_message_id: None,
95            folder_id: None,
96            is_recently_active: None,
97            is_announcement_only: None,
98            can_add_subscribers_group: None,
99            can_remove_subscribers_group: None,
100            can_administer_channel_group: None,
101            can_delete_any_message_group: None,
102            can_delete_own_message_group: None,
103            can_move_messages_out_of_channel_group: None,
104            can_move_messages_within_channel_group: None,
105            can_send_message_group: None,
106            can_subscribe_group: None,
107            can_resolve_topics_group: None,
108            subscriber_count: None,
109            stream_weekly_traffic: None,
110            subscribers: None,
111            partial_subscribers: None,
112        }
113    }
114}
115
116field_access! {
117    NeverSubscribed {
118        stream_id: option { u64 },
119        is_archived: option { bool },
120        date_created: option { u64 },
121        creator_id: option { u64 },
122        invite_only: option { bool },
123        is_web_public: option { bool },
124        stream_post_policy: option { StreamPostPolicy },
125        message_retention_days: option { u64 },
126        history_public_to_subscribers: option { bool },
127        topics_policy: option { TopicsPolicy },
128        first_message_id: option { u64 },
129        folder_id: option { u64 },
130        is_recently_active: option { bool },
131        is_announcement_only: option { bool },
132        subscriber_count: option { u64 },
133        /// The average number of messages sent to the channel per week, as estimated based on recent weeks, rounded to the nearest integer.
134        ///
135        /// If `null`, the channel was recently created and there is insufficient data to estimate the average traffic.
136        stream_weekly_traffic: option { u64 },
137    }
138}
139
140field_access! {
141    NeverSubscribed {
142        name: option_cow_deref { str, String },
143        description: option_cow_deref { str, String },
144        rendered_description: option_cow_deref { str, String },
145    }
146}
147
148field_access! {
149    NeverSubscribed {
150        can_add_subscribers_group: option_cow_ref { CanAddSubscribersGroup },
151        can_remove_subscribers_group: option_cow_ref { CanRemoveSubscribersGroup },
152        can_administer_channel_group: option_cow_ref { CanAdministerChannelGroup },
153        can_delete_any_message_group: option_cow_ref { CanDeleteAnyMessageGroup },
154        can_delete_own_message_group: option_cow_ref { CanDeleteOwnMessageGroup },
155        can_move_messages_out_of_channel_group: option_cow_ref { CanMoveMessagesOutOfChannelGroup },
156        can_move_messages_within_channel_group: option_cow_ref { CanMoveMessagesWithinChannelGroup },
157        can_send_message_group: option_cow_ref { CanSendMessageGroup },
158        can_subscribe_group: option_cow_ref { CanSubscribeGroup },
159        can_resolve_topics_group: option_cow_ref { CanResolveTopicsGroup },
160    }
161}
162
163field_access! {
164    NeverSubscribed {
165        /// A list of user IDs of users who are subscribed to the channel.
166        ///
167        /// Included only if `include_subscribers` is `true`.
168        ///
169        /// If a user is not allowed to know the subscribers for a channel, we will send an empty array.
170        ///
171        /// API authors should use other data to determine whether users like guest users are forbidden to know the subscribers.
172        subscribers: option_cow_deref { [u64], Vec<u64> },
173        /// If [`include_subscribers=\"partial\"`](https://zulip.com/api/get-subscriptions#parameter-include_subscribers) was requested,
174        /// the server may, at its discretion, send a `partial_subscribers` list rather than a `subscribers` list for channels with a large number of subscribers.
175        ///
176        /// The `partial_subscribers` list contains an arbitrary subset of the channel's subscribers that is guaranteed to include all bot user
177        /// subscribers as well as all users who have been active in the last 14 days, but otherwise can be chosen arbitrarily by the server.
178        ///
179        /// If a user is not allowed to know the subscribers for a channel, we will send an empty array.
180        /// API authors should use other data to determine whether users like guest users are forbidden to know the subscribers.
181        ///
182        /// **Changes**: New in Zulip 11.0 (feature level 412).
183        partial_subscribers: option_cow_deref { [u64], Vec<u64> },
184    }
185}
186
187impl_default!(NeverSubscribed);
188impl_display!(NeverSubscribed);
189
190#[cfg(test)]
191mod tests {
192    use super::*;
193
194    #[test]
195    fn test_never_subscribed() {
196        let stream_id = 1;
197        let name = "test name";
198        let is_archived = true;
199        let description = "test description";
200        let date_created = 2;
201        let creator_id = 3;
202        let invite_only = false;
203        let rendered_description = "<p>description</p>";
204        let is_web_public = true;
205        let stream_post_policy = StreamPostPolicy::new();
206        let message_retention_days = 4;
207        let history_public_to_subscribers = false;
208        let topics_policy = TopicsPolicy::new();
209        let first_message_id = 5;
210        let folder_id = 6;
211        let is_recently_active = true;
212        let is_announcement_only = false;
213        let can_add_subscribers_group = CanAddSubscribersGroup::new();
214        let can_remove_subscribers_group = CanRemoveSubscribersGroup::new();
215        let can_administer_channel_group = CanAdministerChannelGroup::new();
216        let can_delete_any_message_group = CanDeleteAnyMessageGroup::new();
217        let can_delete_own_message_group = CanDeleteOwnMessageGroup::new();
218        let can_move_messages_out_of_channel_group = CanMoveMessagesOutOfChannelGroup::new();
219        let can_move_messages_within_channel_group = CanMoveMessagesWithinChannelGroup::new();
220        let can_send_message_group = CanSendMessageGroup::new();
221        let can_subscribe_group = CanSubscribeGroup::new();
222        let can_resolve_topics_group = CanResolveTopicsGroup::new();
223        let subscriber_count = 7;
224        let stream_weekly_traffic = 8;
225        let subscribers = [9u64];
226        let partial_subscribers = [10u64];
227
228        let never = NeverSubscribed::new()
229            .with_stream_id(stream_id)
230            .with_name(name)
231            .with_is_archived(is_archived)
232            .with_description(description)
233            .with_date_created(date_created)
234            .with_creator_id(creator_id)
235            .with_invite_only(invite_only)
236            .with_rendered_description(rendered_description)
237            .with_is_web_public(is_web_public)
238            .with_stream_post_policy(stream_post_policy)
239            .with_message_retention_days(message_retention_days)
240            .with_history_public_to_subscribers(history_public_to_subscribers)
241            .with_topics_policy(topics_policy)
242            .with_first_message_id(first_message_id)
243            .with_folder_id(folder_id)
244            .with_is_recently_active(is_recently_active)
245            .with_is_announcement_only(is_announcement_only)
246            .with_can_add_subscribers_group(&can_add_subscribers_group)
247            .with_can_remove_subscribers_group(&can_remove_subscribers_group)
248            .with_can_administer_channel_group(&can_administer_channel_group)
249            .with_can_delete_any_message_group(&can_delete_any_message_group)
250            .with_can_delete_own_message_group(&can_delete_own_message_group)
251            .with_can_move_messages_out_of_channel_group(&can_move_messages_out_of_channel_group)
252            .with_can_move_messages_within_channel_group(&can_move_messages_within_channel_group)
253            .with_can_send_message_group(&can_send_message_group)
254            .with_can_subscribe_group(&can_subscribe_group)
255            .with_can_resolve_topics_group(&can_resolve_topics_group)
256            .with_subscriber_count(subscriber_count)
257            .with_stream_weekly_traffic(stream_weekly_traffic)
258            .with_subscribers(subscribers.as_ref())
259            .with_partial_subscribers(partial_subscribers.as_ref());
260        let never_json = never.to_string();
261
262        assert_eq!(serde_json::to_string(&never).unwrap(), never_json);
263        assert_eq!(
264            serde_json::from_str::<NeverSubscribed>(&never_json).unwrap(),
265            never
266        );
267
268        assert_eq!(never.stream_id(), Some(stream_id));
269        assert_eq!(never.name(), Some(name));
270        assert_eq!(never.is_archived(), Some(is_archived));
271        assert_eq!(never.description(), Some(description));
272        assert_eq!(never.date_created(), Some(date_created));
273        assert_eq!(never.creator_id(), Some(creator_id));
274        assert_eq!(never.invite_only(), Some(invite_only));
275        assert_eq!(never.rendered_description(), Some(rendered_description));
276        assert_eq!(never.is_web_public(), Some(is_web_public));
277        assert_eq!(never.stream_post_policy(), Some(stream_post_policy));
278        assert_eq!(never.message_retention_days(), Some(message_retention_days));
279        assert_eq!(
280            never.history_public_to_subscribers(),
281            Some(history_public_to_subscribers)
282        );
283        assert_eq!(never.topics_policy(), Some(topics_policy));
284        assert_eq!(never.first_message_id(), Some(first_message_id));
285        assert_eq!(never.folder_id(), Some(folder_id));
286        assert_eq!(never.is_recently_active(), Some(is_recently_active));
287        assert_eq!(never.is_announcement_only(), Some(is_announcement_only));
288        assert_eq!(
289            never.can_add_subscribers_group(),
290            Some(&can_add_subscribers_group)
291        );
292        assert_eq!(
293            never.can_remove_subscribers_group(),
294            Some(&can_remove_subscribers_group)
295        );
296        assert_eq!(
297            never.can_administer_channel_group(),
298            Some(&can_administer_channel_group)
299        );
300        assert_eq!(
301            never.can_delete_any_message_group(),
302            Some(&can_delete_any_message_group)
303        );
304        assert_eq!(
305            never.can_delete_own_message_group(),
306            Some(&can_delete_own_message_group)
307        );
308        assert_eq!(
309            never.can_move_messages_out_of_channel_group(),
310            Some(&can_move_messages_out_of_channel_group)
311        );
312        assert_eq!(
313            never.can_move_messages_within_channel_group(),
314            Some(&can_move_messages_within_channel_group)
315        );
316        assert_eq!(
317            never.can_send_message_group(),
318            Some(&can_send_message_group)
319        );
320        assert_eq!(never.can_subscribe_group(), Some(&can_subscribe_group));
321        assert_eq!(
322            never.can_resolve_topics_group(),
323            Some(&can_resolve_topics_group)
324        );
325        assert_eq!(never.subscriber_count(), Some(subscriber_count));
326        assert_eq!(never.stream_weekly_traffic(), Some(stream_weekly_traffic));
327        assert_eq!(never.subscribers(), Some(subscribers.as_ref()));
328        assert_eq!(
329            never.partial_subscribers(),
330            Some(partial_subscribers.as_ref())
331        );
332    }
333}