Add AQI space daily pollutant stats module and related entities, DTOs, and repositories

This commit is contained in:
faris Aljohari
2025-06-03 23:37:52 -06:00
parent 12a9272b8b
commit ef2245eae1
8 changed files with 205 additions and 0 deletions

View File

@ -55,6 +55,7 @@ import {
PresenceSensorDailyDeviceEntity,
PresenceSensorDailySpaceEntity,
} from '../modules/presence-sensor/entities';
import { AqiSpaceDailyPollutantStatsEntity } from '../modules/aqi/entities';
@Module({
imports: [
TypeOrmModule.forRootAsync({
@ -115,6 +116,7 @@ import {
PowerClampMonthlyEntity,
PresenceSensorDailyDeviceEntity,
PresenceSensorDailySpaceEntity,
AqiSpaceDailyPollutantStatsEntity,
],
namingStrategy: new SnakeNamingStrategy(),
synchronize: Boolean(JSON.parse(configService.get('DB_SYNC'))),

View File

@ -0,0 +1,11 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AqiSpaceDailyPollutantStatsEntity } from './entities/aqi.entity';
@Module({
providers: [],
exports: [],
controllers: [],
imports: [TypeOrmModule.forFeature([AqiSpaceDailyPollutantStatsEntity])],
})
export class AqiRepositoryModule {}

View File

@ -0,0 +1,82 @@
import { IsNotEmpty, IsNumber, IsString } from 'class-validator';
export class AqiSpaceDailyPollutantStatsDto {
@IsString()
@IsNotEmpty()
public uuid: string;
@IsNotEmpty()
@IsString()
spaceUuid: string;
@IsNotEmpty()
@IsString()
eventDay: string;
@IsNotEmpty()
@IsNumber()
eventHour: number;
@IsNumber()
pm1Min: number;
@IsNumber()
pm1Avg: number;
@IsNumber()
pm1Max: number;
@IsNumber()
pm10Min: number;
@IsNumber()
pm10Avg: number;
@IsNumber()
pm10Max: number;
@IsNumber()
pm25Min: number;
@IsNumber()
pm25Avg: number;
@IsNumber()
pm25Max: number;
@IsNumber()
ch2oMin: number;
@IsNumber()
ch2oAvg: number;
@IsNumber()
ch2oMax: number;
@IsNumber()
vocMin: number;
@IsNumber()
vocAvg: number;
@IsNumber()
vocMax: number;
@IsNumber()
co2Min: number;
@IsNumber()
co2Avg: number;
@IsNumber()
co2Max: number;
@IsNumber()
aqiMin: number;
@IsNumber()
aqiAvg: number;
@IsNumber()
aqiMax: number;
}

View File

@ -0,0 +1 @@
export * from './aqi.dto';

View File

@ -0,0 +1,88 @@
import { Column, Entity, ManyToOne, Unique } from 'typeorm';
import { AbstractEntity } from '../../abstract/entities/abstract.entity';
import { SpaceEntity } from '../../space/entities/space.entity';
import { AqiSpaceDailyPollutantStatsDto } from '../dtos';
@Entity({ name: 'space-daily-pollutant-stats' })
@Unique(['spaceUuid', 'eventDay', 'eventHour'])
export class AqiSpaceDailyPollutantStatsEntity extends AbstractEntity<AqiSpaceDailyPollutantStatsDto> {
@Column({ nullable: false })
public spaceUuid: string;
@ManyToOne(() => SpaceEntity, (space) => space.presenceSensorDaily)
space: SpaceEntity;
@Column({ nullable: false })
public eventDay: string;
@Column({ nullable: false })
public eventHour: number;
@Column('float', { nullable: true })
public pm1Min: number;
@Column('float', { nullable: true })
public pm1Avg: number;
@Column('float', { nullable: true })
public pm1Max: number;
@Column('float', { nullable: true })
public pm10Min: number;
@Column('float', { nullable: true })
public pm10Avg: number;
@Column('float', { nullable: true })
public pm10Max: number;
@Column('float', { nullable: true })
public pm25Min: number;
@Column('float', { nullable: true })
public pm25Avg: number;
@Column('float', { nullable: true })
public pm25Max: number;
@Column('float', { nullable: true })
public ch2oMin: number;
@Column('float', { nullable: true })
public ch2oAvg: number;
@Column('float', { nullable: true })
public ch2oMax: number;
@Column('float', { nullable: true })
public vocMin: number;
@Column('float', { nullable: true })
public vocAvg: number;
@Column('float', { nullable: true })
public vocMax: number;
@Column('float', { nullable: true })
public co2Min: number;
@Column('float', { nullable: true })
public co2Avg: number;
@Column('float', { nullable: true })
public co2Max: number;
@Column('float', { nullable: true })
public aqiMin: number;
@Column('float', { nullable: true })
public aqiAvg: number;
@Column('float', { nullable: true })
public aqiMax: number;
constructor(partial: Partial<AqiSpaceDailyPollutantStatsEntity>) {
super();
Object.assign(this, partial);
}
}

View File

@ -0,0 +1 @@
export * from './aqi.entity';

View File

@ -0,0 +1 @@
export * from './presence-sensor.repository';

View File

@ -0,0 +1,19 @@
import { DataSource, Repository } from 'typeorm';
import { Injectable } from '@nestjs/common';
import {
PresenceSensorDailyDeviceEntity,
PresenceSensorDailySpaceEntity,
} from '../entities';
@Injectable()
export class PresenceSensorDailyDeviceRepository extends Repository<PresenceSensorDailyDeviceEntity> {
constructor(private dataSource: DataSource) {
super(PresenceSensorDailyDeviceEntity, dataSource.createEntityManager());
}
}
@Injectable()
export class PresenceSensorDailySpaceRepository extends Repository<PresenceSensorDailySpaceEntity> {
constructor(private dataSource: DataSource) {
super(PresenceSensorDailySpaceEntity, dataSource.createEntityManager());
}
}