Skip to content

Commit aae079e

Browse files
committed
feat: adding query-raw with join to get relatory daily/monthly for collaborators and projects
1 parent 0480f30 commit aae079e

11 files changed

+489
-3
lines changed

backend/src/modules/time-trackers/__tests__/time-trackers.controller.spec.ts

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { TimeTrackersStub } from '../stubs/time-trackers.stub';
55
import { mockTimeTrackersService } from '../mocks/time-trackers-service.mock';
66
import { UpdateTimeTrackerDto } from '../dtos/update-time-tracker.dto';
77
import { CreateTimeTrackerDto } from '../dtos/create-time-tracker.dto';
8+
import { GetDateTimeTrackersDto } from '../dtos/get-date-time-trackers.dto';
89

910
describe('TimeTrackersController', () => {
1011
let controller: TimeTrackersController;
@@ -67,6 +68,100 @@ describe('TimeTrackersController', () => {
6768
expect(timeTrackersService.findOne).toHaveBeenCalledWith(timeTracker.id);
6869
});
6970

71+
it('should get time trackers from day correctly', async () => {
72+
const mockResult = { day: '2024-01-01', hours_in_day: 8 };
73+
const dto = { date: '2024-01-01' } as GetDateTimeTrackersDto;
74+
timeTrackersService.getTimeTrackersFromDay.mockResolvedValue(mockResult);
75+
const result = await controller.getTimeTrackersFromDay(dto);
76+
77+
expect(result).toEqual(mockResult);
78+
expect(timeTrackersService.getTimeTrackersFromDay).toHaveBeenCalledWith(
79+
dto.date,
80+
);
81+
});
82+
83+
it('should get time trackers from month correctly', async () => {
84+
const mockResult = { month: '2024-01', hours_in_month: 160 };
85+
const dto = { date: '2024-01-01' } as GetDateTimeTrackersDto;
86+
timeTrackersService.getTimeTrackersFromMonth.mockResolvedValue(mockResult);
87+
const result = await controller.getTimeTrackersFromMonth(dto);
88+
89+
expect(result).toEqual(mockResult);
90+
expect(timeTrackersService.getTimeTrackersFromMonth).toHaveBeenCalledWith(
91+
dto.date,
92+
);
93+
});
94+
95+
it('should get time trackers from day where collaborator id correctly', async () => {
96+
const mockResult = { day: '2024-01-01', hours_in_day: 8 };
97+
const dto = {
98+
id: 'collaborator-id',
99+
date: '2024-01-01',
100+
} as GetDateTimeTrackersDto;
101+
timeTrackersService.getTimeTrackersFromDayWhereCollaboratorId.mockResolvedValue(
102+
mockResult,
103+
);
104+
const result =
105+
await controller.getTimeTrackersFromDayWhereCollaboratorId(dto);
106+
107+
expect(result).toEqual(mockResult);
108+
expect(
109+
timeTrackersService.getTimeTrackersFromDayWhereCollaboratorId,
110+
).toHaveBeenCalledWith(dto.id, dto.date);
111+
});
112+
113+
it('should get time trackers from month where collaborator id correctly', async () => {
114+
const mockResult = { month: '2024-01', hours_in_month: 160 };
115+
const dto = {
116+
id: 'collaborator-id',
117+
date: '2024-01-01',
118+
} as GetDateTimeTrackersDto;
119+
timeTrackersService.getTimeTrackersFromMonthWhereCollaboratorId.mockResolvedValue(
120+
mockResult,
121+
);
122+
const result =
123+
await controller.getTimeTrackersFromMonthWhereCollaboratorId(dto);
124+
125+
expect(result).toEqual(mockResult);
126+
expect(
127+
timeTrackersService.getTimeTrackersFromMonthWhereCollaboratorId,
128+
).toHaveBeenCalledWith(dto.id, dto.date);
129+
});
130+
131+
it('should get time trackers from day where project id correctly', async () => {
132+
const mockResult = { day: '2024-01-01', hours_in_day: 8 };
133+
const dto = {
134+
id: 'project-id',
135+
date: '2024-01-01',
136+
} as GetDateTimeTrackersDto;
137+
timeTrackersService.getTimeTrackersFromDayWhereProjectId.mockResolvedValue(
138+
mockResult,
139+
);
140+
const result = await controller.getTimeTrackersFromDayWhereProjectId(dto);
141+
142+
expect(result).toEqual(mockResult);
143+
expect(
144+
timeTrackersService.getTimeTrackersFromDayWhereProjectId,
145+
).toHaveBeenCalledWith(dto.id, dto.date);
146+
});
147+
148+
it('should get time trackers from month where project id correctly', async () => {
149+
const mockResult = { month: '2024-01', hours_in_month: 160 };
150+
const dto = {
151+
id: 'project-id',
152+
date: '2024-01-01',
153+
} as GetDateTimeTrackersDto;
154+
timeTrackersService.getTimeTrackersFromMonthWhereProjectId.mockResolvedValue(
155+
mockResult,
156+
);
157+
const result = await controller.getTimeTrackersFromMonthWhereProjectId(dto);
158+
159+
expect(result).toEqual(mockResult);
160+
expect(
161+
timeTrackersService.getTimeTrackersFromMonthWhereProjectId,
162+
).toHaveBeenCalledWith(dto.id, dto.date);
163+
});
164+
70165
it('should update timetracker correctly', async () => {
71166
const timeTracker = new TimeTrackersStub();
72167
const now = new Date();

backend/src/modules/time-trackers/__tests__/time-trackers.repository.spec.ts

Lines changed: 89 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,93 @@ describe('TimeTrackersRepository', () => {
7575
});
7676
});
7777

78+
it('should verify time conflict correctly', async () => {
79+
const timetracker = new TimeTrackersStub();
80+
const endDate = new Date('2024-01-02');
81+
const startDate = new Date('2024-01-01');
82+
prismaService.$queryRaw.mockResolvedValue([timetracker]);
83+
const result = await repository.verifyTimeConflict(endDate, startDate);
84+
85+
expect(result).toEqual([timetracker]);
86+
expect(prismaService.$queryRaw).toHaveBeenCalledTimes(1);
87+
});
88+
89+
it('should get time trackers from day correctly', async () => {
90+
const mockResult = [{ day: '2024-01-01', hours_in_day: 8 }];
91+
const day = '2024-01-01';
92+
prismaService.$queryRaw.mockResolvedValue(mockResult);
93+
const result = await repository.getTimeTrackersFromDay(day);
94+
95+
expect(result).toEqual(mockResult);
96+
expect(prismaService.$queryRaw).toHaveBeenCalledTimes(1);
97+
});
98+
99+
it('should get time trackers from month correctly', async () => {
100+
const mockResult = [{ month: '2024-01', hours_in_month: 160 }];
101+
const month = '2024-01-01';
102+
prismaService.$queryRaw.mockResolvedValue(mockResult);
103+
const result = await repository.getTimeTrackersFromMonth(month);
104+
105+
expect(result).toEqual(mockResult);
106+
expect(prismaService.$queryRaw).toHaveBeenCalledTimes(1);
107+
});
108+
109+
it('should get time trackers from day where collaborator id correctly', async () => {
110+
const mockResult = [{ day: '2024-01-01', hours_in_day: 8 }];
111+
const day = '2024-01-01';
112+
const collaboratorId = 'collaborator-id';
113+
prismaService.$queryRaw.mockResolvedValue(mockResult);
114+
const result = await repository.getTimeTrackersFromDayWhereCollaboratorId(
115+
day,
116+
collaboratorId,
117+
);
118+
119+
expect(result).toEqual(mockResult);
120+
expect(prismaService.$queryRaw).toHaveBeenCalledTimes(1);
121+
});
122+
123+
it('should get time trackers from month where collaborator id correctly', async () => {
124+
const mockResult = [{ month: '2024-01', hours_in_month: 160 }];
125+
const month = '2024-01-01';
126+
const collaboratorId = 'collaborator-id';
127+
prismaService.$queryRaw.mockResolvedValue(mockResult);
128+
const result = await repository.getTimeTrackersFromMonthWhereCollaboratorId(
129+
month,
130+
collaboratorId,
131+
);
132+
133+
expect(result).toEqual(mockResult);
134+
expect(prismaService.$queryRaw).toHaveBeenCalledTimes(1);
135+
});
136+
137+
it('should get time trackers from day where project id correctly', async () => {
138+
const mockResult = [{ day: '2024-01-01', hours_in_day: 8 }];
139+
const day = '2024-01-01';
140+
const projectId = 'project-id';
141+
prismaService.$queryRaw.mockResolvedValue(mockResult);
142+
const result = await repository.getTimeTrackersFromDayWhereProjectId(
143+
day,
144+
projectId,
145+
);
146+
147+
expect(result).toEqual(mockResult);
148+
expect(prismaService.$queryRaw).toHaveBeenCalledTimes(1);
149+
});
150+
151+
it('should get time trackers from month where project id correctly', async () => {
152+
const mockResult = [{ month: '2024-01', hours_in_month: 160 }];
153+
const month = '2024-01-01';
154+
const projectId = 'project-id';
155+
prismaService.$queryRaw.mockResolvedValue(mockResult);
156+
const result = await repository.getTimeTrackersFromMonthWhereProjectId(
157+
month,
158+
projectId,
159+
);
160+
161+
expect(result).toEqual(mockResult);
162+
expect(prismaService.$queryRaw).toHaveBeenCalledTimes(1);
163+
});
164+
78165
it('should update timetracker correctly', async () => {
79166
const timetracker = new TimeTrackersStub();
80167
const now = new Date();
@@ -125,15 +212,15 @@ describe('TimeTrackersRepository', () => {
125212
deleted_at: now,
126213
});
127214
const result = await repository.update(timetracker.id, {
128-
deleted_at: null,
215+
deleted_at: now,
129216
} as UpdateTimeTrackerDto);
130217

131218
expect(result).toEqual({ ...timetracker, deleted_at: now });
132219
expect(prismaService.timeTrackers.update).toHaveBeenCalledWith({
133220
where: { id: timetracker.id },
134221
include: { collaborators: true, tasks: true },
135222
data: {
136-
deleted_at: null,
223+
deleted_at: now,
137224
},
138225
});
139226
});

backend/src/modules/time-trackers/__tests__/time-trackers.service.spec.ts

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,104 @@ describe('TimeTrackersService', () => {
118118
expect(timeTrackersRepository.findOne).toHaveBeenCalledWith(timetracker.id);
119119
});
120120

121+
it('should get time trackers from day correctly', async () => {
122+
const mockResult = { day: '2024-01-01', hours_in_day: 8 };
123+
const day = '2024-01-01';
124+
timeTrackersRepository.getTimeTrackersFromDay.mockResolvedValue(mockResult);
125+
const result = await service.getTimeTrackersFromDay(day);
126+
127+
expect(result).toEqual(mockResult);
128+
expect(timeTrackersRepository.getTimeTrackersFromDay).toHaveBeenCalledWith(
129+
day,
130+
);
131+
});
132+
133+
it('should get time trackers from month correctly', async () => {
134+
const mockResult = { month: '2024-01', hours_in_month: 160 };
135+
const month = '2024-01-01';
136+
timeTrackersRepository.getTimeTrackersFromMonth.mockResolvedValue(
137+
mockResult,
138+
);
139+
const result = await service.getTimeTrackersFromMonth(month);
140+
141+
expect(result).toEqual(mockResult);
142+
expect(
143+
timeTrackersRepository.getTimeTrackersFromMonth,
144+
).toHaveBeenCalledWith(month);
145+
});
146+
147+
it('should get time trackers from day where collaborator id correctly', async () => {
148+
const mockResult = { day: '2024-01-01', hours_in_day: 8 };
149+
const collaboratorId = 'collaborator-id';
150+
const day = '2024-01-01';
151+
timeTrackersRepository.getTimeTrackersFromDayWhereCollaboratorId.mockResolvedValue(
152+
mockResult,
153+
);
154+
const result = await service.getTimeTrackersFromDayWhereCollaboratorId(
155+
collaboratorId,
156+
day,
157+
);
158+
159+
expect(result).toEqual(mockResult);
160+
expect(
161+
timeTrackersRepository.getTimeTrackersFromDayWhereCollaboratorId,
162+
).toHaveBeenCalledWith(day, collaboratorId);
163+
});
164+
165+
it('should get time trackers from month where collaborator id correctly', async () => {
166+
const mockResult = { month: '2024-01', hours_in_month: 160 };
167+
const collaboratorId = 'collaborator-id';
168+
const month = '2024-01-01';
169+
timeTrackersRepository.getTimeTrackersFromMonthWhereCollaboratorId.mockResolvedValue(
170+
mockResult,
171+
);
172+
const result = await service.getTimeTrackersFromMonthWhereCollaboratorId(
173+
collaboratorId,
174+
month,
175+
);
176+
177+
expect(result).toEqual(mockResult);
178+
expect(
179+
timeTrackersRepository.getTimeTrackersFromMonthWhereCollaboratorId,
180+
).toHaveBeenCalledWith(month, collaboratorId);
181+
});
182+
183+
it('should get time trackers from day where project id correctly', async () => {
184+
const mockResult = { day: '2024-01-01', hours_in_day: 8 };
185+
const projectId = 'project-id';
186+
const day = '2024-01-01';
187+
timeTrackersRepository.getTimeTrackersFromDayWhereProjectId.mockResolvedValue(
188+
mockResult,
189+
);
190+
const result = await service.getTimeTrackersFromDayWhereProjectId(
191+
projectId,
192+
day,
193+
);
194+
195+
expect(result).toEqual(mockResult);
196+
expect(
197+
timeTrackersRepository.getTimeTrackersFromDayWhereProjectId,
198+
).toHaveBeenCalledWith(day, projectId);
199+
});
200+
201+
it('should get time trackers from month where project id correctly', async () => {
202+
const mockResult = { month: '2024-01', hours_in_month: 160 };
203+
const projectId = 'project-id';
204+
const month = '2024-01-01';
205+
timeTrackersRepository.getTimeTrackersFromMonthWhereProjectId.mockResolvedValue(
206+
mockResult,
207+
);
208+
const result = await service.getTimeTrackersFromMonthWhereProjectId(
209+
projectId,
210+
month,
211+
);
212+
213+
expect(result).toEqual(mockResult);
214+
expect(
215+
timeTrackersRepository.getTimeTrackersFromMonthWhereProjectId,
216+
).toHaveBeenCalledWith(month, projectId);
217+
});
218+
121219
it('should update timetracker correctly', async () => {
122220
const timetracker = new TimeTrackersStub();
123221
const now = new Date();

backend/src/modules/time-trackers/dtos/get-date-time-trackers.dto.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
import { IsDateString, IsNotEmpty } from 'class-validator';
1+
import { IsDateString, IsNotEmpty, IsString } from 'class-validator';
22

33
export class GetDateTimeTrackersDto {
4+
@IsString()
5+
@IsNotEmpty()
6+
id: string;
7+
48
@IsDateString()
59
@IsNotEmpty()
610
date: string;

backend/src/modules/time-trackers/mocks/time-trackers-repository.mock.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,10 @@ export const mockTimeTrackersRepository = () => ({
44
findOne: jest.fn(),
55
update: jest.fn(),
66
verifyTimeConflict: jest.fn(),
7+
getTimeTrackersFromDay: jest.fn(),
8+
getTimeTrackersFromMonth: jest.fn(),
9+
getTimeTrackersFromDayWhereCollaboratorId: jest.fn(),
10+
getTimeTrackersFromMonthWhereCollaboratorId: jest.fn(),
11+
getTimeTrackersFromDayWhereProjectId: jest.fn(),
12+
getTimeTrackersFromMonthWhereProjectId: jest.fn(),
713
});

backend/src/modules/time-trackers/mocks/time-trackers-service.mock.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,10 @@ export const mockTimeTrackersService = () => ({
55
update: jest.fn(),
66
active: jest.fn(),
77
softRemove: jest.fn(),
8+
getTimeTrackersFromDay: jest.fn(),
9+
getTimeTrackersFromMonth: jest.fn(),
10+
getTimeTrackersFromDayWhereCollaboratorId: jest.fn(),
11+
getTimeTrackersFromMonthWhereCollaboratorId: jest.fn(),
12+
getTimeTrackersFromDayWhereProjectId: jest.fn(),
13+
getTimeTrackersFromMonthWhereProjectId: jest.fn(),
814
});

backend/src/modules/time-trackers/repositories/abstract-time-trackers.repository.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,23 @@ export abstract class TimeTrackersRepository {
1717
startDate: Date,
1818
): Promise<ResponseTimeTrackerDto[]>;
1919
abstract getTimeTrackersFromDay(day: string): Promise<Record<string, any>>;
20+
abstract getTimeTrackersFromDayWhereCollaboratorId(
21+
day: string,
22+
collaboratorId: string,
23+
): Promise<Record<string, any>>;
2024
abstract getTimeTrackersFromMonth(
2125
month: string,
2226
): Promise<Record<string, any>>;
27+
abstract getTimeTrackersFromMonthWhereCollaboratorId(
28+
month: string,
29+
collaboratorId: string,
30+
): Promise<Record<string, any>>;
31+
abstract getTimeTrackersFromMonthWhereProjectId(
32+
month: string,
33+
projectId: string,
34+
): Promise<Record<string, any>>;
35+
abstract getTimeTrackersFromDayWhereProjectId(
36+
month: string,
37+
projectId: string,
38+
): Promise<Record<string, any>>;
2339
}

0 commit comments

Comments
 (0)