misskey_api/endpoint/admin/announcements/
list.rs1use 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 #[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}