src/Infrastructure/HumanResource/User/Repository/UserRepository.ts   A
last analyzed

Complexity

Total Complexity 8
Complexity/F 1.33

Size

Lines of Code 115
Function Count 6

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 8
eloc 96
mnd 2
bc 2
fnc 6
dl 0
loc 115
bpm 0.3333
cpm 1.3333
noi 0
c 0
b 0
f 0
rs 10

6 Functions

Rating   Name   Duplication   Size   Complexity  
A UserRepository.findUsersWithPayslipInfo 0 25 1
A UserRepository.findOneById 0 12 1
A UserRepository.findOneByApiToken 0 12 1
A UserRepository.findOneByEmail 0 14 1
A UserRepository.save 0 3 1
A UserRepository.findUsers 0 26 3
1
import { InjectRepository } from '@nestjs/typeorm';
2
import { Injectable } from '@nestjs/common';
3
import { Repository } from 'typeorm';
4
import { IUserRepository } from 'src/Domain/HumanResource/User/Repository/IUserRepository';
5
import { User, UserRole } from 'src/Domain/HumanResource/User/User.entity';
6
7
@Injectable()
8
export class UserRepository implements IUserRepository {
9
  constructor(
10
    @InjectRepository(User)
11
    private readonly repository: Repository<User>
12
  ) {}
13
14
  public findOneByApiToken(apiToken: string): Promise<User | undefined> {
15
    return this.repository
16
      .createQueryBuilder('user')
17
      .select([
18
        'user.id',
19
        'user.firstName',
20
        'user.lastName',
21
        'user.email',
22
        'user.role'
23
      ])
24
      .where('user.apiToken = :apiToken', { apiToken })
25
      .getOne();
26
  }
27
28
  public findOneByEmail(email: string): Promise<User | undefined> {
29
    return this.repository
30
      .createQueryBuilder('user')
31
      .select([
32
        'user.id',
33
        'user.firstName',
34
        'user.lastName',
35
        'user.email',
36
        'user.apiToken',
37
        'user.password',
38
        'user.role'
39
      ])
40
      .where('user.email = :email', { email })
41
      .getOne();
42
  }
43
44
  public findOneById(id: string): Promise<User | undefined> {
45
    return this.repository
46
      .createQueryBuilder('user')
47
      .select([
48
        'user.id',
49
        'user.firstName',
50
        'user.lastName',
51
        'user.email',
52
        'user.role'
53
      ])
54
      .where('user.id = :id', { id })
55
      .getOne();
56
  }
57
58
  public findUsers(
59
    withAccountant: boolean,
60
    noLeavingDate: boolean = false
61
  ): Promise<User[]> {
62
    const query = this.repository
63
      .createQueryBuilder('user')
64
      .select([
65
        'user.id',
66
        'user.firstName',
67
        'user.lastName',
68
        'user.email',
69
        'user.role'
70
      ])
71
      .orderBy('user.lastName', 'ASC')
72
      .addOrderBy('user.firstName', 'ASC');
73
74
    if (false === withAccountant) {
75
      query.andWhere('user.role <> :role', { role: UserRole.ACCOUNTANT });
76
    }
77
    if (noLeavingDate) {
78
      query.innerJoin('user.userAdministrative', 'userAdministrative');
79
      query.andWhere('userAdministrative.leavingDate IS NULL');
80
    }
81
82
    return query.getMany();
83
  }
84
85
  public findUsersWithPayslipInfo(): Promise<User[]> {
86
    const query = this.repository
87
      .createQueryBuilder('user')
88
      .select([
89
        'user.id',
90
        'user.firstName',
91
        'user.lastName',
92
        'userAdministrative.joiningDate',
93
        'userAdministrative.leavingDate',
94
        'userAdministrative.annualEarnings',
95
        'userAdministrative.transportFee',
96
        'userAdministrative.healthInsurance',
97
        'userAdministrative.executivePosition',
98
        'userAdministrative.contract',
99
        'userAdministrative.workingTime',
100
        'userAdministrative.sustainableMobilityFee'
101
      ]);
102
    query.innerJoin('user.userAdministrative', 'userAdministrative');
103
    query.andWhere('user.role <> :role', { role: UserRole.ACCOUNTANT });
104
    query.andWhere('userAdministrative.leavingDate IS NULL');
105
    query.orderBy('user.lastName', 'ASC');
106
    query.addOrderBy('user.firstName', 'ASC');
107
108
    return query.getMany();
109
  }
110
111
  public save(user: User): Promise<User> {
112
    return this.repository.save(user);
113
  }
114
}
115