use warp::Filter;
use std::collections::HashMap;
use super::handlers;
use super::models::{comment::Comment, reply::Reply, upvote::Upvote, downvote::Downvote};
use super::db::DbConn;
pub fn comments(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
list_comments( db_conn.clone() )
.or( more_comments( db_conn.clone() ) )
.or( comments_create( db_conn.clone() ) )
.or( comments_update( db_conn.clone() ) )
.or( comments_delete( db_conn.clone() ) )
.or( get_comment( db_conn.clone() ) )
.or( update_comment_status( db_conn.clone() ) )
.or( update_comment_message( db_conn.clone() ) )
.or( comments_total( db_conn.clone() ) )
.or( replies_create( db_conn.clone() ) )
.or( list_replies( db_conn.clone() ) )
.or( replies_update( db_conn.clone() ) )
.or( replies_delete( db_conn.clone() ) )
.or( get_reply( db_conn.clone() ) )
.or( update_reply_message( db_conn.clone() ) )
.or( upvotes_create( db_conn.clone() ) )
.or( upvotes_delete( db_conn.clone() ) )
.or( upvotes_total( db_conn.clone() ) )
.or( downvotes_create( db_conn.clone() ) )
.or( downvotes_delete( db_conn.clone() ) )
.or( downvotes_total( db_conn.clone() ) )
}
pub fn list_comments(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("comments")
.and(warp::get())
.and(with_db_conn(db_conn))
.and_then(handlers::list_comments)
}
pub fn more_comments(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("more_comments" / usize)
.and(warp::get())
.and(with_db_conn(db_conn))
.and_then(handlers::more_comments)
}
pub fn comments_create(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("comments")
.and(warp::post())
.and(json_comment_body())
.and(with_db_conn(db_conn))
.and_then(handlers::add_comment)
}
pub fn comments_update(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("comments" / String)
.and(warp::put())
.and(json_comment_body())
.and(with_db_conn(db_conn))
.and_then(handlers::update_comment)
}
pub fn update_comment_status(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("comment" / String / String)
.and(warp::put())
.and(with_db_conn(db_conn))
.and_then(handlers::update_comment_status)
}
pub fn update_comment_message(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("comment_message" / String)
.and(warp::put())
.and(json_message_body())
.and(with_db_conn(db_conn))
.and_then(handlers::update_comment_message)
}
pub fn comments_delete(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
let admin_only = warp::header::exact("authorization", "Bearer admin");
warp::path!("comments" / String)
.and(admin_only)
.and(warp::delete())
.and(with_db_conn(db_conn))
.and_then(handlers::delete_comment)
}
pub fn get_comment(
db_conn: DbConn
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("comments" / String)
.and(warp::get())
.and(with_db_conn(db_conn))
.and_then(handlers::get_comment)
}
fn with_db_conn(db_conn: DbConn) -> impl Filter<Extract = (DbConn,), Error = std::convert::Infallible> + Clone {
warp::any().map(move || db_conn.clone())
}
fn json_comment_body() -> impl Filter<Extract = (Comment,), Error = warp::Rejection> + Clone {
warp::body::content_length_limit(1024 * 16).and(warp::body::json())
}
fn json_message_body() -> impl Filter<Extract = (HashMap<String, String>,), Error = warp::Rejection> + Clone {
warp::body::content_length_limit(1024 * 16).and(warp::body::json())
}
pub fn comments_total(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("comments_total")
.and(warp::get())
.and(with_db_conn(db_conn))
.and_then(handlers::comments_total)
}
pub fn replies_create(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("replies")
.and(warp::post())
.and(json_reply_body())
.and(with_db_conn(db_conn))
.and_then(handlers::add_reply)
}
fn json_reply_body() -> impl Filter<Extract = (Reply,), Error = warp::Rejection> + Clone {
warp::body::content_length_limit(1024 * 16).and( warp::body::json() )
}
pub fn list_replies(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("replies" / String)
.and(warp::get())
.and(with_db_conn(db_conn))
.and_then(handlers::list_replies)
}
pub fn replies_update(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("replies" / String)
.and(warp::put())
.and(json_reply_body())
.and(with_db_conn(db_conn))
.and_then(handlers::update_reply)
}
pub fn update_reply_message(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("reply_message" / String)
.and(warp::put())
.and(json_message_body())
.and(with_db_conn(db_conn))
.and_then(handlers::update_reply_message)
}
pub fn replies_delete(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
let admin_only = warp::header::exact("authorization", "Bearer admin");
warp::path!("replies" / String)
.and(admin_only)
.and(warp::delete())
.and(with_db_conn(db_conn))
.and_then(handlers::delete_reply)
}
pub fn get_reply(
db_conn: DbConn
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("reply" / String)
.and(warp::get())
.and(with_db_conn(db_conn))
.and_then(handlers::get_reply)
}
pub fn upvotes_create(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("upvotes")
.and(warp::post())
.and(json_upvote_body())
.and(with_db_conn(db_conn))
.and_then(handlers::add_upvote)
}
fn json_upvote_body() -> impl Filter<Extract = (Upvote,), Error = warp::Rejection> + Clone {
warp::body::content_length_limit(1024 * 16).and(warp::body::json())
}
pub fn upvotes_delete(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
let admin_only = warp::header::exact("authorization", "Bearer admin");
warp::path!("upvotes" / String / String)
.and(admin_only)
.and(warp::delete())
.and(with_db_conn(db_conn))
.and_then(handlers::delete_upvote)
}
pub fn upvotes_total(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("upvotes_total" / String)
.and(warp::get())
.and(with_db_conn(db_conn))
.and_then(handlers::upvotes_total)
}
pub fn downvotes_create(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("downvotes")
.and(warp::post())
.and(json_downvote_body())
.and(with_db_conn(db_conn))
.and_then(handlers::add_downvote)
}
fn json_downvote_body() -> impl Filter<Extract = (Downvote,), Error = warp::Rejection> + Clone {
warp::body::content_length_limit(1024 * 16).and(warp::body::json())
}
pub fn downvotes_delete(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
let admin_only = warp::header::exact("authorization", "Bearer admin");
warp::path!("downvotes" / String / String)
.and(admin_only)
.and(warp::delete())
.and(with_db_conn(db_conn))
.and_then(handlers::delete_downvote)
}
pub fn downvotes_total(
db_conn: DbConn,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
warp::path!("downvotes_total" / String)
.and(warp::get())
.and(with_db_conn(db_conn))
.and_then(handlers::downvotes_total)
}