Skip to content

Commit

Permalink
Merge pull request #78 from dscdut/feat/meeting_plans
Browse files Browse the repository at this point in the history
feat: check conflict meetings
  • Loading branch information
hungpham28 authored Feb 20, 2024
2 parents 828f9a4 + 2a1c3e8 commit ebe602c
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 12 deletions.
50 changes: 38 additions & 12 deletions backend/src/core/database/seeds/08-meetings.js
Original file line number Diff line number Diff line change
@@ -1,28 +1,45 @@
/**
* @param {import("knex")} knex
*/
// eslint-disable-next-line import/no-extraneous-dependencies
import { fa, fakerEN } from '@faker-js/faker';
/* eslint-disable import/no-extraneous-dependencies */
import { fakerEN } from '@faker-js/faker';
import { numPatients } from './02-patients';
import { numDoctors } from './02-doctors';

const tableName = 'meetings';
export const numMeetings = 1000;// You can adjust the number of meetings you want to create
export const numMeetings = 1000; // You can adjust the number of meetings you want to create
/**
* @param {import("knex")} knex
*/
function checkConflict(meeting, meetings) {
const {
start_time, end_time, doctor_id, patient_id
} = meeting;

// Kiểm tra xem có cuộc họp nào trong meetings xung đột với cuộc họp được cung cấp không
return meetings.some(existingMeeting => {
// Kiểm tra xem cuộc họp hiện tại liên quan đến cùng một bác sĩ hoặc bệnh nhân
if (existingMeeting.doctor_id === doctor_id || existingMeeting.patient_id === patient_id) {
// Kiểm tra xem có chồng lấp thời gian không
return (
(existingMeeting.start_time >= start_time && existingMeeting.start_time < end_time) // Thời gian bắt đầu của cuộc họp hiện tại nằm trong khoảng thời gian của cuộc họp mới
|| (existingMeeting.end_time > start_time && existingMeeting.end_time <= end_time) // Thời gian kết thúc của cuộc họp hiện tại nằm trong khoảng thời gian của cuộc họp mới
|| (existingMeeting.start_time < start_time && existingMeeting.end_time > end_time) // Cuộc họp hiện tại hoàn toàn chứa cuộc họp mới
);
}
return false;
});
}

exports.seed = async knex => {
await knex(tableName).del();

const meetings = [];

const future90dayTotoday = new Date();
future90dayTotoday.setDate(future90dayTotoday.getDate() + 90);

const previous90dayTotoday = new Date();
previous90dayTotoday.setDate(previous90dayTotoday.getDate() - 90);

// eslint-disable-next-line no-plusplus
for (let i = 1; i <= numMeetings; i++) {
async function generateMeeting() {
const startTime = fakerEN.date.between({ from: previous90dayTotoday.toString(), to: future90dayTotoday.toString() });
startTime.setSeconds(0);
startTime.setMilliseconds(0);
const endTime = new Date(startTime);
endTime.setHours(startTime.getHours() + fakerEN.number.int({ min: 1, max: 6 }), fakerEN.number.int({ min: 0, max: 60 }));

Expand All @@ -37,8 +54,17 @@ exports.seed = async knex => {
created_at: fakerEN.date.recent({ days: 30, refDate: startTime.toString() }),
};

meetings.push(meeting);
const conflict = await checkConflict(meeting, meetings);
if (!conflict) {
meetings.push(meeting);
} else {
await generateMeeting(); // Retry if there's a conflict
}
}

// Generate meetings asynchronously
const generateMeetingPromises = Array.from({ length: numMeetings }, () => generateMeeting());
await Promise.all(generateMeetingPromises);

await knex(tableName).insert(meetings);
};
21 changes: 21 additions & 0 deletions backend/src/core/modules/meeting/meeting.repository.js
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,27 @@ class Repository extends DataRepository {
.count('meetings.id')
.first();
}

checkConflictTimeByDoctorIdOrPatientId(doctorId, patientId, startTime, endTime) {
return this.query()
.where(builder => {
builder.where('doctor_id', '=', doctorId)
.orWhere('patient_id', '=', patientId);
})
.andWhere(builder => {
builder.where(subBuilder => {
subBuilder.where('start_time', '>=', startTime)
.andWhere('start_time', '<', endTime);
}).orWhere(subBuilder => {
subBuilder.where('end_time', '>', startTime)
.andWhere('end_time', '<=', endTime);
}).orWhere(subBuilder => {
subBuilder.where('start_time', '<', startTime)
.andWhere('end_time', '>', endTime);
});
})
.limit(1);
}
}

export const MeetingRepository = new Repository('meetings');
7 changes: 7 additions & 0 deletions backend/src/core/modules/meeting/meeting.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ class Service {
`Could not find patient with id = ${meetingDto.patientId} to create a meeting`,
);
}
const conflicts = await this.meetingRepository
.checkConflictTimeByDoctorIdOrPatientId(doctorId, meetingDto.patientId, meetingDto.startTime, meetingDto.endTime);
if (conflicts.length !== 0) {
throw new BadRequestException(
'Appointment has conflicted with the patient\'s or doctor\'s previous appointment',
);
}
const trx = await getTransaction();
try {
const createdMeeting = await this.meetingRepository.createMeeting(
Expand Down

0 comments on commit ebe602c

Please sign in to comment.