use super::{Pagination, Since, Transaction};
use crate::{endpoints::handle_response, Result};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
pub struct Request<'a> {
reqwest_builder: reqwest::RequestBuilder,
payload: Payload<'a>,
}
impl<'a> Request<'a> {
pub(crate) fn new(
http_client: &reqwest::Client,
access_token: &str,
account_id: &'a str,
) -> Self {
let reqwest_builder = http_client
.get("https://api.monzo.com/transactions")
.bearer_auth(access_token);
let payload = Payload {
account_id,
pagination: Pagination::default(),
expand_merchant: None,
};
Self {
reqwest_builder,
payload,
}
}
pub async fn send(self) -> Result<Vec<Transaction>> {
#[derive(Deserialize)]
struct Response {
transactions: Vec<Transaction>,
}
let Response { transactions } =
handle_response(self.reqwest_builder.form(&self.payload)).await?;
Ok(transactions)
}
pub fn since(mut self, datetime: DateTime<Utc>) -> Self {
self.payload.pagination.since = Some(Since::Timestamp(datetime));
self
}
pub fn since_transaction(mut self, transaction_id: String) -> Self {
self.payload.pagination.since = Some(Since::ObjectId(transaction_id));
self
}
pub fn before(mut self, datetime: DateTime<Utc>) -> Self {
self.payload.pagination.before = Some(datetime);
self
}
pub fn limit(mut self, limit: u16) -> Self {
self.payload.pagination.limit = Some(limit);
self
}
pub fn expand_merchant(mut self) -> Self {
self.payload.expand_merchant = Some("merchant");
self
}
}
#[derive(Serialize)]
struct Payload<'a> {
account_id: &'a str,
#[serde(flatten)]
pagination: Pagination,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "expand[]")]
expand_merchant: Option<&'a str>,
}