misskey_api/endpoint/admin/announcements/
list.rs

1use crate::model::{announcement::Announcement, id::Id};
2
3use serde::{Deserialize, Serialize};
4use typed_builder::TypedBuilder;
5
6#[derive(Deserialize, Debug, Clone)]
7#[serde(rename_all = "camelCase")]
8pub struct AnnouncementWithReads {
9    pub reads: u64,
10    #[serde(flatten)]
11    pub announcement: Announcement,
12}
13
14#[derive(Serialize, Default, Debug, Clone, TypedBuilder)]
15#[serde(rename_all = "camelCase")]
16#[builder(doc)]
17pub struct Request {
18    /// 1 .. 100
19    #[serde(skip_serializing_if = "Option::is_none")]
20    #[builder(default, setter(strip_option))]
21    pub limit: Option<u8>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    #[builder(default, setter(strip_option))]
24    pub since_id: Option<Id<Announcement>>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    #[builder(default, setter(strip_option))]
27    pub until_id: Option<Id<Announcement>>,
28}
29
30impl crate::PaginationItem for AnnouncementWithReads {
31    type Id = Id<Announcement>;
32    fn item_id(&self) -> Id<Announcement> {
33        self.announcement.id
34    }
35}
36
37impl misskey_core::Request for Request {
38    type Response = Vec<AnnouncementWithReads>;
39    const ENDPOINT: &'static str = "admin/announcements/list";
40}
41
42impl crate::PaginationRequest for Request {
43    type Item = AnnouncementWithReads;
44
45    fn set_since_id(&mut self, id: Id<Announcement>) {
46        self.since_id.replace(id);
47    }
48
49    fn set_until_id(&mut self, id: Id<Announcement>) {
50        self.until_id.replace(id);
51    }
52
53    fn set_limit(&mut self, limit: u8) {
54        self.limit.replace(limit);
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::Request;
61    use crate::test::{ClientExt, TestClient};
62
63    #[tokio::test]
64    async fn request() {
65        let client = TestClient::new();
66        client.admin.test(Request::default()).await;
67    }
68
69    #[tokio::test]
70    async fn request_with_options() {
71        let client = TestClient::new();
72        client
73            .admin
74            .test(Request {
75                limit: Some(100),
76                since_id: None,
77                until_id: None,
78            })
79            .await;
80    }
81
82    #[tokio::test]
83    async fn request_paginate() {
84        let client = TestClient::new();
85        let announcement = client
86            .admin
87            .test(crate::endpoint::admin::announcements::create::Request {
88                title: "hello".to_string(),
89                text: "ok".to_string(),
90                image_url: None,
91            })
92            .await;
93
94        client
95            .admin
96            .test(Request {
97                limit: None,
98                since_id: Some(announcement.id.clone()),
99                until_id: Some(announcement.id.clone()),
100            })
101            .await;
102    }
103}