|
|
@ -16,6 +16,7 @@ import { CreateSensorDto } from './dto/create-sensor.dto'; |
|
|
|
import { SensorResponseDto } from './dto/sensor-response.dto'; |
|
|
|
import { SensorResponseDto } from './dto/sensor-response.dto'; |
|
|
|
import { SensorDataResponseDto } from './dto/sensor-data-response.dto'; |
|
|
|
import { SensorDataResponseDto } from './dto/sensor-data-response.dto'; |
|
|
|
import { CreateSensorDataDto } from './dto/create-sensor-data.dto'; |
|
|
|
import { CreateSensorDataDto } from './dto/create-sensor-data.dto'; |
|
|
|
|
|
|
|
import { normalizeLimit } from 'src/utils/query_utils'; |
|
|
|
|
|
|
|
|
|
|
|
@Injectable() |
|
|
|
@Injectable() |
|
|
|
export class SensorsService { |
|
|
|
export class SensorsService { |
|
|
@ -144,21 +145,18 @@ export class SensorsService { |
|
|
|
opts: { from?: Date; to?: Date; limit?: number }, |
|
|
|
opts: { from?: Date; to?: Date; limit?: number }, |
|
|
|
): Promise<SensorDataResponseDto[]> { |
|
|
|
): Promise<SensorDataResponseDto[]> { |
|
|
|
await this.assertMemeberOfSensor(currentUserId, sensorId); |
|
|
|
await this.assertMemeberOfSensor(currentUserId, sensorId); |
|
|
|
const take = Math.min(Math.max(opts.limit ?? 50, 1), 500); // 1 ~ 500개
|
|
|
|
const take = normalizeLimit(opts.limit); |
|
|
|
|
|
|
|
const from = opts.from ?? new Date(0); |
|
|
|
|
|
|
|
const to = opts.to ?? new Date(); |
|
|
|
|
|
|
|
|
|
|
|
const data = this.dataRepo |
|
|
|
const data = this.dataRepo |
|
|
|
.createQueryBuilder('d') |
|
|
|
.createQueryBuilder('d') |
|
|
|
.select(['d.id', 'd.value', 'd.recordedAt']) |
|
|
|
.select(['d.id AS id', 'd.value AS value', 'd.recordedAt AS recordedAt']) |
|
|
|
.where('data.sensorId = :sensorId', { sensorId }); |
|
|
|
.where('d.sensorId = :sensorId', { sensorId }) |
|
|
|
|
|
|
|
.andWhere('d.recordedAt BETWEEN :from AND :to', { from, to }) |
|
|
|
|
|
|
|
.orderBy('d.recordedAt', 'DESC') |
|
|
|
|
|
|
|
.take(take); |
|
|
|
|
|
|
|
|
|
|
|
if (opts.from || opts.to) { |
|
|
|
|
|
|
|
data.andWhere('data.recordedAt BETWEEN :from AND :to', { |
|
|
|
|
|
|
|
from: opts.from ?? new Date(0), |
|
|
|
|
|
|
|
to: opts.to ?? new Date(), |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data.orderBy('data.recordedAt', 'DESC').take(take); |
|
|
|
|
|
|
|
const list = await data.getRawMany<SensorData>(); |
|
|
|
const list = await data.getRawMany<SensorData>(); |
|
|
|
|
|
|
|
|
|
|
|
return list.map((d) => ({ id: d.id, value: d.value, recordedAt: d.recordedAt })); |
|
|
|
return list.map((d) => ({ id: d.id, value: d.value, recordedAt: d.recordedAt })); |
|
|
|