handle error on create user
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
"dependi.npm.lockFileEnabled": false,
|
"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
|
||||||
}
|
}
|
||||||
@@ -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';
|
import { PrismaService } from 'src/Prisma/prisma.service';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AppConfigService {
|
export class AppConfigService implements OnModuleInit {
|
||||||
constructor(private readonly prisma: PrismaService) {}
|
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,
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable, Logger } from '@nestjs/common';
|
||||||
|
|
||||||
import { PrismaService } from '../Prisma/prisma.service';
|
import { PrismaService } from '../Prisma/prisma.service';
|
||||||
import { clerkClient } from '@clerk/express';
|
import { clerkClient } from '@clerk/express';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ClerkService {
|
export class ClerkService {
|
||||||
constructor(private readonly prisma: PrismaService) {}
|
constructor(private readonly prisma: PrismaService) {}
|
||||||
@@ -51,7 +53,6 @@ export class ClerkService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
async eventUserCreated(data: any) {
|
async eventUserCreated(data: any) {
|
||||||
console.log(data);
|
|
||||||
const primary_email_address_id = data.primary_email_address_id;
|
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
|
// get primary email address on email_addresses by querying email_addresses with primary_email_address_id
|
||||||
let primary_email_address = data.email_addresses.find(
|
let primary_email_address = data.email_addresses.find(
|
||||||
@@ -70,6 +71,7 @@ export class ClerkService {
|
|||||||
const role = 'CUSTOMER';
|
const role = 'CUSTOMER';
|
||||||
const phoneNumber = '';
|
const phoneNumber = '';
|
||||||
// create user in database
|
// create user in database
|
||||||
|
try {
|
||||||
await this.prisma.user.create({
|
await this.prisma.user.create({
|
||||||
data: {
|
data: {
|
||||||
id: user_id,
|
id: user_id,
|
||||||
@@ -80,6 +82,9 @@ export class ClerkService {
|
|||||||
phoneNumber: phoneNumber ?? '',
|
phoneNumber: phoneNumber ?? '',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
} catch (err) {
|
||||||
|
Logger.error(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async eventUserUpdated(data: any) {
|
async eventUserUpdated(data: any) {
|
||||||
@@ -102,6 +107,7 @@ export class ClerkService {
|
|||||||
// get user info from clerk
|
// get user info from clerk
|
||||||
const userInfo = await clerkClient.users.getUser(data.user_id);
|
const userInfo = await clerkClient.users.getUser(data.user_id);
|
||||||
console.log(userInfo);
|
console.log(userInfo);
|
||||||
|
try {
|
||||||
await this.prisma.user.create({
|
await this.prisma.user.create({
|
||||||
data: {
|
data: {
|
||||||
id: data.user_id,
|
id: data.user_id,
|
||||||
@@ -110,6 +116,9 @@ export class ClerkService {
|
|||||||
avatarUrl: userInfo.imageUrl,
|
avatarUrl: userInfo.imageUrl,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
} catch (err) {
|
||||||
|
Logger.error(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// to do: get session info
|
// to do: get session info
|
||||||
}
|
}
|
||||||
|
|||||||
23
src/Schedule/schedule.service.ts
Normal file
23
src/Schedule/schedule.service.ts
Normal file
@@ -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 },
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
}
|
||||||
37
src/common/constant/config.constant.ts
Normal file
37
src/common/constant/config.constant.ts
Normal file
@@ -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<string, any> = {
|
||||||
|
// 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,
|
||||||
|
// },
|
||||||
|
// };
|
||||||
@@ -1,64 +1,34 @@
|
|||||||
function getOverlapRange(
|
// function getOverlapRange(
|
||||||
startA: number,
|
// startA: number,
|
||||||
endA: number,
|
// endA: number,
|
||||||
startB: number,
|
// startB: number,
|
||||||
endB: number,
|
// endB: number,
|
||||||
) {
|
// ) {
|
||||||
const overlapStart = Math.max(startA, startB);
|
// const overlapStart = Math.max(startA, startB);
|
||||||
const overlapEnd = Math.min(endA, endB);
|
// 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) {
|
// export function isOverlap(
|
||||||
return getOverlapRange(startA, endA, startB, endB) !== null;
|
// startA: number,
|
||||||
}
|
// endA: number,
|
||||||
|
// startB: number,
|
||||||
|
// endB: number,
|
||||||
|
// ) {
|
||||||
|
// return getOverlapRange(startA, endA, startB, endB) !== null;
|
||||||
|
// }
|
||||||
|
|
||||||
// Generate random time ranges for the schedulers
|
// const overlapRange = getOverlapRange(startA, endA, startB, endB);
|
||||||
function generateTimeRanges(count: number): { start: number; end: number }[] {
|
// if (overlapRange) {
|
||||||
const ranges = [];
|
// console.log(
|
||||||
const startDate = new Date('2024-10-06T00:00:00Z').getTime();
|
// `Overlap Start: ${new Date(overlapRange.overlapStart).toISOString()}`,
|
||||||
for (let i = 0; i < count; i++) {
|
// );
|
||||||
const start = startDate + Math.floor(Math.random() * 10000000); // Random start time
|
// console.log(
|
||||||
const end = start + Math.floor(Math.random() * 10000000); // Random end time after start
|
// `Overlap End: ${new Date(overlapRange.overlapEnd).toISOString()}`,
|
||||||
ranges.push({ start, end });
|
// );
|
||||||
}
|
|
||||||
return ranges;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Benchmark performance of overlap detection between two schedulers
|
// console.log('Is overlap: true');
|
||||||
const schedulerA = generateTimeRanges(50);
|
// } else {
|
||||||
const schedulerB = generateTimeRanges(50);
|
// console.log('No overlap');
|
||||||
|
// }
|
||||||
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');
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user