nology-api 0.0.2

Rust API client for synology/xpenology nas
Documentation
use crate::*;
use serde::{Serialize, Deserialize};
use chrono::serde::ts_seconds;

type DateTime = chrono::DateTime<chrono::Utc>;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListResponse{
    pub list: Vec<BrowseItem>
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BrowseItem {
    pub id: i64,
    pub filename: String,
    pub filesize: u64,
    #[serde(with = "ts_seconds")]
    pub time: DateTime,
    #[serde(with = "ts_seconds")]
    pub indexed_time: DateTime,
    pub owner_user_id: i64,
    pub folder_id: i64,
    #[serde(rename = "type")]
    pub type_field: String,
}

#[derive(Debug, Clone, Default)]
pub struct ListRequest {
    pub offset: u32,
    pub limit: u32,
    pub start_time: DateTime,
    pub end_time: DateTime,
}

impl Request for ListRequest {
    type Response = ListResponse;
    fn query(&self) -> String {
        let Self { offset, limit, start_time, end_time } = self;
        let start_time = start_time.timestamp();
        let end_time = end_time.timestamp();
        format!("api=SYNO.Foto.Browse.Item&method=list&version=1&offset={offset}&limit={limit}&start_time={start_time}&end_time={end_time}")
    }
}


#[derive(Debug, Clone, Default)]
pub struct CommonListRequest {
    pub offset: u32,
    pub limit: u32,
    pub start_time: DateTime,
    pub end_time: DateTime,
}

impl Request for CommonListRequest {
    type Response = ListResponse;

    fn query(&self) -> String {
        let Self { offset, limit, start_time, end_time } = self;
        format!("api=SYNO.FotoTeam.Browse.Item&method=list&version=1&offset={offset}&limit={limit}&start_time={start_time}&end_time={end_time}")
    }
}


#[derive(Debug, Clone)]
pub struct AlbumRequest {
    pub offset: u32,
    pub limit: u32,
    pub album_id: AlbumId,
}

impl Request for AlbumRequest {
    type Response = ListResponse;

    fn query(&self) -> String {
        let Self { offset, limit, album_id } = self;
        let album_id = match album_id {
            AlbumId::Owned(id)     => format!("album_id={id}"),
            AlbumId::Shared(pass) => format!("passphrase={pass}"),
        };
        format!("api=SYNO.Foto.Browse.Item&method=list&version=1&{album_id}&offset={offset}&limit={limit}")
    }
}