아직 코드 리팩토링을 안한 관계로 굉장히 지저분할 수 있다는거....
양해 부탁드립니다....
//controller//
const ReservationService = require("../service/reservation.service");
const Company = require("../middleware/company_auth");
class ReservationController {
reservationService = new ReservationService();
postReservation = async (req, res, next) => {
try {
const {
interviewTopic, // 주제(제목)
start, // 인터뷰 시작시간
end, // 인터뷰 끝나는 시간
onMuted, // 면접 들어가기전 마이크 Mute 여부
interviewDone, // 면접 진행 예정과 이미 진행된 면접 구분하기 위함
isDone, // 링크가 활성화되면 true 비활성화면 false
url // 링크주소
} = req.body;
const { companyName, companyAdmin } = res.locals.user;
const postReservation = await this.reservationService.postReservation(
companyName,
companyAdmin,
interviewTopic,
start,
end,
onMuted,
interviewDone,
isDone,
url
);
res.status(201).json({ data: postReservation });
} catch (err) {
res.status(400).json({ errorMessage: err.message });
}
};
module.exports = ReservationController;
//service//
const ReservationRepository = require("../repository/reservation.repository");
const schedule = require("node-schedule");
const rule = new schedule.RecurrenceRule();
const Company = require("../models/reservation");
class ReservationService {
reservationRepository = new ReservationRepository();
postReservation = async (
companyName,
companyAdmin,
interviewTopic,
interviewTime,
start,
end,
onMuted,
interviewDone,
isDone,
url
) => {
//node-schedule 를 이용해 start , end 시간에 true , false 값으로 변형 시킨다.
const [dayOfTheWeek, month, day, year, time] = start.split(" ");
const [hour, min, sec] = time.split(":");
const realYear = year - 0;
const realMonth = month - 1;
const realDay = day - 0;
const realHour = hour - 0;
const realMin = min - 0;
// console.log(realYear, realMonth,realDay, realHour, realMin)
const date = new Date(realYear, realMonth, realDay, realHour, realMin, 0);
// console.log(date)
date.setMinutes(date.getMinutes() + 0);
schedule.scheduleJob(date, async () => {
console.log("start: test");
await Company.updateOne({ companyName }, { isDone: "true" });
console.log("성공");
});
const [endDayOfTheWeek, endMonth, endDay, endYear, endTime] =
end.split(" ");
const [endHour, endMin, endSec] = endTime.split(":");
const endRealYear = endYear - 0;
const endRealMonth = endMonth - 1;
const endRealDay = endDay - 0;
const endRealHour = endHour - 0;
const endRealMin = endMin - 0;
const endDate = new Date(
endRealYear,
endRealMonth,
endRealDay,
endRealHour,
endRealMin,
0
);
endDate.setMinutes(endDate.getMinutes() + 0);
schedule.scheduleJob(endDate, async () => {
console.log("end: test");
await Company.updateOne({ companyName }, { isDone: "false" });
});
// 문자열을 랜덤으로 받아 url 값을 생성한다.
let randomStr = Math.random().toString(36).substring(2, 12);
console.log(randomStr);
url = `localhost:3000/${randomStr}`;
// 마이크 Mute true, false 값
try {
if (onMuted === "true") {
await this.reservationRepository.postReservation(
companyName,
companyAdmin,
interviewTopic,
interviewTime,
start,
end,
"true",
interviewDone,
isDone,
randomStr
);
} else {
await this.reservationRepository.postReservation(
companyName,
companyAdmin,
interviewTopic,
interviewTime,
start,
end,
"false",
interviewDone,
isDone,
randomStr
);
}
return {
companyName,
companyAdmin,
interviewTopic,
interviewTime: {
start,
end,
},
interviewOption: {
onMuted,
},
interviewDone,
interviewUrl: {
isDone,
url,
},
};
} catch (err) {
throw new Error("postReservation에서 권한이 없습니다");
}
};
//repository//
const Reservation = require("../models/reservation");
class ReservationRepository {
postReservation = async (
companyName,
companyAdmin,
interviewTopic,
interviewTime,
start,
end,
onMuted,
interviewDone,
isDone,
url
) => {
await Reservation.create({
companyName,
companyAdmin,
interviewTopic,
interviewTime,
start,
end,
onMuted,
interviewDone,
isDone,
url,
});
return;
};