box_open_sdk/models/schemas/
recent_items.rs1use crate::serde_helpers::double_option;
4
5use super::*;
6
7#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
8pub struct RecentItem {
9 #[serde(default, skip_serializing_if = "Option::is_none")]
10 pub r#type: Option<String>,
11 #[serde(default, skip_serializing_if = "Option::is_none")]
12 pub item: Option<RecentItemResource>,
13 #[serde(default, skip_serializing_if = "Option::is_none")]
14 pub interaction_type: Option<RecentItemInteractionType>,
15 #[serde(default, skip_serializing_if = "Option::is_none")]
16 pub interacted_at: Option<chrono::DateTime<chrono::Utc>>,
17 #[serde(default, skip_serializing_if = "Option::is_none")]
18 pub interaction_shared_link: Option<String>,
19}
20
21#[derive(Clone, Debug, PartialEq)]
22pub enum RecentItemResource {
23 File(FileFull),
24 Folder(FolderFull),
25 WebLink(WebLink),
26 Unknown(serde_json::Value),
28}
29
30impl Default for RecentItemResource {
31 fn default() -> Self {
32 Self::Unknown(Default::default())
33 }
34}
35
36impl serde::Serialize for RecentItemResource {
37 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
38 match self {
39 Self::File(inner) => inner.serialize(serializer),
40 Self::Folder(inner) => inner.serialize(serializer),
41 Self::WebLink(inner) => inner.serialize(serializer),
42 Self::Unknown(inner) => inner.serialize(serializer),
43 }
44 }
45}
46
47impl<'de> serde::Deserialize<'de> for RecentItemResource {
48 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
49 let value = serde_json::Value::deserialize(deserializer)?;
50 let tag = value
51 .get("type")
52 .and_then(serde_json::Value::as_str)
53 .map(str::to_owned);
54 match tag.as_deref() {
55 Some("file") => Ok(Self::File(
56 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
57 )),
58 Some("folder") => Ok(Self::Folder(
59 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
60 )),
61 Some("web_link") => Ok(Self::WebLink(
62 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
63 )),
64 _ => Ok(Self::Unknown(value)),
65 }
66 }
67}
68
69#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
70pub struct RecentItems {
71 #[serde(default, skip_serializing_if = "Option::is_none")]
72 pub limit: Option<i64>,
73 #[serde(
74 default,
75 skip_serializing_if = "Option::is_none",
76 deserialize_with = "double_option"
77 )]
78 pub next_marker: Option<Option<String>>,
79 #[serde(
80 default,
81 skip_serializing_if = "Option::is_none",
82 deserialize_with = "double_option"
83 )]
84 pub prev_marker: Option<Option<String>>,
85 #[serde(default, skip_serializing_if = "Option::is_none")]
86 pub entries: Option<Vec<RecentItem>>,
87}
88
89#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
90#[serde(transparent)]
91pub struct RecentItemInteractionType(pub String);
92
93impl RecentItemInteractionType {
94 pub const ITEM_PREVIEW: &'static str = "item_preview";
95 pub const ITEM_UPLOAD: &'static str = "item_upload";
96 pub const ITEM_COMMENT: &'static str = "item_comment";
97 pub const ITEM_OPEN: &'static str = "item_open";
98 pub const ITEM_MODIFY: &'static str = "item_modify";
99}