1use crate::*;
2use serde::{Serialize, Deserialize};
3use chrono::serde::ts_seconds;
4
5type DateTime = chrono::DateTime<chrono::Utc>;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct ListResponse{
9 pub list: Vec<BrowseItem>
10}
11
12#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
13pub struct BrowseItem {
14 pub id: i64,
15 pub filename: String,
16 pub filesize: u64,
17 #[serde(with = "ts_seconds")]
18 pub time: DateTime,
19 #[serde(with = "ts_seconds")]
20 pub indexed_time: DateTime,
21 pub owner_user_id: i64,
22 pub folder_id: i64,
23 #[serde(rename = "type")]
24 pub type_field: String,
25}
26
27#[derive(Debug, Clone, Default)]
28pub struct ListRequest {
29 pub offset: u32,
30 pub limit: u32,
31 pub start_time: DateTime,
32 pub end_time: DateTime,
33}
34
35impl Request for ListRequest {
36 type Response = ListResponse;
37 fn query(&self) -> String {
38 let Self { offset, limit, start_time, end_time } = self;
39 let start_time = start_time.timestamp();
40 let end_time = end_time.timestamp();
41 format!("api=SYNO.Foto.Browse.Item&method=list&version=1&offset={offset}&limit={limit}&start_time={start_time}&end_time={end_time}")
42 }
43}
44
45
46#[derive(Debug, Clone, Default)]
47pub struct CommonListRequest {
48 pub offset: u32,
49 pub limit: u32,
50 pub start_time: DateTime,
51 pub end_time: DateTime,
52}
53
54impl Request for CommonListRequest {
55 type Response = ListResponse;
56
57 fn query(&self) -> String {
58 let Self { offset, limit, start_time, end_time } = self;
59 format!("api=SYNO.FotoTeam.Browse.Item&method=list&version=1&offset={offset}&limit={limit}&start_time={start_time}&end_time={end_time}")
60 }
61}
62
63
64#[derive(Debug, Clone)]
65pub struct AlbumRequest {
66 pub offset: u32,
67 pub limit: u32,
68 pub album_id: AlbumId,
69}
70
71impl Request for AlbumRequest {
72 type Response = ListResponse;
73
74 fn query(&self) -> String {
75 let Self { offset, limit, album_id } = self;
76 let album_id = match album_id {
77 AlbumId::Owned(id) => format!("album_id={id}"),
78 AlbumId::Shared(pass) => format!("passphrase={pass}"),
79 };
80 format!("api=SYNO.Foto.Browse.Item&method=list&version=1&{album_id}&offset={offset}&limit={limit}")
81 }
82}