use std::collections::BTreeMap;
use url::form_urlencoded;
use crate::{
CreateProject, Jira, Project, ProjectComponent, ProjectRole, ProjectSearchOptions,
ProjectSearchResults, Result, UpdateProject, Version,
};
#[derive(Debug)]
pub struct Projects {
jira: Jira,
}
impl Projects {
pub fn new(jira: &Jira) -> Projects {
Projects { jira: jira.clone() }
}
pub fn list(&self) -> Result<Vec<Project>> {
self.jira.get::<Vec<Project>>("api", "/project")
}
pub fn get<I>(&self, id: I) -> Result<Project>
where
I: Into<String>,
{
let id = id.into();
self.jira.get::<Project>("api", &format!("/project/{}", id))
}
pub fn create(&self, project: CreateProject) -> Result<Project> {
self.jira
.post::<Project, CreateProject>("api", "/project", project)
}
pub fn update<I>(&self, id: I, project: UpdateProject) -> Result<Project>
where
I: Into<String>,
{
let id = id.into();
self.jira
.put::<Project, UpdateProject>("api", &format!("/project/{}", id), project)
}
pub fn delete<I>(&self, id: I) -> Result<()>
where
I: Into<String>,
{
let id = id.into();
self.jira
.delete::<crate::EmptyResponse>("api", &format!("/project/{}", id))?;
Ok(())
}
pub fn get_versions<I>(&self, project_id: I) -> Result<Vec<Version>>
where
I: Into<String>,
{
let project_id = project_id.into();
self.jira
.get::<Vec<Version>>("api", &format!("/project/{}/versions", project_id))
}
pub fn get_components<I>(&self, project_id: I) -> Result<Vec<ProjectComponent>>
where
I: Into<String>,
{
let project_id = project_id.into();
self.jira
.get::<Vec<ProjectComponent>>("api", &format!("/project/{}/components", project_id))
}
pub fn search(&self, options: &ProjectSearchOptions) -> Result<ProjectSearchResults> {
let mut path = vec!["/project/search".to_owned()];
let query_options = options.serialize().unwrap_or_default();
if !query_options.is_empty() {
let query = form_urlencoded::Serializer::new(String::new())
.extend_pairs(&query_options)
.finish();
path.push(query);
}
self.jira
.get::<ProjectSearchResults>("api", &path.join("?"))
}
pub fn get_roles<I>(&self, project_id: I) -> Result<BTreeMap<String, String>>
where
I: Into<String>,
{
let project_id = project_id.into();
self.jira
.get::<BTreeMap<String, String>>("api", &format!("/project/{}/role", project_id))
}
pub fn get_role_users<I>(&self, project_id: I, role_id: u64) -> Result<ProjectRole>
where
I: Into<String>,
{
let project_id = project_id.into();
self.jira
.get::<ProjectRole>("api", &format!("/project/{}/role/{}", project_id, role_id))
}
}
#[cfg(feature = "async")]
use crate::r#async::Jira as AsyncJira;
#[cfg(feature = "async")]
#[derive(Debug)]
pub struct AsyncProjects {
jira: AsyncJira,
}
#[cfg(feature = "async")]
impl AsyncProjects {
pub fn new(jira: &AsyncJira) -> AsyncProjects {
AsyncProjects { jira: jira.clone() }
}
pub async fn list(&self) -> Result<Vec<Project>> {
self.jira.get::<Vec<Project>>("api", "/project").await
}
pub async fn get<I>(&self, id: I) -> Result<Project>
where
I: Into<String>,
{
let id = id.into();
self.jira
.get::<Project>("api", &format!("/project/{}", id))
.await
}
pub async fn create(&self, project: CreateProject) -> Result<Project> {
self.jira
.post::<Project, CreateProject>("api", "/project", project)
.await
}
pub async fn update<I>(&self, id: I, project: UpdateProject) -> Result<Project>
where
I: Into<String>,
{
let id = id.into();
self.jira
.put::<Project, UpdateProject>("api", &format!("/project/{}", id), project)
.await
}
pub async fn delete<I>(&self, id: I) -> Result<()>
where
I: Into<String>,
{
let id = id.into();
self.jira
.delete::<crate::EmptyResponse>("api", &format!("/project/{}", id))
.await?;
Ok(())
}
pub async fn get_versions<I>(&self, project_id: I) -> Result<Vec<Version>>
where
I: Into<String>,
{
let project_id = project_id.into();
self.jira
.get::<Vec<Version>>("api", &format!("/project/{}/versions", project_id))
.await
}
pub async fn get_components<I>(&self, project_id: I) -> Result<Vec<ProjectComponent>>
where
I: Into<String>,
{
let project_id = project_id.into();
self.jira
.get::<Vec<ProjectComponent>>("api", &format!("/project/{}/components", project_id))
.await
}
pub async fn search(&self, options: &ProjectSearchOptions) -> Result<ProjectSearchResults> {
let mut path = vec!["/project/search".to_owned()];
let query_options = options.serialize().unwrap_or_default();
if !query_options.is_empty() {
let query = form_urlencoded::Serializer::new(String::new())
.extend_pairs(&query_options)
.finish();
path.push(query);
}
self.jira
.get::<ProjectSearchResults>("api", &path.join("?"))
.await
}
pub async fn get_roles<I>(&self, project_id: I) -> Result<BTreeMap<String, String>>
where
I: Into<String>,
{
let project_id = project_id.into();
self.jira
.get::<BTreeMap<String, String>>("api", &format!("/project/{}/role", project_id))
.await
}
pub async fn get_role_users<I>(&self, project_id: I, role_id: u64) -> Result<ProjectRole>
where
I: Into<String>,
{
let project_id = project_id.into();
self.jira
.get::<ProjectRole>("api", &format!("/project/{}/role/{}", project_id, role_id))
.await
}
}