cloudreve_api/api/v4/models/
share.rs

1//! Share-related models for Cloudreve API v4
2
3use serde::{Deserialize, Serialize};
4
5/// Share link information
6#[derive(Debug, Serialize, Deserialize, Clone)]
7pub struct ShareLink {
8    pub id: String,
9    pub name: String,
10    pub visited: i64,
11    #[serde(default)]
12    pub downloaded: i64,
13    #[serde(default)]
14    pub price: i64,
15    pub unlocked: bool,
16    pub source_type: ShareSourceType,
17    pub owner: super::auth::NewUser,
18    pub created_at: String,
19    pub expired: bool,
20    pub url: String,
21    #[serde(default)]
22    pub permission_setting: Option<super::file::PermissionSetting>,
23    #[serde(rename = "is_private")]
24    pub is_private: Option<bool>,
25    pub password: Option<String>,
26    pub source_uri: Option<String>,
27    pub share_view: Option<bool>,
28    pub show_readme: Option<bool>,
29    pub password_protected: Option<bool>,
30    pub expires: Option<String>,
31    pub expired_at: Option<String>,
32    #[serde(default)]
33    pub download_count: u64,
34}
35
36/// Share source type enum
37#[derive(Debug, Serialize, Clone, PartialEq)]
38pub enum ShareSourceType {
39    File = 0,
40    Folder = 1,
41}
42
43impl<'de> Deserialize<'de> for ShareSourceType {
44    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
45    where
46        D: serde::Deserializer<'de>,
47    {
48        use serde::de::Error;
49        use serde_json::Value;
50
51        let value = Value::deserialize(deserializer)?;
52        match value {
53            Value::Number(n) => {
54                if let Some(i) = n.as_i64() {
55                    match i {
56                        0 => Ok(ShareSourceType::File),
57                        1 => Ok(ShareSourceType::Folder),
58                        _ => Err(Error::custom(format!("Invalid ShareSourceType value: {}", i))),
59                    }
60                } else {
61                    Err(Error::custom(format!("Invalid ShareSourceType number: {}", n)))
62                }
63            }
64            Value::String(s) => match s.as_str() {
65                "0" => Ok(ShareSourceType::File),
66                "1" => Ok(ShareSourceType::Folder),
67                _ => Err(Error::custom(format!("Invalid ShareSourceType value: {}", s))),
68            },
69            _ => Err(Error::custom(format!("Invalid ShareSourceType type: {:?}", value))),
70        }
71    }
72}
73
74/// Create share link request
75#[derive(Debug, Serialize)]
76pub struct CreateShareLinkRequest {
77    pub permissions: super::file::PermissionSetting,
78    pub uri: String,
79    pub is_private: Option<bool>,
80    pub share_view: Option<bool>,
81    pub expire: Option<u32>,
82    pub price: Option<i32>,
83    pub password: Option<String>,
84    pub show_readme: Option<bool>,
85}
86
87/// Edit share link request
88#[derive(Debug, Serialize)]
89pub struct EditShareLinkRequest {
90    pub permissions: super::file::PermissionSetting,
91    pub uri: String,
92    pub share_view: Option<bool>,
93    pub expire: Option<u32>,
94    pub price: Option<i32>,
95    pub show_readme: Option<bool>,
96}
97
98/// Abuse report request
99#[derive(Debug, Serialize)]
100pub struct AbuseReportRequest<'a> {
101    pub reason: &'a str,
102}