#![crate_name = "ampapi"]
use std::collections::HashMap;
use std::time::{SystemTime, UNIX_EPOCH};
use serde::de;
use serde_json::Value;
use reqwest::blocking;
mod types;
use crate::types::LoginResult;
mod modules;
#[derive(Debug, Clone)]
pub struct AMPAPI {
pub base_uri: String,
pub data_source: String,
pub username: String,
pub password: String,
pub remember_me_token: String,
pub session_id: String,
last_api_call: i64,
relog_interval: i64,
}
impl AMPAPI {
pub fn new(base_uri: String, username: String, password: String, remember_me_token: String, session_id: String) -> AMPAPI {
let mut new_base_uri = base_uri.clone();
if (new_base_uri.chars().nth(base_uri.len()-1).unwrap()) != '/' {
new_base_uri.push('/');
}
AMPAPI {
base_uri: new_base_uri.clone(),
data_source: new_base_uri + "API/",
username,
password,
remember_me_token,
session_id,
last_api_call: SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis() as i64,
relog_interval: 1000*60*5,
}
}
pub fn api_call<T: de::DeserializeOwned>(&mut self, endpoint: String, args: HashMap<String, Value>) -> Result<T, reqwest::Error> {
let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis() as i64;
if now - self.last_api_call > self.relog_interval {
self.last_api_call = now;
let _ = self.login();
} else {
self.last_api_call = now;
}
let mut map: HashMap<String, Value> = HashMap::new();
map.insert("SESSIONID".to_string(), Value::String(self.session_id.to_string()));
for (key, value) in args.iter() {
map.insert(key.to_string(), value.clone());
}
let client = blocking::Client::new();
let url = format!("{}{}", self.data_source, endpoint);
let response = client.post(url)
.json(&map)
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.header("User-Agent", "ampapi-rust/0.1.1")
.send()?
.json::<T>()?;
Ok(response)
}
pub fn login(&mut self) -> Result<LoginResult, reqwest::Error> {
let mut args = HashMap::new();
args.insert("username".to_string(), Value::String(self.username.clone()));
args.insert("password".to_string(), Value::String(self.password.clone()));
args.insert("token".to_string(), Value::String(self.remember_me_token.clone()));
args.insert("rememberMe".to_string(), Value::Bool(true));
if self.remember_me_token == "" {
args.insert("password".to_string(), Value::String(self.password.clone()));
}
self.api_call::<LoginResult>("Core/Login".to_string(), args)
}
}