Passed
Pull Request — master (#258)
by Mathieu
02:18
created

GetUsersSavingsRecordsBalanceQueryHandler.execute   B

Complexity

Conditions 5

Size

Total Lines 45
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 38
dl 0
loc 45
rs 8.5013
c 0
b 0
f 0
cc 5
1
import { QueryHandler } from '@nestjs/cqrs';
2
import { Inject } from '@nestjs/common';
3
import { GetUsersSavingsRecordsBalanceQuery } from './GetUsersSavingsRecordsBalanceQuery';
4
import { IUserSavingsRecordRepository } from 'src/Domain/HumanResource/Savings/Repository/IUserSavingsRecordRepository';
5
import { UserSavingsRecordsBalanceView } from '../View/UserSavingsRecordsBalanceView';
6
import { SavingsRecordType } from 'src/Domain/HumanResource/Savings/UserSavingsRecord.entity';
7
8
type UserBalance = {
9
  firstName: string;
10
  lastName: string;
11
  balance: number;
12
}
13
14
@QueryHandler(GetUsersSavingsRecordsBalanceQuery)
15
export class GetUsersSavingsRecordsBalanceQueryHandler {
16
  constructor(
17
    @Inject('IUserSavingsRecordRepository')
18
    private readonly userSavingsRecordRepository: IUserSavingsRecordRepository
19
  ) {}
20
21
  public async execute(
22
    query: GetUsersSavingsRecordsBalanceQuery
23
  ): Promise<UserSavingsRecordsBalanceView[]> {
24
    const userSavingsRecords = await this.userSavingsRecordRepository.findUsersSavingsRecords();
25
    const userSavingsRecordsBalances: UserSavingsRecordsBalanceView[] = [];
26
27
    let usersBalances = {};
28
29
    for (const savingsRecord of userSavingsRecords) {
30
      const user = savingsRecord.getUser();
31
      const previousBalance = usersBalances[user.getId()]?.balance || 0;
32
33
      let balance = 0;
34
35
      if (savingsRecord.getType() === SavingsRecordType.INPUT) {
36
        balance = previousBalance + savingsRecord.getAmountWithInterestRate();
37
      } else {
38
        balance = previousBalance - savingsRecord.getAmount();
39
      }
40
41
      usersBalances = {
42
        ...usersBalances,
43
        [user.getId()]: {
44
          firstName: user.getFirstName(),
45
          lastName: user.getLastName(),
46
          balance,
47
        }
48
      };
49
    }
50
51
    for (const [userId, value] of Object.entries(usersBalances)) {
52
      const {firstName, lastName, balance} = value as UserBalance;
53
54
      userSavingsRecordsBalances.push(
55
        new UserSavingsRecordsBalanceView(
56
          userId,
57
          firstName,
58
          lastName,
59
          balance / 100,
60
        )
61
      );
62
    };
63
64
    return userSavingsRecordsBalances;
65
  }
66
}
67