use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::client::Ghl;
use crate::error::Result;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[allow(missing_docs)] pub struct Location {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub company_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub city: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub state: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub timezone: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phone: Option<String>,
#[serde(flatten)]
pub extra: serde_json::Map<String, serde_json::Value>,
}
#[derive(Deserialize)]
struct LocationEnvelope {
location: Location,
}
#[derive(Deserialize)]
struct LocationList {
#[serde(default)]
locations: Vec<Location>,
}
pub struct LocationsService {
client: Ghl,
}
impl LocationsService {
pub(crate) fn new(client: Ghl) -> Self {
Self { client }
}
pub async fn get(&self, location_id: &str) -> Result<Location> {
let envelope: LocationEnvelope = self
.client
.send(
Method::GET,
&format!("/locations/{location_id}"),
&[],
None::<&()>,
)
.await?;
Ok(envelope.location)
}
pub async fn search(&self, company_id: Option<&str>, limit: u32) -> Result<Vec<Location>> {
let mut query: Vec<(String, String)> = vec![("limit".into(), limit.to_string())];
if let Some(id) = company_id {
query.push(("companyId".into(), id.to_owned()));
}
let list: LocationList = self
.client
.send(Method::GET, "/locations/search", &query, None::<&()>)
.await?;
Ok(list.locations)
}
}