UNPKG

3.15 kBPlain TextView Raw
1import { Subject } from 'rxjs';
2
3import { DI } from '@leanup/lib';
4
5import { MeasuredItemModel } from '../../models/measured-item.model';
6import { MeasuredSerieModel } from '../../models/measured-series.model';
7import { StorageService } from '../storage/service';
8
9interface MeasurementInterface {
10 date: Date;
11 value: number;
12}
13
14interface MeasuredSerieInterface {
15 title: string;
16 unit: string;
17 id: number;
18 measurements: MeasurementInterface[];
19}
20
21export class MeasurementService {
22 private measuredSeries: MeasuredSerieModel[] = [];
23 private readonly storageStorage: StorageService = DI.get<StorageService>('StorageService');
24 public readonly observe: Subject<MeasuredSerieModel[]> = new Subject();
25
26 public constructor() {
27 this.restore();
28 }
29
30 public getSeries(): MeasuredSerieModel[] {
31 this.restore();
32 return this.measuredSeries;
33 }
34
35 public getSerie(id: number): MeasuredSerieModel {
36 const measuredSerie = this.measuredSeries.find((measuredSerie: MeasuredSerieModel) => {
37 // tslint:disable-next-line: triple-equals
38 return measuredSerie.getId() == id;
39 });
40 if (measuredSerie instanceof MeasuredSerieModel) {
41 return measuredSerie;
42 } else {
43 throw new Error(`No measured serie of id ${id} found.`);
44 }
45 }
46
47 public addSerie(serie: MeasuredSerieModel): void {
48 if (serie instanceof MeasuredSerieModel) {
49 this.measuredSeries.push(serie);
50 this.store();
51 } else {
52 throw new Error(`The measuring serie is not valid!`);
53 }
54 }
55
56 public removeSerie(serie: MeasuredSerieModel): void {
57 const index = this.measuredSeries.indexOf(serie);
58 if (index >= 0) {
59 this.measuredSeries.splice(index, 1);
60 this.store();
61 }
62 }
63
64 private restore(): void {
65 let series: MeasuredSerieInterface[] = <MeasuredSerieInterface[]>this.storageStorage.getItem('measuredSeries');
66 this.measuredSeries = [];
67 if (Array.isArray(series) === false) {
68 series = [];
69 }
70 series.forEach((serie: MeasuredSerieInterface) => {
71 const measuredSerie = new MeasuredSerieModel(serie.title, serie.unit);
72 if (typeof serie.id === 'number') {
73 measuredSerie.setId(serie.id);
74 }
75 if (Array.isArray(serie.measurements)) {
76 serie.measurements.forEach((measurement: MeasurementInterface) => {
77 measuredSerie.addMeasurement(new MeasuredItemModel(measurement.date, measurement.value));
78 });
79 }
80 this.measuredSeries.push(measuredSerie);
81 });
82 }
83
84 public store(): void {
85 const series: Object[] = [];
86 this.measuredSeries.forEach((measuredSerie: MeasuredSerieModel) => {
87 const measurements: Object[] = [];
88 measuredSerie.getMeasurements().forEach((measurement: MeasuredItemModel) => {
89 measurements.push({
90 date: measurement.getDate(),
91 value: measurement.getValue(),
92 });
93 });
94 series.push({
95 id: measuredSerie.getId(),
96 measurements,
97 title: measuredSerie.getTitle(),
98 unit: measuredSerie.getUnit(),
99 });
100 });
101 this.storageStorage.setItem('measuredSeries', series);
102 this.observe.next([]);
103 }
104}