use racal::Queryable;
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use super::Authentication;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Messages {
pub max_amount: u16,
pub unread_only: bool,
pub from_time: Option<OffsetDateTime>,
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::API_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::API_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
}
}