본문 바로가기

TIL

[TIL] 2024-02-28 슬랙api + node-schedule

오늘의 이슈

 

 

좌측 코드의 노드 스케줄로 우측 코드의 router.post(/submi/slack) 을 원하는 시간에 실행하려 했다.

노드 스케줄을 적용시키는데에는 큰 어려움이 없었으나

 

해당 api를 요청하기 위해서는 현재 내 로직에서 auth미들웨어를 통과해야한다.

원래 api코드를 작성시에 만든 목적은 auth미들웨어에서 현재 로그인한 유저가 관리자인지 확인하기위해

req.user에 현재 로그인유저 정보를 담기 위해 auth미들웨어를 타고 컨트롤러로 이동시키는 로직을 구성했다.

 

하지만 api를 원하는 시간에 자동 발송하도록 요청할때에는 로그인하고 api를 요청하는 방법이 없다!

 

그럼 나는 어떻게 해야하는가!

 

원래는 우측 코드를 서비스 계층으로 분리하고 해당 함수를 가져오는 방식을 사용하는게 가장 좋을 것 같다.

하지만 내일 팀프로젝트를 발표하기 위해 고칠 시간이 부족했다.

 

튜터님에게 이 현재 문제를 우회할 방법에 대해 자문을 구해봤으나

auth미들웨어에서 분기를 만들어 시크릿키를 따로 사용하라는 방식을 조언 받았다!

 

하지만 잘 모르겠다.

 

그래서 시도한 도전은 코드를 다시 뜯어보니 컨트롤러의 함수를 굳이 실행하지않고

내가필요한건 그냥 til을 제출하지 않은 인원의 정보만 가져오면된다 == 이거는 userid 즉 관리자 아이디가 없어도 정보를 가져오는 함수가 레포지토리에 있다 

그래서 그 함수를 활용해보기로 했다.

router.post("/submit/slack", async (req, res, next) => {
  try {
    const { category, start, end, classId } = req.body;

    const notSubmitUsers = await projectsRepository.getAllNotSubmitUser(
      category,
      start,
      end,
      classId,
    );

    const text = notSubmitUsers;
    let nameArr = text.map((item) => item.name);
    let resultString = nameArr.join(", ");
    await slackSender(resultString);

    return res.status(200).json({ message: "슬랙으로 메세지 발송완료" });
  } catch (error) {
    next(error);
  }
});

 

이런식으로 애초에미들웨어 단계를 생략하고  레포지토리의 함수를 실행시켜서 바로 정보만 꺼내오는 로직으로 고쳐냈다!

 

근데 물론 이건 어떻게 보면 잘못된걸 수도 있다. 해당 레포의 함수가 관리자가 아니어도 실행시킬수 있는 정보를 가져오는지 조금 검증이 부족한 부분이 있기때문이다. 다만 이 api를 뷰에서 관리자 페이지에서만 실행할 수 있도록 하고 코드를 오픈시키지 않는다면 문제가 안될 수 도 있다고 생각한다. ( 물론 깃헙에 노출됨 )

 

아무튼 해냈죠?

 

 


 

추가적으로 이 로직에 노드스케줄 적용한 코드는 아래같이 구성했다!

const rule = new schedule.RecurrenceRule();

rule.dayOfWeek = [new schedule.Range(1, 5)];
rule.hour = [9, 12, 21];
rule.minute = 0;
rule.tz = "Asia/Seoul";

const job = schedule.scheduleJob(rule, async () => {
  const response = await axios.post(
    "http://localhost:3000/projects/submit/slack",
    {
      category: "PERSONAL_PROJECT",
      start: "2024-02-02T15:00:00.000Z",
      end: "2024-02-29T15:00:00.000Z",
      classId: 1,
    },
  );
});

 

규칙에 dayOfWeek 는 월요일 부터 금요일을 의미한다 (일요일은 0)

hour 배열은 안에 들어있는 시간마다 동작한다.

minute 은 0분 

tz는 기준 시간 지역을 표시해주고

job(rule,콜백) 으로 콜백에서 위에서 만든 api 를 실행시켜준다.

현재는 테스트할 더미데이터가 없어서 classId가 1인 상태이다. ==> 추후 업데이트 필요함!

 

상당히 복잡했으나 결국 자동화까지 완성해내서 아주 뿌듯한 결말이다.

'TIL' 카테고리의 다른 글

[TIL] 2024-03-04 TS error  (0) 2024.03.04
[TIL] 2024-02-29 팀 프로젝트 회고  (3) 2024.02.29
[TIL] 2024-02-27 nodemailer 이슈  (1) 2024.02.28
[TIL] 2024-02-26 jest 이슈  (0) 2024.02.27
[TIL] 2024-02-23 JavaScript Code Kata  (0) 2024.02.23