* refactor: lucky user to service class with DI * fix: unit test filterHostsByLeadThreshold.test.ts * fixup! fix: unit test filterHostsByLeadThreshold.test.ts * fix: get lucky user test missing mocks * fix: get lucky user hosts not within interval * chore: bump platform library * chore: bump platform library * chore: add DAILY_API_KEY to turborepo.json db seed * chore: add DAILY_API_KEY to cache-db action * fixup! chore: add DAILY_API_KEY to cache-db action * chore: remove log in fixture * chore: bump platform library * chore: refactor test team-emails.e2e * only failing test * run all api v2 tests * chore: bump platform library * revert change to turbo.json and action in cache-db * chore: use inPerson location in team-emails.e2e
179 lines
3.7 KiB
TypeScript
179 lines
3.7 KiB
TypeScript
import type { PrismaClient } from "@calcom/prisma";
|
|
|
|
export class PrismaOOORepository {
|
|
constructor(private prismaClient: PrismaClient) {}
|
|
|
|
async findManyOOO({
|
|
startTimeDate,
|
|
endTimeDate,
|
|
allUserIds,
|
|
}: {
|
|
startTimeDate: Date;
|
|
endTimeDate: Date;
|
|
allUserIds: number[];
|
|
}) {
|
|
return this.prismaClient.outOfOfficeEntry.findMany({
|
|
where: {
|
|
userId: {
|
|
in: allUserIds,
|
|
},
|
|
OR: [
|
|
// outside of range
|
|
// (start <= 'dateTo' AND end >= 'dateFrom')
|
|
{
|
|
start: {
|
|
lte: endTimeDate,
|
|
},
|
|
end: {
|
|
gte: startTimeDate,
|
|
},
|
|
},
|
|
// start is between dateFrom and dateTo but end is outside of range
|
|
// (start <= 'dateTo' AND end >= 'dateTo')
|
|
{
|
|
start: {
|
|
lte: endTimeDate,
|
|
},
|
|
|
|
end: {
|
|
gte: endTimeDate,
|
|
},
|
|
},
|
|
// end is between dateFrom and dateTo but start is outside of range
|
|
// (start <= 'dateFrom' OR end <= 'dateTo')
|
|
{
|
|
start: {
|
|
lte: startTimeDate,
|
|
},
|
|
|
|
end: {
|
|
lte: endTimeDate,
|
|
},
|
|
},
|
|
],
|
|
},
|
|
select: {
|
|
id: true,
|
|
start: true,
|
|
end: true,
|
|
user: {
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
},
|
|
},
|
|
toUser: {
|
|
select: {
|
|
id: true,
|
|
username: true,
|
|
name: true,
|
|
},
|
|
},
|
|
reason: {
|
|
select: {
|
|
id: true,
|
|
emoji: true,
|
|
reason: true,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
async findUserOOODays({ userId, dateTo, dateFrom }: { userId: number; dateTo: string; dateFrom: string }) {
|
|
return this.prismaClient.outOfOfficeEntry.findMany({
|
|
where: {
|
|
userId,
|
|
OR: [
|
|
// outside of range
|
|
// (start <= 'dateTo' AND end >= 'dateFrom')
|
|
{
|
|
start: {
|
|
lte: dateTo,
|
|
},
|
|
end: {
|
|
gte: dateFrom,
|
|
},
|
|
},
|
|
// start is between dateFrom and dateTo but end is outside of range
|
|
// (start <= 'dateTo' AND end >= 'dateTo')
|
|
{
|
|
start: {
|
|
lte: dateTo,
|
|
},
|
|
|
|
end: {
|
|
gte: dateTo,
|
|
},
|
|
},
|
|
// end is between dateFrom and dateTo but start is outside of range
|
|
// (start <= 'dateFrom' OR end <= 'dateTo')
|
|
{
|
|
start: {
|
|
lte: dateFrom,
|
|
},
|
|
|
|
end: {
|
|
lte: dateTo,
|
|
},
|
|
},
|
|
],
|
|
},
|
|
select: {
|
|
id: true,
|
|
start: true,
|
|
end: true,
|
|
user: {
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
},
|
|
},
|
|
toUser: {
|
|
select: {
|
|
id: true,
|
|
username: true,
|
|
name: true,
|
|
},
|
|
},
|
|
reason: {
|
|
select: {
|
|
id: true,
|
|
emoji: true,
|
|
reason: true,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
async findOOOEntriesInInterval({
|
|
userIds,
|
|
startDate,
|
|
endDate,
|
|
}: {
|
|
userIds: number[];
|
|
startDate: Date;
|
|
endDate: Date;
|
|
}) {
|
|
return this.prismaClient.outOfOfficeEntry.findMany({
|
|
where: {
|
|
userId: {
|
|
in: userIds,
|
|
},
|
|
start: {
|
|
lte: endDate,
|
|
},
|
|
end: {
|
|
gte: startDate,
|
|
},
|
|
},
|
|
select: {
|
|
start: true,
|
|
end: true,
|
|
userId: true,
|
|
},
|
|
});
|
|
}
|
|
}
|