All files / domain/valueObjects TaskPriority.ts

53.84% Statements 14/26
33.33% Branches 2/6
73.33% Functions 11/15
52% Lines 13/25

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 794x 4x 4x 4x 4x         59x 59x       1x       49x       9x                               10x                                           2x               18x                    
export enum PriorityLevel {
  LOW = 1,
  MEDIUM = 2,
  HIGH = 3,
  CRITICAL = 4
}
 
export class TaskPriority {
  private constructor(
    private readonly level: PriorityLevel,
    private readonly autoEscalationDate?: Date
  ) {}
 
  static low(): TaskPriority {
    return new TaskPriority(PriorityLevel.LOW);
  }
 
  static medium(): TaskPriority {
    return new TaskPriority(PriorityLevel.MEDIUM);
  }
 
  static high(): TaskPriority {
    return new TaskPriority(PriorityLevel.HIGH);
  }
 
  static critical(): TaskPriority {
    return new TaskPriority(PriorityLevel.CRITICAL);
  }
 
  static fromLevel(level: PriorityLevel): TaskPriority {
    return new TaskPriority(level);
  }
 
  static reconstitute(level: PriorityLevel, autoEscalationDate?: Date): TaskPriority {
    return new TaskPriority(level, autoEscalationDate);
  }
 
  getLevel(): PriorityLevel {
    return this.level;
  }
 
  escalate(): TaskPriority {
    const newLevel = Math.min(this.level + 1, PriorityLevel.CRITICAL) as PriorityLevel;
    return new TaskPriority(newLevel, new Date());
  }
 
  shouldEscalate(daysOld: number): boolean {
    switch (this.level) {
      case PriorityLevel.LOW:
        return daysOld > 30;
      case PriorityLevel.MEDIUM:
        return daysOld > 14;
      case PriorityLevel.HIGH:
        return daysOld > 7;
      case PriorityLevel.CRITICAL:
        return false;
    }
  }
 
  isHigherThan(other: TaskPriority): boolean {
    return this.level > other.level;
  }
 
  equals(other: TaskPriority): boolean {
    return this.level === other.level;
  }
 
  toString(): string {
    return PriorityLevel[this.level];
  }
 
  toJSON() {
    return {
      level: this.level,
      autoEscalationDate: this.autoEscalationDate?.toISOString()
    };
  }
}