Skip to content

Commit d317c64

Browse files
committed
feat: adding conflict validation and verify if start_date is greater than end_date
1 parent 47f0404 commit d317c64

File tree

5 files changed

+47
-9
lines changed

5 files changed

+47
-9
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,17 @@ describe('TimeTrackersService', () => {
4040
it('should create timetrackers correctly', async () => {
4141
const timeTracker = new TimeTrackersStub();
4242
timeTrackersRepository.create.mockResolvedValue(timeTracker);
43+
timeTrackersRepository.verifyTimeConflict.mockResolvedValue([]);
4344
const result = await service.create(timeTracker as CreateTimeTrackerDto);
4445

4546
expect(result).toEqual(timeTracker);
4647
expect(timeTrackersRepository.create).toHaveBeenCalledWith(
4748
timeTracker as CreateTimeTrackerDto,
4849
);
50+
expect(timeTrackersRepository.verifyTimeConflict).toHaveBeenCalledWith(
51+
timeTracker.end_date,
52+
timeTracker.start_date,
53+
);
4954
});
5055

5156
it('should find all timetrackers correctly', async () => {

backend/src/modules/time-trackers/dtos/create-time-tracker.dto.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
import {
2-
IsDateString,
3-
IsNotEmpty,
4-
IsOptional,
5-
IsString,
6-
} from 'class-validator';
1+
import { Type } from 'class-transformer';
2+
import { IsDate, IsNotEmpty, IsOptional, IsString } from 'class-validator';
73

84
export class CreateTimeTrackerDto {
9-
@IsDateString()
5+
@IsDate()
106
@IsNotEmpty()
7+
@Type(() => Date)
118
start_date: Date;
129

13-
@IsDateString()
10+
@IsDate()
1411
@IsNotEmpty()
12+
@Type(() => Date)
1513
end_date: Date;
1614

1715
@IsString()

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ export const mockTimeTrackersRepository = () => ({
33
findAll: jest.fn(),
44
findOne: jest.fn(),
55
update: jest.fn(),
6+
verifyTimeConflict: jest.fn(),
67
});

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ export class PrismaTimeTrackersRepository implements TimeTrackersRepository {
3131
include: { collaborators: true, tasks: true },
3232
});
3333
}
34+
async verifyTimeConflict(
35+
newTimeTrackerEndDate: Date,
36+
newTimeTrackerStartDate: Date,
37+
): Promise<ResponseTimeTrackerDto[]> {
38+
return await this.prismaClient.$queryRaw`
39+
SELECT *
40+
FROM "TimeTrackers" t
41+
WHERE t."StartDate" < ${newTimeTrackerEndDate}
42+
AND t."EndDate" > ${newTimeTrackerStartDate}
43+
`;
44+
}
3445
async update(
3546
id: string,
3647
updateTimeTrackerDto: UpdateTimeTrackerDto,

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

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { PrismaTimeTrackersRepository } from './repositories/prisma-time-trackers.repository';
2-
import { Injectable } from '@nestjs/common';
2+
import {
3+
BadRequestException,
4+
ConflictException,
5+
Injectable,
6+
} from '@nestjs/common';
37
import { CreateTimeTrackerDto } from './dtos/create-time-tracker.dto';
48
import { UpdateTimeTrackerDto } from './dtos/update-time-tracker.dto';
59

@@ -9,6 +13,25 @@ export class TimeTrackersService {
913
private readonly timeTrackersRepository: PrismaTimeTrackersRepository,
1014
) {}
1115
async create(createTimeTrackerDto: CreateTimeTrackerDto) {
16+
const endDate = createTimeTrackerDto.end_date;
17+
const startDate = createTimeTrackerDto.start_date;
18+
19+
if (startDate > endDate) {
20+
throw new BadRequestException(
21+
'A data de início é maior que a data de fim',
22+
);
23+
}
24+
25+
const dateConflict = await this.timeTrackersRepository.verifyTimeConflict(
26+
endDate,
27+
startDate,
28+
);
29+
if (dateConflict.length > 0) {
30+
throw new ConflictException(
31+
'Já existe uma tarefa nesse intervalo de tempo',
32+
);
33+
}
34+
1235
return await this.timeTrackersRepository.create(createTimeTrackerDto);
1336
}
1437

0 commit comments

Comments
 (0)