use std::sync::Arc;
use anyhow::Result;
use reqwest::Response;
use serde::Serialize;
use crate::{query::Query, response_models::ResponseModel};
pub struct Res {
query: Arc<Query>,
sender_id: String,
facebook_api_version: String,
page_access_token: String,
}
impl Res {
pub async fn send<T: ResponseModel>(&self, response_model: T) -> Result<String> {
let url_api = format!(
"https://graph.facebook.com/{version}/me/{endpoint}?access_token={token}",
endpoint = response_model.get_endpoint(),
version = self.facebook_api_version,
token = self.page_access_token
);
match fetch_post(&url_api, response_model).await {
Ok(response) => {
if response.status().is_client_error() {
Err(anyhow::anyhow!(response.text().await?))
} else {
Ok(response.text().await?)
}
}
Err(err) => Err(anyhow::anyhow!(err)),
}
}
pub fn new(
sender_id: &str,
query: Arc<Query>,
facebook_api_version: String,
page_access_token: String,
) -> Self {
Self {
query,
sender_id: sender_id.to_owned(),
facebook_api_version,
page_access_token,
}
}
pub async fn redirect(&self, path: &str) -> Result<()> {
self.query.set_path(&self.sender_id, path).await?;
Ok(())
}
}
async fn fetch_post<T: Serialize>(url: &str, body: T) -> Result<Response> {
Ok(reqwest::Client::new().post(url).json(&body).send().await?)
}