use racal::Queryable;
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use super::Authentication;
#[cfg_attr(
feature = "borsh",
derive(borsh::BorshSerialize, borsh::BorshDeserialize)
)]
#[serde_with::serde_as]
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Messages {
#[cfg_attr(
feature = "borsh",
borsh(
serialize_with = "crate::util::borsh::time::optional_ser",
deserialize_with = "crate::util::borsh::time::optional_de"
)
)]
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub from_time: Option<OffsetDateTime>,
pub max_amount: u16,
pub unread_only: bool,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub with_user: Option<crate::id::User>,
}
impl Default for Messages {
fn default() -> Self {
Self {
max_amount: 100,
unread_only: false,
from_time: None,
with_user: None,
}
}
}
impl Queryable<Authentication, Vec<crate::model::Message>> for Messages {
fn url(&self, auth: &Authentication) -> String {
let mut query = format!(
"{}/users/{}/messages?maxItems={}",
crate::HTTP_BASE_URI,
auth.user_id.as_ref(),
self.max_amount
);
if self.unread_only {
query += "&unread=true";
}
if let Some(from_time) = self.from_time {
query = query + "&fromTime=" + &from_time.to_string();
}
if let Some(with_user) = &self.with_user {
query = query + "&user=" + with_user.as_ref();
}
query
}
}
impl Queryable<Authentication, Self> for crate::model::Message {
fn url(&self, _: &Authentication) -> String {
format!(
"{}/users/{}/messages",
crate::HTTP_BASE_URI,
self.recipient_id.as_ref(),
)
}
fn body(
&self, _state: &Authentication,
) -> Option<serde_json::Result<Vec<u8>>> {
Some(serde_json::to_vec(self))
}
fn method(&self, _state: &Authentication) -> racal::RequestMethod {
racal::RequestMethod::Post
}
}