From ff4f998f6da427c7f420ee0d27b1cd1e319e6ddf Mon Sep 17 00:00:00 2001 From: Alexey Velikiy Date: Fri, 29 Oct 2021 18:21:57 +0300 Subject: [PATCH] segment ids --- client/src/components/Graph.vue | 21 +++++++++++++++++++-- client/src/components/hastic_pod/index.ts | 10 ++++++---- client/src/services/segments.ts | 5 ++--- client/src/types/segment.ts | 6 +++--- server/src/api/segments.rs | 19 +++++++++++++------ server/src/services/data_service.rs | 23 ++++++++++++++++------- 6 files changed, 59 insertions(+), 25 deletions(-) diff --git a/client/src/components/Graph.vue b/client/src/components/Graph.vue index 178d08d..4168d2d 100644 --- a/client/src/components/Graph.vue +++ b/client/src/components/Graph.vue @@ -9,10 +9,12 @@ import { getMetrics } from '../services/metrics.service'; import { postSegment } from '../services/segments'; import { LineTimeSerie } from "@chartwerk/line-pod"; -import _ from "lodash"; import { SegmentArray } from '@/types/segment_array'; +import { Segment, SegmentId } from '@/types/segment'; +import _ from "lodash"; +// TODO: move to store async function resolveData(range: TimeRange): Promise { // TODO: return segments from the promise too const endTime = Math.floor(range.to); @@ -35,6 +37,21 @@ async function resolveData(range: TimeRange): Promise { } } +// TODO: move to store +async function addSegment(segment: Segment): Promise { + try { + const id = await postSegment(segment); + return id; + } catch (e) { + this.$notify({ + title: "Error during saving segment", + text: e, + type: 'error' + }); + console.error(e); + } +} + export default defineComponent({ name: 'Graph', props: {}, @@ -46,7 +63,7 @@ export default defineComponent({ var pod = new HasticPod( document.getElementById('chart'), resolveData.bind(this), - postSegment, + addSegment.bind(this), s ); pod.render(); diff --git a/client/src/components/hastic_pod/index.ts b/client/src/components/hastic_pod/index.ts index 4bfabfe..45774b5 100644 --- a/client/src/components/hastic_pod/index.ts +++ b/client/src/components/hastic_pod/index.ts @@ -107,16 +107,18 @@ export class HasticPod extends LinePod { } } - protected addLabeling(from: number, to: number) { + protected async addLabeling(from: number, to: number) { // TODO: implement // TODO: persistance of the label - // const id = this.getNewTempSegmentId(); + const id = this.getNewTempSegmentId(); from = Math.floor(from); to = Math.ceil(to); - const segment = new Segment(undefined, from, to); + const segment = new Segment(id, from, to); + const storedId = await this._usc(segment); + segment.id = storedId; + this._segmentSet.addSegment(segment); - this._usc(segment); this.renderSegment(segment); } diff --git a/client/src/services/segments.ts b/client/src/services/segments.ts index 08bf122..b4e6d0c 100644 --- a/client/src/services/segments.ts +++ b/client/src/services/segments.ts @@ -20,8 +20,7 @@ export async function getSegments(from: number, to: number) { } export async function postSegment(segment: Segment): Promise { - delete segment.id; // because we post a new segment + segment.id = undefined; // because we post a new segment. It's a hack const resp = await axios.post(SEGMENTS_API_URL, segment); - console.log(resp); - return 10 + ""; + return resp['data']['id']; } diff --git a/client/src/types/segment.ts b/client/src/types/segment.ts index 8a2664b..4b39088 100644 --- a/client/src/types/segment.ts +++ b/client/src/types/segment.ts @@ -2,9 +2,9 @@ export type SegmentId = string; export class Segment { constructor(private _id: SegmentId | undefined, public from: number, public to: number) { - // if(this._id === undefined) { - // throw new Error('id is undefined'); - // } + if(this._id === undefined) { + throw new Error('id is undefined'); + } if(isNaN(+from)) { throw new Error('from can`t be NaN'); } diff --git a/server/src/api/segments.rs b/server/src/api/segments.rs index 9258086..219e143 100644 --- a/server/src/api/segments.rs +++ b/server/src/api/segments.rs @@ -42,8 +42,7 @@ pub mod filters { mod handlers { use hastic::services::data_service; - use super::models::Db; - use super::models::ListOptions; + use super::models::{ Db, ListOptions, CreateResponse }; use crate::api::BadQuery; use crate::api::API; @@ -61,16 +60,19 @@ mod handlers { ) -> Result { // Just return a JSON array of todos, applying the limit and offset. match db.write().insert_segment(&segment) { - Ok(segments) => Ok(API::json(&segments)), - Err(e) => Err(warp::reject::custom(BadQuery)), + Ok(id) => Ok(API::json(&CreateResponse { id })), + Err(e) => { + println!("{:?}", e); + Err(warp::reject::custom(BadQuery)) + } } } } mod models { - use hastic::services::data_service; + use hastic::services::data_service::{self, SegmentId}; use parking_lot::RwLock; - use serde::Deserialize; + use serde::{Deserialize, Serialize}; use std::sync::Arc; pub type Db = Arc>; @@ -81,4 +83,9 @@ mod models { pub from: u64, pub to: u64, } + + #[derive(Debug, Serialize )] + pub struct CreateResponse { + pub id: SegmentId, + } } diff --git a/server/src/services/data_service.rs b/server/src/services/data_service.rs index 5647092..97f6506 100644 --- a/server/src/services/data_service.rs +++ b/server/src/services/data_service.rs @@ -4,9 +4,14 @@ use serde::{Deserialize, Serialize}; use std::sync::{Arc, Mutex}; +use std::iter::repeat_with; + +const ID_LENGTH: usize = 20; +pub type SegmentId = String; + #[derive(Debug, Serialize, Deserialize)] pub struct Segment { - pub id: Option, + pub id: Option, pub from: u64, pub to: u64, } @@ -23,7 +28,7 @@ impl DataService { let conn = Connection::open("./data.db")?; conn.execute( "CREATE TABLE IF NOT EXISTS segment ( - id INTEGER PRIMARY KEY, + id TEXT PRIMARY KEY, start INTEGER NOT NULL, end INTEGER NOT NULL )", @@ -35,19 +40,23 @@ impl DataService { }) } - pub fn insert_segment(&self, segment: &Segment) -> anyhow::Result { + // returns id of created segment + pub fn insert_segment(&self, segment: &Segment) -> anyhow::Result { + let id: SegmentId = repeat_with(fastrand::alphanumeric) + .take(ID_LENGTH) + .collect(); // TODO: merge with other segments self.connection.lock().unwrap().execute( - "INSERT INTO segment (start, end) VALUES (?1, ?2)", - params![segment.from, segment.to], + "INSERT INTO segment (id, start, end) VALUES (?1, ?2, ?3)", + params![id, segment.from, segment.to], )?; - Ok(10) + Ok(id) } pub fn get_segments(&self, from: u64, to: u64) -> anyhow::Result> { let conn = self.connection.lock().unwrap(); let mut stmt = - conn.prepare("SELECT id, start, end FROM person WHERE ?1 < start AND end < ?2")?; + conn.prepare("SELECT id, start, end FROM segment WHERE ?1 < start AND end < ?2")?; let res = stmt .query_map(params![from, to], |row| {