pub mod filters { use super::handlers; use super::models::{Srv, ListOptions}; use hastic::services::analytic_service::analytic_client::AnalyticClient; use warp::Filter; /// The 4 REST API filters combined. pub fn filters( db: Srv, ac: AnalyticClient, ) -> impl Filter + Clone { list(db.clone()) .or(create(db.clone(), ac.clone())) // .or(update(db.clone())) .or(delete(db.clone(), ac.clone())) } /// GET /segments?from=3&to=5 pub fn list( db: Srv, ) -> impl Filter + Clone { warp::path!("segments") .and(warp::get()) .and(warp::query::()) .and(with_srv(db)) .and_then(handlers::list) } /// POST /segments with JSON body pub fn create( db: Srv, ac: AnalyticClient, ) -> impl Filter + Clone { warp::path!("segments") .and(warp::post()) .and(warp::body::json()) .and(with_srv(db)) .and(warp::any().map(move || ac.clone())) .and_then(handlers::create) } /// POST /segments with JSON body pub fn delete( db: Srv, ac: AnalyticClient, ) -> impl Filter + Clone { warp::path!("segments") .and(warp::delete()) .and(warp::query::()) .and(with_srv(db)) .and(warp::any().map(move || ac.clone())) .and_then(handlers::delete) } fn with_srv(db: Srv) -> impl Filter + Clone { warp::any().map(move || db.clone()) } } mod handlers { use hastic::services::analytic_service::analytic_client::AnalyticClient; use hastic::services::segments_service; use super::models::{Srv, ListOptions}; use crate::api; use crate::api::BadQuery; use crate::api::API; pub async fn list(opts: ListOptions, src: Srv) -> Result { match src.get_segments_intersected(opts.from, opts.to) { Ok(segments) => Ok(API::json(&segments)), // TODO: return proper http error Err(_e) => Err(warp::reject::custom(BadQuery)), } } pub async fn create( segment: segments_service::Segment, src: Srv, ac: AnalyticClient, ) -> Result { match src.insert_segment(&segment) { Ok(segment) => { ac.run_learning().await.unwrap(); Ok(API::json(&segment)) } Err(e) => { println!("{:?}", e); // TODO: return proper http error Err(warp::reject::custom(BadQuery)) } } } pub async fn delete(opts: ListOptions, db: Srv, ac: AnalyticClient,) -> Result { match db.delete_segments_in_range(opts.from, opts.to) { Ok(count) => { ac.run_learning().await.unwrap(); Ok(API::json(&api::Message { message: count.to_string(), })) }, // TODO: return proper http error Err(_e) => Err(warp::reject::custom(BadQuery)), } } } mod models { use hastic::services::segments_service::{self, SegmentId}; use serde::{Deserialize, Serialize}; pub type Srv = segments_service::SegmentsService; // The query parameters for list_todos. #[derive(Debug, Deserialize)] pub struct ListOptions { pub from: u64, pub to: u64, } #[derive(Debug, Serialize)] pub struct CreateResponse { pub id: SegmentId, } }