Skip to content
Snippets Groups Projects
consumptionDataValidatorService.ts 1.68 KiB
Newer Older
Hugo NOUTS's avatar
Hugo NOUTS committed
import { ITimePeriod, TimeStep } from './dataConsumptionContracts'
import { FluidType } from 'enum/fluid.enum'
import { Interval } from 'luxon'

export default class ConsumptionDataValidator {
  public ValidateGetGraphData(
    timePeriod: ITimePeriod,
    timeStep: TimeStep,
    fluidTypes: FluidType[],
    compareTimePeriod?: ITimePeriod
  ): boolean {
    if (fluidTypes.length === 0) return false
    if (!this.ValidateTimePeriod(timePeriod)) return false

    for (const fluidType of fluidTypes) {
      if (
        timeStep === TimeStep.HALF_AN_HOUR &&
        fluidType !== FluidType.ELECTRICITY
      )
        return false
      if (timeStep === TimeStep.HOUR && fluidType !== FluidType.GAS)
        return false
    }

    if (!this.ValidateTimePeriodLength(timePeriod, timeStep)) return false

    if (compareTimePeriod) {
      if (!this.ValidateTimePeriod(compareTimePeriod)) return false
      if (!this.ValidateTimePeriodLength(compareTimePeriod, timeStep))
        return false
    }

    return true
  }

  private ValidateTimePeriodLength(
    timePeriod: ITimePeriod,
    timeStep: TimeStep
  ): boolean {
    const interval = Interval.fromDateTimes(
      timePeriod.startDate,
      timePeriod.endDate
    )
    if (timeStep == TimeStep.HALF_AN_HOUR && interval.length('hour') > 24)
      return false
    if (timeStep == TimeStep.DAY && interval.length('day') > 31) return false
    if (timeStep == TimeStep.MONTH && interval.length('month') > 12)
      return false
    if (timeStep == TimeStep.YEAR && interval.length('year') > 10) return false
    return true
  }

  private ValidateTimePeriod(timePeriod: ITimePeriod): boolean {
    return timePeriod.endDate >= timePeriod.startDate
  }
}