use hyper::{Error as HyperError, Url};
use serde_json;
use activity::common::Subscription;
use common::Repository;
use client::Client;
use error;
use utils;
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Notification {
pub id: String,
pub repository: Repository,
pub subject: Subject,
pub reason: Option<String>,
pub unread: bool,
pub updated_at: String,
pub last_read_at: Option<String>,
pub url: String
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Subject {
pub title: String,
pub url: String,
pub latest_comment_url: String,
#[serde(rename = "type")]
pub subject_type: String
}
pub trait NotificationsExt {
fn get_notifications(&mut self,
all: Option<bool>,
participating: Option<bool>,
since: Option<String>,
before: Option<String>) -> Result<Vec<Notification>, error::Error>;
fn get_repos_owner_repo_notifications(&mut self,
owner: String,
repo: String,
all: Option<bool>,
participating: Option<bool>,
since: Option<String>,
before: Option<String>) -> Result<Vec<Notification>, error::Error>;
fn put_notifications(&mut self, last_read_at: String) -> Result<(), error::Error>;
fn put_repos_owner_repo_notifications(&mut self, owner: String, repo: String, last_read_at: String) -> Result<(), error::Error>;
fn get_notifications_threads_id(&mut self, id: String) -> Result<Notification, error::Error>;
fn patch_botifications_threads_id(&mut self, id: String) -> Result<(), error::Error>;
fn get_notifications_threads_id_subscription(&mut self, id: String) -> Result<Subscription, error::Error>;
fn put_notifications_threads_id_subscription(&mut self, id: String, subscribed: bool, ignored: bool) -> Result<Subscription, error::Error>;
fn delete_notifications_threads_id_subscription(&mut self, id: String) -> Result<(), error::Error>;
}
impl NotificationsExt for Client {
fn get_notifications(&mut self, all: Option<bool>, participating: Option<bool>, since: Option<String>, before: Option<String>) -> Result<Vec<Notification>, error::Error> {
let mut url = match Url::parse(&format!("{}/notifications", self.api_url)[..]) {
Ok(url) => url,
Err(err) => return Err(error::Error::HTTP(HyperError::Uri(err)))
};
{
let mut query_pairs = url.query_pairs_mut();
query_pairs.clear();
if let Some(param) = all {
query_pairs.append_pair("all", &format!("{}", param)[..]);
}
if let Some(param) = participating {
query_pairs.append_pair("participating", &format!("{}", param)[..]);
}
if let Some(param) = since {
query_pairs.append_pair("since", ¶m[..]);
}
if let Some(param) = before {
query_pairs.append_pair("before", ¶m[..]);
}
}
utils::request_endpoint(self, format!("/notifications?{}", url.query().unwrap()))
}
fn get_repos_owner_repo_notifications(&mut self, owner: String, repo: String, all: Option<bool>, participating: Option<bool>, since: Option<String>, before: Option<String>) -> Result<Vec<Notification>, error::Error> {
let mut url = match Url::parse(&format!("{}/repos/{}/{}/notifications", self.api_url, owner, repo)[..]) {
Ok(url) => url,
Err(err) => return Err(error::Error::HTTP(HyperError::Uri(err)))
};
{
let mut query_pairs = url.query_pairs_mut();
query_pairs.clear();
if let Some(param) = all {
query_pairs.append_pair("all", &format!("{}", param)[..]);
}
if let Some(param) = participating {
query_pairs.append_pair("participating", &format!("{}", param)[..]);
}
if let Some(param) = since {
query_pairs.append_pair("since", ¶m[..]);
}
if let Some(param) = before {
query_pairs.append_pair("before", ¶m[..]);
}
}
utils::request_endpoint(self, format!("/repos/{}/{}/notifications?{}", owner, repo, url.query().unwrap()))
}
fn put_notifications(&mut self, last_read_at: String) -> Result<(), error::Error> {
let mut url = match Url::parse(&format!("{}/notifications", self.api_url)[..]) {
Ok(url) => url,
Err(err) => return Err(error::Error::HTTP(HyperError::Uri(err)))
};
{
let mut query_pairs = url.query_pairs_mut();
query_pairs.clear();
query_pairs.append_pair("last_read_at", &last_read_at[..]);
}
match self.put(format!("/notifications?{}", url.query().unwrap()), None) {
Ok(_) => Ok(()),
Err(err) => Err(err)
}
}
fn put_repos_owner_repo_notifications(&mut self, owner: String, repo: String, last_read_at: String) -> Result<(), error::Error> {
let mut url = match Url::parse(&format!("{}/repos/{}/{}notifications", self.api_url, owner, repo)[..]) {
Ok(url) => url,
Err(err) => return Err(error::Error::HTTP(HyperError::Uri(err)))
};
{
let mut query_pairs = url.query_pairs_mut();
query_pairs.clear();
query_pairs.append_pair("last_read_at", &last_read_at[..]);
}
match self.put(format!("/repos/{}/{}notifications?{}", owner, repo, url.query().unwrap()), None) {
Ok(_) => Ok(()),
Err(err) => Err(err)
}
}
fn get_notifications_threads_id(&mut self, id: String) -> Result<Notification, error::Error> {
utils::request_endpoint(self, format!("/notifications/threads/{}", id))
}
fn patch_botifications_threads_id(&mut self, id: String) -> Result<(), error::Error> {
match self.patch(format!("/notifications/threads/{}", id), None) {
Ok(_) => Ok(()),
Err(err) => Err(err)
}
}
fn get_notifications_threads_id_subscription(&mut self, id: String) -> Result<Subscription, error::Error> {
utils::request_endpoint(self, format!("/notifications/threads/{}/subscription", id))
}
fn put_notifications_threads_id_subscription(&mut self, id: String, subscribed: bool, ignored: bool) -> Result<Subscription, error::Error> {
let mut url = match Url::parse(&format!("{}/notifications/threads/{}/subscription", self.api_url, id)[..]) {
Ok(url) => url,
Err(err) => return Err(error::Error::HTTP(HyperError::Uri(err)))
};
{
let mut query_pairs = url.query_pairs_mut();
query_pairs.clear();
query_pairs.append_pair("subscribed", &format!("{}", subscribed)[..]);
query_pairs.append_pair("ignored", &format!("{}", ignored)[..]);
}
let mut response = try!(self.put(format!("/notifications/threads/{}/subscription?{}", id, url.query().unwrap()), None));
let response_str = try!(Client::response_to_string(&mut response));
serde_json::from_str(&response_str[..]).map_err(error::Error::Parsing)
}
fn delete_notifications_threads_id_subscription(&mut self, id: String) -> Result<(), error::Error> {
match self.delete(format!("/notifications/threads/{}/subscription", id), None) {
Ok(_) => Ok(()),
Err(err) => Err(err)
}
}
}