#![warn(rustdoc::broken_intra_doc_links)]
#![warn(missing_docs)]
#![warn(rustdoc::missing_crate_level_docs)]
use std::error::Error;
pub mod azure;
mod crud;
mod model;
use azure::AzureADToken;
use model::release::GitHubRelease;
pub use model::{
requests::{
DisplayFilterOption, ListTokenResponse, PatTokenCreateRequest, PatTokenDeleteRequest,
PatTokenGetRequest, PatTokenListRequest, PatTokenResult,
},
token::PatToken,
};
use reqwest::Client;
use reqwest::IntoUrl;
use reqwest::Method;
use reqwest::header;
const API_VERSION: &str = "7.1-preview.1";
pub struct PatTokenManager {
pub ad_token: AzureADToken,
pub client: Client,
pub pat_url: String,
}
impl PatTokenManager {
pub async fn new(ad_token: AzureADToken) -> Result<Self, Box<dyn Error>> {
let organization = azure::get_organization(&ad_token).await?;
let pat_url = format!(
"https://vssps.dev.azure.com/{}/_apis/tokens/pats",
organization
);
Ok(Self {
ad_token,
client: Client::new(),
pat_url,
})
}
fn base_request<U>(&self, method: Method, url: U) -> reqwest::RequestBuilder
where
U: IntoUrl,
{
self.client
.request(method, url)
.header("Authorization", format!("Bearer {}", self.ad_token))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.query(&[("api-version", API_VERSION)])
}
}
pub async fn get_latest_version() -> Result<String, Box<dyn Error>> {
let response = Client::new()
.request(
Method::GET,
"https://api.github.com/repos/jvanbuel/pattrick/releases",
)
.header(header::USER_AGENT, "Pattrick")
.header(header::HOST, "api.github.com")
.send()
.await?;
let gh_response = response.json::<Vec<GitHubRelease>>().await?;
Ok(gh_response[0].tag_name.clone())
}