[JavaScript] Node schedule

최예닮·2022년 11월 21일
1
post-thumbnail

자 ! 저번에 이어서 내 3 layerd 를 공개하겠다... (하지만 전혀 RESTful 하지 않다는거...)

아직 코드 리팩토링을 안한 관계로 굉장히 지저분할 수 있다는거....
양해 부탁드립니다....

그럼 고고 들어가보자 ! You and It's more than 'like' 😚

//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;

body 값이 뭐이리 많니... 어지럽다 ... 😵‍💫

사실 이거는 아무것도 아니다... service 쪽이 제일 심각하다 코드가 너무 지저분해... 창피하지만... 보여주겠다...

//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 단을 한번 봐보자

//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;
  };

여기는 뭐 딱히 어려운게 없다.

자 ~ 이렇게 하고 선더 클라이언트를 돌려서 구동시켜보자 !

이렇게 우리가 의도한대로 받아올 수 있게 된다 음하하 !

이걸 짜보면서 node-schedule 라는 친구를 알게 되었고 아직 잘 사용하지는 못하는거 같지만 ... 잘 활용하면 재미있는 기능구현을 할 수 있겠다고 생각이 들었다.

CRUD라 해서 마냥 쉽게 생각했는데 이렇게 받아야할게 많은 API를 구성해보니 삽질도 꽤 많이하고 쉽지 않았다... 다시는 얕보지 않을게 친구...

오늘은 여기까지 ~ 우리 내일 또 만나요 안뇽 ~~~ 🖐

profile
산을 오르려고 하는데 이제 주차장에 막 주차한 초보개발자

0개의 댓글