Hastic standalone https://hastic.io
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
3.9 KiB

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