Skip to content
Snippets Groups Projects
consumptionDataValidatorService.ts 1.68 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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
      }
    }