resonite/query/
message.rs1use racal::Queryable;
2use serde::{Deserialize, Serialize};
3use time::OffsetDateTime;
4
5use super::Authentication;
6
7#[cfg_attr(
8 feature = "borsh",
9 derive(borsh::BorshSerialize, borsh::BorshDeserialize)
10)]
11#[serde_with::serde_as]
12#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
13pub struct Messages {
15 #[cfg_attr(
16 feature = "borsh",
17 borsh(
18 serialize_with = "crate::util::borsh::time::optional_ser",
19 deserialize_with = "crate::util::borsh::time::optional_de"
20 )
21 )]
22 #[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
23 #[serde(default)]
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub from_time: Option<OffsetDateTime>,
27 pub max_amount: u16,
30 pub unread_only: bool,
32 #[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
33 #[serde(default)]
34 #[serde(skip_serializing_if = "Option::is_none")]
35 pub with_user: Option<crate::id::User>,
37}
38
39impl Default for Messages {
40 fn default() -> Self {
42 Self {
43 max_amount: 100,
44 unread_only: false,
45 from_time: None,
46 with_user: None,
47 }
48 }
49}
50
51impl Queryable<Authentication, Vec<crate::model::Message>> for Messages {
52 fn url(&self, auth: &Authentication) -> String {
53 let mut query = format!(
54 "{}/users/{}/messages?maxItems={}",
55 crate::HTTP_BASE_URI,
56 auth.user_id.as_ref(),
57 self.max_amount
58 );
59
60 if self.unread_only {
61 query += "&unread=true";
62 }
63
64 if let Some(from_time) = self.from_time {
65 query = query + "&fromTime=" + &from_time.to_string();
66 }
67 if let Some(with_user) = &self.with_user {
68 query = query + "&user=" + with_user.as_ref();
69 }
70
71 query
72 }
73}
74
75impl Queryable<Authentication, Self> for crate::model::Message {
77 fn url(&self, _: &Authentication) -> String {
78 format!(
79 "{}/users/{}/messages",
80 crate::HTTP_BASE_URI,
81 self.recipient_id.as_ref(),
82 )
83 }
84
85 fn body(
86 &self, _state: &Authentication,
87 ) -> Option<serde_json::Result<Vec<u8>>> {
88 Some(serde_json::to_vec(self))
89 }
90
91 fn method(&self, _state: &Authentication) -> racal::RequestMethod {
92 racal::RequestMethod::Post
93 }
94}