use reqwest::{header, StatusCode};
use endpoints::{DefaultClient, GeenyApi};
use errors::*;
use models::*;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ConnectApi(GeenyApi);
impl Default for ConnectApi {
fn default() -> Self {
Self::new("https://connect.geeny.io".into(), 443)
}
}
impl ConnectApi {
pub fn new(host: String, port: u16) -> Self {
ConnectApi(GeenyApi {
host: host,
port: port,
client: DefaultClient::default(),
})
}
pub fn registration(&self, req: &RegistrationRequest) -> Result<AuthLoginResponse> {
let mut rreq = self.0.client.0.post(&self.0.endpoint("/auth/registration"));
rreq.json(req);
info!("Requesting: {:?}", rreq);
let mut resp = rreq.send()?;
info!("Response: {:?}", resp);
Ok(resp.json().chain_err(|| "Failed to login")?)
}
pub fn delete_user(&self, token: &str) -> Result<()> {
let mut rreq = self.0.client.0.delete(&self.0.endpoint("/auth/me"));
rreq.header(header::Authorization(format!("JWT {}", token)));
info!("Requesting: {:?}", rreq);
let resp = rreq.send()?;
info!("Response: {:?}", resp);
match resp.status() {
StatusCode::NoContent => Ok(()),
_ => Err(Error::from("Failed to delete user")),
}
}
pub fn login(&self, req: &AuthLoginRequest) -> Result<AuthLoginResponse> {
let mut rreq = self.0.client.0.post(&self.0.endpoint("/auth/login"));
rreq.json(req);
info!("Requesting: {:?}", rreq);
let mut resp = rreq.send()?;
info!("Response: {:?}", resp);
Ok(resp.json().chain_err(|| "Failed to login")?)
}
pub fn check_token(&self, req: &AuthLoginResponse) -> Result<()> {
let mut rreq = self.0.client.0.post(&self.0.endpoint("/auth/jwt/verify"));
rreq.json(req);
info!("Requesting: {:?}", rreq);
let mut resp = rreq.send()?;
info!("Response: {:?}", resp);
let _: AuthLoginResponse = resp.json()
.chain_err(|| "Failed to deserialize token response")?;
Ok(())
}
pub fn refresh_token(&self, req: &AuthLoginResponse) -> Result<AuthLoginResponse> {
let mut resp = self.0
.client
.0
.post(&self.0.endpoint("/auth/jwt/refresh"))
.json(req)
.send()?;
Ok(resp.json().chain_err(|| "Failed to refresh token")?)
}
}
#[cfg(test)]
mod test {
use super::*;
use serde_json;
#[test]
fn serialize_test() {
let api = ConnectApi::default();
let s = serde_json::to_string(&api).unwrap();
assert_eq!(s, "{\"host\":\"https://connect.geeny.io\",\"port\":443}");
}
#[test]
fn deserialize_test() {
let api = ConnectApi::default();
let de_api: ConnectApi = serde_json::from_str(
r#"
{
"host": "https://connect.geeny.io",
"port": 443
}
"#,
).unwrap();
assert_eq!(api.0.host, de_api.0.host);
assert_eq!(api.0.port, de_api.0.port);
}
#[ignore]
#[test]
fn login_test() {
use std::env;
let user = env::var("TEST_USER").unwrap();
let pass = env::var("TEST_PASSWORD").unwrap();
let api = ConnectApi::default();
let req = AuthLoginRequest {
email: user,
password: pass,
};
assert!(api.login(&req).is_ok());
}
#[ignore]
#[test]
fn token_check_test() {
let api = ConnectApi::default();
let tok_req = get_token();
assert!(api.check_token(&tok_req).is_ok());
}
#[ignore]
#[test]
fn token_refresh_test() {
let api = ConnectApi::default();
let tok_req = get_token();
let tok_refresh = api.refresh_token(&tok_req);
assert!(tok_refresh.is_ok());
}
fn get_token() -> AuthLoginResponse {
use std::env;
let user = env::var("TEST_USER").unwrap();
let pass = env::var("TEST_PASSWORD").unwrap();
let api = ConnectApi::default();
let req = AuthLoginRequest {
email: user,
password: pass,
};
api.login(&req).unwrap()
}
}