nology_api/
browse.rs

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}