-
Notifications
You must be signed in to change notification settings - Fork 42
/
Copy pathsensor.js
126 lines (108 loc) · 2.91 KB
/
sensor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
'use strict';
const { mongoose } = require('../db'),
{ model: Measurement } = require('../measurement/measurement'),
ModelError = require('../modelError');
//Sensor schema
const sensorSchema = new mongoose.Schema({
title: {
type: String,
required: true,
trim: true
},
unit: {
type: String,
required: true,
trim: true
},
sensorType: {
type: String,
required: false,
trim: true
},
icon: {
type: String,
required: false,
trim: true
},
lastMeasurement: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Measurement'
}
}, { usePushEach: true });
sensorSchema.set('toJSON', {
virtuals: true
});
sensorSchema.methods.equals = function equals ({ unit, sensorType, title, _id }) {
if (_id) {
return this._id.equals(_id);
}
return unit === this.unit && sensorType === this.sensorType && title === this.title;
};
sensorSchema.methods.markForDeletion = function markForDeletion () {
this.markModified('deleteMe'); // markModified to be picked up by box pre save hook modifiedPaths
this._deleteMe = true; // gets checked
};
sensorSchema.methods.findLastMeasurement = function findLastMeasurement () {
return Measurement.find({ sensor_id: this._id })
.sort({ createdAt: -1 })
.limit(1)
.exec()
.then(function (lastMeasurement) {
if (lastMeasurement && Array.isArray(lastMeasurement) && lastMeasurement.length !== 0) {
return lastMeasurement[0];
}
});
};
sensorSchema.statics.findSensorsWithMeasurements = function findSensorsWithMeasurements ({ fromDate, toDate }) {
return Measurement.aggregate([
{
$match: {
createdAt: {
'$gt': fromDate.toDate(),
'$lt': toDate.toDate()
}
}
},
{
$group: {
_id: '$sensor_id'
},
}
])
.exec();
};
sensorSchema.methods.deleteMeasurements = function deleteMeasurements (createdAt) {
const sensor = this;
const query = {
sensor_id: sensor._id,
};
if (createdAt) {
query.createdAt = createdAt;
}
// delete measurements
return Measurement.find(query)
.remove()
.exec()
.then(function (removeResult) {
if (removeResult && removeResult.result && removeResult.result.n === 0) {
throw new ModelError('No matching measurements for specified query', { type: 'NotFoundError' });
}
// check if not all measurements were deleted
// need to find the new last measurement
if (typeof query.createdAt !== 'undefined') {
return sensor.findLastMeasurement();
}
return Promise.resolve();
})
.then(function (newLastMeasurement) {
sensor.set('lastMeasurement', newLastMeasurement);
});
};
sensorSchema.virtual('iconUrl').get(function () {
return `http://localhost:8000/assets/${this.icon}.png`;
});
const sensorModel = mongoose.model('Sensor', sensorSchema);
module.exports = {
schema: sensorSchema,
model: sensorModel
};