Passed
Pull Request — master (#263)
by
unknown
03:09 queued 01:09
created

GetLeaveRequestsQueryHandler.canCancelLeave   A

Complexity

Conditions 3

Size

Total Lines 11
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 9
dl 0
loc 11
c 0
b 0
f 0
rs 9.95
cc 3
1
import { QueryHandler } from '@nestjs/cqrs';
2
import { GetLeaveRequestsQuery } from './GetLeaveRequestsQuery';
3
import { Inject } from '@nestjs/common';
4
import { IDateUtils } from 'src/Application/IDateUtils';
5
import { LeaveRequestView } from '../View/LeaveRequestView';
6
import { UserSummaryView } from '../../User/View/UserSummaryView';
7
import { Pagination } from 'src/Application/Common/Pagination';
8
import { ILeaveRequestRepository } from 'src/Domain/HumanResource/Leave/Repository/ILeaveRequestRepository';
9
import { IUserRepository } from 'src/Domain/HumanResource/User/Repository/IUserRepository';
10
import { UserNotFoundException } from 'src/Domain/HumanResource/User/Exception/UserNotFoundException';
11
import { User } from 'src/Domain/HumanResource/User/User.entity';
12
import { LeaveRequest } from 'src/Domain/HumanResource/Leave/LeaveRequest.entity';
13
14
@QueryHandler(GetLeaveRequestsQuery)
15
export class GetLeaveRequestsQueryHandler {
16
  constructor(
17
    @Inject('ILeaveRequestRepository')
18
    private readonly leaveRequestRepository: ILeaveRequestRepository,
19
    @Inject('IUserRepository')
20
    private readonly userRepository: IUserRepository,
21
    @Inject('IDateUtils')
22
    private readonly dateUtils: IDateUtils
23
  ) {}
24
25
  public async execute({
26
    currentUserId,
27
    page,
28
    status
29
  }: GetLeaveRequestsQuery): Promise<Pagination<LeaveRequestView>> {
30
    const leaveRequestViews: LeaveRequestView[] = [];
31
    const [
32
      leaveRequests,
33
      total
34
    ] = await this.leaveRequestRepository.findLeaveRequests(page, status);
35
36
    const currentUser = await this.userRepository.findOneById(currentUserId);
37
    if (!currentUser) {
38
      throw new UserNotFoundException();
39
    }
40
41
    for (const leaveRequest of leaveRequests) {
42
      const leaveUser = leaveRequest.getUser();
43
44
      leaveRequestViews.push(
45
        new LeaveRequestView(
46
          leaveRequest.getId(),
47
          leaveRequest.getType(),
48
          leaveRequest.getStatus(),
49
          leaveRequest.getStartDate(),
50
          leaveRequest.getEndDate(),
51
          this.dateUtils.getLeaveDuration(
52
            leaveRequest.getStartDate(),
53
            leaveRequest.isStartsAllDay(),
54
            leaveRequest.getEndDate(),
55
            leaveRequest.isEndsAllDay()
56
          ),
57
          this.canCancelLeave(currentUser, leaveRequest),
58
          null,
59
          new UserSummaryView(
60
            leaveUser.getId(),
61
            leaveUser.getFirstName(),
62
            leaveUser.getLastName()
63
          )
64
        )
65
      );
66
    }
67
68
    return new Pagination<LeaveRequestView>(leaveRequestViews, total);
69
  }
70
71
  private canCancelLeave(byUser: User, leaveRequest: LeaveRequest): boolean {
72
    if (byUser.getId() !== leaveRequest.getUser().getId()) {
73
      return false;
74
    }
75
76
    if (new Date(leaveRequest.getStartDate()) < this.dateUtils.getCurrentDate()) {
77
      return false;
78
    }
79
80
    return true;
81
  }
82
}
83