use super::{ApiLinks, ApiMeta};
use super::{HasPagination, HasResponse, HasValue};
use crate::method::{Create, Delete, Get, List};
use crate::request::CertificateRequest;
use crate::request::Request;
use crate::{ROOT_URL, STATIC_URL_ERROR};
use chrono::{DateTime, Utc};
use getset::{Getters, Setters};
use serde::Serialize;
use std::fmt::Display;
use url::Url;
const CERTIFICATES_SEGMENT: &str = "certificates";
#[derive(Deserialize, Serialize, Debug, Clone, Getters, Setters)]
#[get = "pub"]
pub struct Certificate {
id: String,
name: String,
not_after: DateTime<Utc>,
sha1_fingerprint: String,
created_at: DateTime<Utc>
}
impl Certificate {
pub fn create<S>(name: S, private_key: S, leaf_certificate: S) -> CertificateRequest<Create, Certificate>
where S: AsRef<str> + Serialize + Display {
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(CERTIFICATES_SEGMENT);
let mut req = Request::new(url);
req.set_body(json!({
"name": name,
"private_key": private_key,
"leaf_certificate": leaf_certificate,
}));
req
}
pub fn list() -> CertificateRequest<List, Vec<Certificate>> {
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(CERTIFICATES_SEGMENT);
Request::new(url)
}
pub fn get<N: AsRef<str> + Display>(id: N) -> CertificateRequest<Get, Certificate> {
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(CERTIFICATES_SEGMENT)
.push(id.as_ref());
Request::new(url)
}
pub fn delete<N: AsRef<str> + Display>(id: N) -> CertificateRequest<Delete, ()> {
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(CERTIFICATES_SEGMENT)
.push(id.as_ref());
Request::new(url)
}
}
impl CertificateRequest<Create, Certificate> {
pub fn certificate_chain<S: AsRef<str> + Serialize + Display>(mut self, val: S) -> Self {
self.body_mut()["certificate_chain"] = json!(val);
self
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct CertificateResponse {
certificate: Certificate
}
impl HasResponse for Certificate {
type Response = CertificateResponse;
}
impl HasValue for CertificateResponse {
type Value = Certificate;
fn value(self) -> Certificate {
self.certificate
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct CertificateListResponse {
certificates: Vec<Certificate>,
links: ApiLinks,
meta: ApiMeta
}
impl HasResponse for Vec<Certificate> {
type Response = CertificateListResponse;
}
impl HasPagination for CertificateListResponse {
fn next_page(&self) -> Option<Url> {
self.links.next()
}
}
impl HasValue for CertificateListResponse {
type Value = Vec<Certificate>;
fn value(self) -> Vec<Certificate> {
self.certificates
}
}