diff --git a/.vscode/settings.json b/.vscode/settings.json index 2ef45f5..f655621 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { "dependi.npm.lockFileEnabled": false, - "typescript.tsdk": "node_modules\\typescript\\lib" + "typescript.tsdk": "node_modules\\typescript\\lib", + "compile-hero.disable-compile-files-on-did-save-code": true } \ No newline at end of file diff --git a/src/AppConfig/appconfig.service.ts b/src/AppConfig/appconfig.service.ts index 9921559..71b330a 100644 --- a/src/AppConfig/appconfig.service.ts +++ b/src/AppConfig/appconfig.service.ts @@ -1,7 +1,29 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, OnModuleInit } from '@nestjs/common'; + +// import { ConfigConstant } from 'src/common/constant/config.constant'; import { PrismaService } from 'src/Prisma/prisma.service'; @Injectable() -export class AppConfigService { +export class AppConfigService implements OnModuleInit { constructor(private readonly prisma: PrismaService) {} + + async onModuleInit() { + // get each config from database, if not exist, create default config + // const configs = await this.prisma.config.findMany(); + // if (configs.length === 0) { + // await this.prisma.config.createMany({ + // data: Object.values(ConfigConstant).map((config) => ({ + // ...config, + // })), + // }); + // } + // // regenerate missing config + // for (const config of Object.values(ConfigConstant)) { + // if (!configs.find((c) => c.key === config.key)) { + // await this.prisma.config.create({ + // data: config, + // }); + // } + // } + } } diff --git a/src/Clerk/clerk.service.ts b/src/Clerk/clerk.service.ts index 054478a..a5532a4 100644 --- a/src/Clerk/clerk.service.ts +++ b/src/Clerk/clerk.service.ts @@ -1,6 +1,8 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; + import { PrismaService } from '../Prisma/prisma.service'; import { clerkClient } from '@clerk/express'; + @Injectable() export class ClerkService { constructor(private readonly prisma: PrismaService) {} @@ -51,7 +53,6 @@ export class ClerkService { } } async eventUserCreated(data: any) { - console.log(data); const primary_email_address_id = data.primary_email_address_id; // get primary email address on email_addresses by querying email_addresses with primary_email_address_id let primary_email_address = data.email_addresses.find( @@ -70,16 +71,20 @@ export class ClerkService { const role = 'CUSTOMER'; const phoneNumber = ''; // create user in database - await this.prisma.user.create({ - data: { - id: user_id, - email: primary_email_address.email_address ?? '', - name: name ?? '', - role: role ?? '', - createdAt: created_at, - phoneNumber: phoneNumber ?? '', - }, - }); + try { + await this.prisma.user.create({ + data: { + id: user_id, + email: primary_email_address.email_address ?? '', + name: name ?? '', + role: role ?? '', + createdAt: created_at, + phoneNumber: phoneNumber ?? '', + }, + }); + } catch (err) { + Logger.error(err); + } } async eventUserUpdated(data: any) { @@ -102,14 +107,18 @@ export class ClerkService { // get user info from clerk const userInfo = await clerkClient.users.getUser(data.user_id); console.log(userInfo); - await this.prisma.user.create({ - data: { - id: data.user_id, - email: userInfo.emailAddresses[0].emailAddress, - name: `${userInfo.firstName} ${userInfo.lastName}`, - avatarUrl: userInfo.imageUrl, - }, - }); + try { + await this.prisma.user.create({ + data: { + id: data.user_id, + email: userInfo.emailAddresses[0].emailAddress, + name: `${userInfo.firstName} ${userInfo.lastName}`, + avatarUrl: userInfo.imageUrl, + }, + }); + } catch (err) { + Logger.error(err); + } } // to do: get session info } diff --git a/src/Schedule/schedule.service.ts b/src/Schedule/schedule.service.ts new file mode 100644 index 0000000..01aa253 --- /dev/null +++ b/src/Schedule/schedule.service.ts @@ -0,0 +1,23 @@ +import * as DateTimeUtils from '../common/utils/datetime.utils'; + +import { Injectable } from '@nestjs/common'; +import { PrismaService } from 'src/Prisma/prisma.service'; +import { Schedule } from '@prisma/client'; + +@Injectable() +export class ScheduleService { + constructor(private readonly prisma: PrismaService) {} + + async createSchedule(schedule: Schedule) { + // generate Slot By config + // const slots = await this.generateSlots(schedule.config); + // return this.prisma.schedule.createManyAndReturn({ + // data: schedule, + // }); + // } + // async getSchedule(id: string) { + // return this.prisma.schedule.findUnique({ + // where: { id }, + // }); + } +} diff --git a/src/common/constant/config.constant.ts b/src/common/constant/config.constant.ts new file mode 100644 index 0000000..be80043 --- /dev/null +++ b/src/common/constant/config.constant.ts @@ -0,0 +1,37 @@ +// export class ConfigConstant { +// static SLOT_DURATION = 60; +// static SLOT_BREAK_DURATION = 15; +// static MID_DAY_BREAK_TIME_START: Date = new Date().setHours(12, 0, 0, 0); +// static MID_DAY_BREAK_TIME_END: Date = new Date().setHours(13, 0, 0, 0); +// static SLOT_START_TIME: Date = new Date().setHours(8, 0, 0, 0); +// static SLOT_END_TIME: Date = new Date().setHours(22, 0, 0, 0); +// } + +// export const ConfigConstant: Record = { +// SLOT_DURATION: 60, +// SLOT_BREAK_DURATION: 15, +// MID_DAY_BREAK_TIME_START: { +// hour: 12, +// minute: 0, +// second: 0, +// millisecond: 0, +// }, +// MID_DAY_BREAK_TIME_END: { +// hour: 13, +// minute: 0, +// second: 0, +// millisecond: 0, +// }, +// SLOT_START_TIME: { +// hour: 8, +// minute: 0, +// second: 0, +// millisecond: 0, +// }, +// SLOT_END_TIME: { +// hour: 22, +// minute: 0, +// second: 0, +// millisecond: 0, +// }, +// }; diff --git a/src/common/utils/datetime.utils.ts b/src/common/utils/datetime.utils.ts index 5391525..ca55690 100644 --- a/src/common/utils/datetime.utils.ts +++ b/src/common/utils/datetime.utils.ts @@ -1,64 +1,34 @@ -function getOverlapRange( - startA: number, - endA: number, - startB: number, - endB: number, -) { - const overlapStart = Math.max(startA, startB); - const overlapEnd = Math.min(endA, endB); +// function getOverlapRange( +// startA: number, +// endA: number, +// startB: number, +// endB: number, +// ) { +// const overlapStart = Math.max(startA, startB); +// const overlapEnd = Math.min(endA, endB); - return overlapStart < overlapEnd ? { overlapStart, overlapEnd } : null; -} +// return overlapStart < overlapEnd ? { overlapStart, overlapEnd } : null; +// } -function isOverlap(startA: number, endA: number, startB: number, endB: number) { - return getOverlapRange(startA, endA, startB, endB) !== null; -} +// export function isOverlap( +// startA: number, +// endA: number, +// startB: number, +// endB: number, +// ) { +// return getOverlapRange(startA, endA, startB, endB) !== null; +// } -// Generate random time ranges for the schedulers -function generateTimeRanges(count: number): { start: number; end: number }[] { - const ranges = []; - const startDate = new Date('2024-10-06T00:00:00Z').getTime(); - for (let i = 0; i < count; i++) { - const start = startDate + Math.floor(Math.random() * 10000000); // Random start time - const end = start + Math.floor(Math.random() * 10000000); // Random end time after start - ranges.push({ start, end }); - } - return ranges; -} +// const overlapRange = getOverlapRange(startA, endA, startB, endB); +// if (overlapRange) { +// console.log( +// `Overlap Start: ${new Date(overlapRange.overlapStart).toISOString()}`, +// ); +// console.log( +// `Overlap End: ${new Date(overlapRange.overlapEnd).toISOString()}`, +// ); -// Benchmark performance of overlap detection between two schedulers -const schedulerA = generateTimeRanges(50); -const schedulerB = generateTimeRanges(50); - -console.time('Overlap Benchmark'); -let overlapCount = 0; -for (const rangeA of schedulerA) { - for (const rangeB of schedulerB) { - if (isOverlap(rangeA.start, rangeA.end, rangeB.start, rangeB.end)) { - overlapCount++; - } - } -} -console.timeEnd('Overlap Benchmark'); - -console.log(`Total Overlaps Found: ${overlapCount}`); - -// Example usage with specific time ranges -const startA = new Date('2024-10-06T10:00:00Z').getTime(); -const endA = new Date('2024-10-06T12:00:00Z').getTime(); -const startB = new Date('2024-10-06T11:00:00Z').getTime(); -const endB = new Date('2024-10-06T13:00:00Z').getTime(); - -const overlapRange = getOverlapRange(startA, endA, startB, endB); -if (overlapRange) { - console.log( - `Overlap Start: ${new Date(overlapRange.overlapStart).toISOString()}`, - ); - console.log( - `Overlap End: ${new Date(overlapRange.overlapEnd).toISOString()}`, - ); - - console.log('Is overlap: true'); -} else { - console.log('No overlap'); -} +// console.log('Is overlap: true'); +// } else { +// console.log('No overlap'); +// }