Passed
Pull Request — master (#152)
by Mathieu
01:58
created

UserRepository.findUsersPresences   A

Complexity

Conditions 1

Size

Total Lines 38
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 36
dl 0
loc 38
rs 9.016
c 0
b 0
f 0
cc 1
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
import { Leave } from 'src/Domain/HumanResource/Leave/Leave.entity';
7
import { Event } from 'src/Domain/FairCalendar/Event.entity';
8
9
@Injectable()
10
export class UserRepository implements IUserRepository {
11
  constructor(
12
    @InjectRepository(User)
13
    private readonly repository: Repository<User>
14
  ) {}
15
16
  public findOneByApiToken(apiToken: string): Promise<User | undefined> {
17
    return this.repository
18
      .createQueryBuilder('user')
19
      .select([
20
        'user.id',
21
        'user.firstName',
22
        'user.lastName',
23
        'user.email',
24
        'user.role'
25
      ])
26
      .where('user.apiToken = :apiToken', {apiToken})
27
      .getOne();
28
  }
29
30
  public findOneByEmail(email: string): Promise<User | undefined> {
31
    return this.repository
32
      .createQueryBuilder('user')
33
      .select([
34
        'user.id',
35
        'user.firstName',
36
        'user.lastName',
37
        'user.email',
38
        'user.apiToken',
39
        'user.password',
40
        'user.role'
41
      ])
42
      .where('user.email = :email', {email})
43
      .getOne();
44
  }
45
46
  public findOneById(id: string): Promise<User | undefined> {
47
    return this.repository
48
      .createQueryBuilder('user')
49
      .select([
50
        'user.id',
51
        'user.firstName',
52
        'user.lastName',
53
        'user.email',
54
        'user.role'
55
      ])
56
      .where('user.id = :id', {id})
57
      .getOne();
58
  }
59
60
  public findUsers(withAccountant: boolean): Promise<User[]> {
61
    const query = this.repository
62
      .createQueryBuilder('user')
63
      .select([
64
        'user.id',
65
        'user.firstName',
66
        'user.lastName',
67
        'user.email',
68
        'user.role'
69
      ])
70
      .orderBy('user.lastName', 'ASC')
71
      .addOrderBy('user.firstName', 'ASC');
72
73
    if (false === withAccountant) {
74
      query.where('user.role <> :role', {role: UserRole.ACCOUNTANT});
75
    }
76
77
    return query.getMany();
78
  }
79
80
  public findUsersPresences(date: Date): Promise<any[]> {
81
    const day = date.getDate();
82
    const month = date.getMonth() + 1;
83
    const year = date.getFullYear();
84
85
    return this.repository
86
      .createQueryBuilder('user')
87
      .select([
88
        'user.id',
89
        'user.firstName',
90
        'user.lastName',
91
      ])
92
      .where('user.role <> :role', {role: UserRole.ACCOUNTANT})
93
      .addSelect(leaveQuery => {
94
        return leaveQuery
95
          .select('leave.id')
96
          .from(Leave, 'leave')
97
          .innerJoin('leave.leaveRequest', 'leaveRequest')
98
          .innerJoin('leaveRequest.user', 'leaveUser')
99
          .where('leaveUser.id = user.id')
100
          .andWhere('extract(day FROM leave.date) = :day', { day })
101
          .andWhere('extract(month FROM leave.date) = :month', { month })
102
          .andWhere('extract(year FROM leave.date) = :year', { year })
103
      }, 'leave')
104
      .addSelect(eventQuery => {
105
        return eventQuery
106
          .select('STRING_AGG(event.date, \',\')')
107
          .from(Event, 'event')
108
          .innerJoin('event.user', 'eventUser')
109
          .where('eventUser.id = user.id')
110
          // .leftJoin('event.project', 'project')
111
          .andWhere('extract(day FROM event.date) = :day', { day })
112
          .andWhere('extract(month FROM event.date) = :month', { month })
113
          .andWhere('extract(year FROM event.date) = :year', { year })
114
      }, 'events')
115
      .orderBy('user.lastName', 'ASC')
116
      .addOrderBy('user.firstName', 'ASC')
117
      .getRawMany();
118
  }
119
120
  public save(user: User): Promise<User> {
121
    return this.repository.save(user);
122
  }
123
}
124