diff --git a/server/src/analytic_unit.rs b/server/src/analytic_unit.rs index b2d6eb8..03d0b5c 100644 --- a/server/src/analytic_unit.rs +++ b/server/src/analytic_unit.rs @@ -1,3 +1,3 @@ struct AnalyticUnit { - // TODO: fields + // TODO: field } diff --git a/server/src/api.rs b/server/src/api.rs index 3918cff..1acc0ce 100644 --- a/server/src/api.rs +++ b/server/src/api.rs @@ -7,10 +7,10 @@ use warp::reject::Reject; use warp::{body, options, Rejection, Reply}; use warp::{http::Response, Filter}; +mod analytics; mod auth; mod metric; mod segments; -mod analytics; use serde::Serialize; @@ -31,8 +31,8 @@ pub struct API<'a> { config: &'a Config, user_service: Arc>, metric_service: Arc>, - data_service: Arc>, - analytic_service: AnalyticService + data_service: segments_service::SegmentsService, + analytic_service: AnalyticService, } impl API<'_> { @@ -44,8 +44,8 @@ impl API<'_> { &config.prom_url, &config.query, ))), - data_service: Arc::new(RwLock::new(segments_service::SegmentsService::new()?)), - analytic_service: AnalyticService::new(config) + data_service: segments_service::SegmentsService::new()?, + analytic_service: AnalyticService::new(config), }) } diff --git a/server/src/api/analytics.rs b/server/src/api/analytics.rs index c723b1f..49b11f6 100644 --- a/server/src/api/analytics.rs +++ b/server/src/api/analytics.rs @@ -1,6 +1,6 @@ pub mod filters { use super::handlers; - use super::models::{Srv, ListOptions}; + use super::models::{ListOptions, Srv}; use warp::Filter; /// The 4 REST API filters combined. @@ -8,11 +8,11 @@ pub mod filters { srv: Srv, ) -> impl Filter + Clone { list(srv.clone()) - // .or(create(db.clone())) - // // .or(update(db.clone())) - // .or(delete(db.clone())) + // .or(create(db.clone())) + // // .or(update(db.clone())) + // .or(delete(db.clone())) } - + /// GET /analytics?from=3&to=5 pub fn list( db: Srv, @@ -24,7 +24,9 @@ pub mod filters { .and_then(handlers::list) } - fn with_srv(srv: Srv) -> impl Filter + Clone { + fn with_srv( + srv: Srv, + ) -> impl Filter + Clone { warp::any().map(move || srv.clone()) } } @@ -32,8 +34,8 @@ pub mod filters { mod handlers { use super::models::{ListOptions, Srv}; - use crate::api::{API, BadQuery}; - + use crate::api::{BadQuery, API}; + pub async fn list(opts: ListOptions, srv: Srv) -> Result { match srv.get_detections(opts.from, opts.to, 10).await { Ok(segments) => Ok(API::json(&segments)), @@ -57,4 +59,4 @@ mod models { pub from: u64, pub to: u64, } -} \ No newline at end of file +} diff --git a/server/src/api/segments.rs b/server/src/api/segments.rs index 336cd31..c4f3bde 100644 --- a/server/src/api/segments.rs +++ b/server/src/api/segments.rs @@ -53,17 +53,17 @@ pub mod filters { mod handlers { use hastic::services::segments_service; - use hastic::services::segments_service::Segment; - use super::models::{CreateResponse, Db, ListOptions}; + use super::models::{Db, ListOptions}; use crate::api; use crate::api::BadQuery; use crate::api::API; pub async fn list(opts: ListOptions, db: Db) -> Result { - match db.read().get_segments_intersected(opts.from, opts.to) { + match db.get_segments_intersected(opts.from, opts.to) { Ok(segments) => Ok(API::json(&segments)), - Err(e) => Err(warp::reject::custom(BadQuery)), + // TODO: return proper http error + Err(_e) => Err(warp::reject::custom(BadQuery)), } } @@ -71,32 +71,32 @@ mod handlers { segment: segments_service::Segment, db: Db, ) -> Result { - match db.write().insert_segment(&segment) { + match db.insert_segment(&segment) { Ok(segment) => 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: Db) -> Result { - match db.read().delete_segments_in_range(opts.from, opts.to) { + match db.delete_segments_in_range(opts.from, opts.to) { Ok(count) => Ok(API::json(&api::Message { message: count.to_string(), })), - Err(e) => Err(warp::reject::custom(BadQuery)), + // TODO: return proper http error + Err(_e) => Err(warp::reject::custom(BadQuery)), } } } mod models { use hastic::services::segments_service::{self, SegmentId}; - use parking_lot::RwLock; use serde::{Deserialize, Serialize}; - use std::sync::Arc; - pub type Db = Arc>; + pub type Db = segments_service::SegmentsService; // The query parameters for list_todos. #[derive(Debug, Deserialize)] diff --git a/server/src/services.rs b/server/src/services.rs index fc83fda..be9a213 100644 --- a/server/src/services.rs +++ b/server/src/services.rs @@ -1,4 +1,4 @@ +pub mod analytic_service; pub mod metric_service; pub mod segments_service; pub mod user_service; -pub mod analytic_service; diff --git a/server/src/services/README.md b/server/src/services/README.md new file mode 100644 index 0000000..8bd20e8 --- /dev/null +++ b/server/src/services/README.md @@ -0,0 +1,3 @@ +## Services + +Services tend to be Clonable because it's the way warp works (mulithreaded) diff --git a/server/src/services/analytic_service.rs b/server/src/services/analytic_service.rs index 5548d44..f435344 100644 --- a/server/src/services/analytic_service.rs +++ b/server/src/services/analytic_service.rs @@ -1,12 +1,14 @@ use crate::{config::Config, utils::get_random_str}; -use super::{metric_service::MetricService, segments_service::{ID_LENGTH, Segment, SegmentType}}; +use super::{ + metric_service::MetricService, + segments_service::{Segment, SegmentType, ID_LENGTH}, +}; use subbeat::metric::Metric; use anyhow; - #[derive(Clone)] pub struct AnalyticService { metric_service: MetricService, @@ -19,7 +21,12 @@ impl AnalyticService { } } - pub async fn get_detections(&self, from: u64, to: u64, step: u64) -> anyhow::Result> { + pub async fn get_detections( + &self, + from: u64, + to: u64, + step: u64, + ) -> anyhow::Result> { let prom = self.metric_service.get_prom(); let mr = prom.query(from, to, step).await?; @@ -33,7 +40,7 @@ impl AnalyticService { let mut result = Vec::::new(); let mut from: Option = None; for (t, v) in ts { - if *v > 10_000.0 { + if *v > 100_000.0 { if from.is_some() { continue; } else { diff --git a/server/src/services/segments_service.rs b/server/src/services/segments_service.rs index 389c88f..f0ea812 100644 --- a/server/src/services/segments_service.rs +++ b/server/src/services/segments_service.rs @@ -1,4 +1,4 @@ -use rusqlite::{params, Connection, Row, ToSql}; +use rusqlite::{params, Connection, Row}; use serde::{Deserialize, Serialize}; @@ -6,11 +6,9 @@ use std::sync::{Arc, Mutex}; use crate::utils::get_random_str; - pub const ID_LENGTH: usize = 20; pub type SegmentId = String; - // TODO: make logic with this enum shorter #[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)] pub enum SegmentType { @@ -36,7 +34,6 @@ impl SegmentType { } } - #[derive(Debug, Serialize, Deserialize)] pub struct Segment { pub id: Option, @@ -56,14 +53,13 @@ impl Segment { } } - +#[derive(Clone)] pub struct SegmentsService { connection: Arc>, } impl SegmentsService { pub fn new() -> anyhow::Result { - // TODO: move it to data service std::fs::create_dir_all("./data").unwrap(); diff --git a/server/src/utils.rs b/server/src/utils.rs index e0b8ffb..160dfec 100644 --- a/server/src/utils.rs +++ b/server/src/utils.rs @@ -1,6 +1,5 @@ use std::iter::repeat_with; pub fn get_random_str(len: usize) -> String { - return repeat_with(fastrand::alphanumeric).take(len) - .collect(); + return repeat_with(fastrand::alphanumeric).take(len).collect(); }