resonite/query/
message.rs

1use 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)]
13/// Query the messages for a specific user
14pub 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	/// If to only query messages that were sent after a certain time
26	pub from_time: Option<OffsetDateTime>,
27	/// Max amount of messages to retrieve,
28	/// seems to be server side capped to 100 as of writing.
29	pub max_amount: u16,
30	/// If to fetch only unread messages
31	pub unread_only: bool,
32	#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
33	#[serde(default)]
34	#[serde(skip_serializing_if = "Option::is_none")]
35	/// If to only query messages with a certain user
36	pub with_user: Option<crate::id::User>,
37}
38
39impl Default for Messages {
40	/// Creates a messages query based on the ID
41	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
75/// Send a message
76impl 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}