misskey_api/endpoint/drive/
files.rs

1use crate::model::{
2    drive::{DriveFile, DriveFolder},
3    id::Id,
4};
5
6use mime::Mime;
7use serde::Serialize;
8use typed_builder::TypedBuilder;
9
10pub mod attached_notes;
11pub mod check_existence;
12pub mod create;
13pub mod delete;
14pub mod find;
15pub mod find_by_hash;
16pub mod show;
17pub mod update;
18pub mod upload_from_url;
19
20#[derive(Serialize, Default, Debug, Clone, TypedBuilder)]
21#[serde(rename_all = "camelCase")]
22#[builder(doc)]
23pub struct Request {
24    #[serde(
25        rename = "type",
26        skip_serializing_if = "Option::is_none",
27        serialize_with = "crate::serde::serialize_string_option"
28    )]
29    #[builder(default, setter(strip_option))]
30    pub type_: Option<Mime>,
31    #[builder(default, setter(strip_option))]
32    pub folder_id: Option<Id<DriveFolder>>,
33    /// 1 .. 100
34    #[serde(skip_serializing_if = "Option::is_none")]
35    #[builder(default, setter(strip_option))]
36    pub limit: Option<u8>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    #[builder(default, setter(strip_option))]
39    pub since_id: Option<Id<DriveFile>>,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    #[builder(default, setter(strip_option))]
42    pub until_id: Option<Id<DriveFile>>,
43}
44
45impl misskey_core::Request for Request {
46    type Response = Vec<DriveFile>;
47    const ENDPOINT: &'static str = "drive/files";
48}
49
50impl_pagination!(Request, DriveFile);
51
52#[cfg(test)]
53mod tests {
54    use super::Request;
55    use crate::test::{ClientExt, HttpClientExt, TestClient};
56
57    use mime::TEXT_PLAIN;
58
59    #[tokio::test]
60    async fn request() {
61        let client = TestClient::new();
62        client.create_text_file("test.txt", "test").await;
63
64        client.test(Request::default()).await;
65    }
66
67    #[tokio::test]
68    async fn request_with_folder() {
69        let client = TestClient::new();
70        let folder = client
71            .test(crate::endpoint::drive::folders::create::Request {
72                name: None,
73                parent_id: None,
74            })
75            .await;
76
77        client
78            .test(Request {
79                type_: None,
80                folder_id: Some(folder.id),
81                limit: None,
82                since_id: None,
83                until_id: None,
84            })
85            .await;
86    }
87
88    #[tokio::test]
89    async fn request_with_options() {
90        let client = TestClient::new();
91        client.create_text_file("test.txt", "test").await;
92
93        client
94            .test(Request {
95                type_: Some(TEXT_PLAIN),
96                folder_id: None,
97                limit: Some(100),
98                since_id: None,
99                until_id: None,
100            })
101            .await;
102    }
103
104    #[tokio::test]
105    async fn request_paginate() {
106        let client = TestClient::new();
107        let file = client.create_text_file("test.txt", "test").await;
108
109        client
110            .test(Request {
111                type_: None,
112                folder_id: None,
113                limit: None,
114                since_id: Some(file.id.clone()),
115                until_id: Some(file.id.clone()),
116            })
117            .await;
118    }
119}