오늘 뭐했냐/함께했던 작업들

23.08.30 회원탈퇴4 (스케줄러 적용)

스스로에게 2023. 9. 7. 00:56

 기존에 만들었던 회원탈퇴가 관리자 로그인으로 직접 삭제를 해야했기에 스케줄러로 자동으로 처리되게 했다. 

const CustomError = require("./error"); // CustomError를 불러옵니다.
const confirmRequest = require("./confirmRequest");
const { Users } = require("../models");
const { Op } = require("sequelize");

class serverCheckDelete {
  async execute() {
    try {
      const maxListeners = 5;
      const timeoutDuration = 15 * 1000;
      let totalDeletedCount = 0;
      const timeoutFunc = (listener) => {
        return setTimeout(() => {
          confirmRequest.off("requestCompleted", listener);
          throw new CustomError("요청이 너무 오래 걸립니다.", 408);
        }, timeoutDuration);
      };
      const processDelete = async () => {
        if (confirmRequest.getCurrentRequests() > 5) {
          if (
            confirmRequest.listenerCount("requestCompleted") >= maxListeners
          ) {
            throw new CustomError("동시 삭제 시도 횟수가 너무 많습니다.", 404);
          }
          const listener = () => {
            clearTimeout(timeout);
            confirmRequest.off("requestCompleted", listener);
            processDelete();
          };
          const timeout = timeoutFunc(listener);
          confirmRequest.once("requestCompleted", listener);
          return;
        }
        const sevenDaysAgo = new Date();
        sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
        const deletedCount = await Users.destroy({
          where: {
            deletedAt: {
              [Op.ne]: null,
              [Op.lt]: sevenDaysAgo,
            },
          },
          limit: 10,
          force: true,
        });
        totalDeletedCount += deletedCount;
        if (deletedCount < 5) {
          return `총 ${totalDeletedCount}개의 회원 정보 삭제 작업이 완료되었습니다.`;
        } else {
          return await processDelete();
        }
      };
      return await processDelete();
    } catch (error) {
      console.error("스케줄러 삭제 처리 중 에러", error);
    }
  }
}

module.exports = serverCheckDelete;
// scheduler.js
const schedule = require("node-schedule");
const ServerCheckDelete = require("./serverCheckDelete"); // 실제 경로로 바꾸세요.
const CustomError = require("./error");

const scheduleDeleteAllUserInfo = () => {
  const job = schedule.scheduleJob("0 5 * * *", async function () {
    const serverCheckDelete = new ServerCheckDelete();
    try {
      const result = await serverCheckDelete.execute();
      console.log(result, "삭제 완료");
    } catch (error) {
      throw new CustomError("스케줄러 에러", 400);
    }
  });
};

module.exports = scheduleDeleteAllUserInfo;

이것을 app.js에 추가하고 실행시키면 끝이다. 그리고 이것도 모듈화 시켜서 기존 관리자 로그인 삭제도 남겨서 활용할 수 있게했다. 

 

테스트 하는 방법은 " 0 5 * * * " 왼쪽부터 분 시 날 월 요일 순서이다. 그래서 잘 작동되는지 가장 빠른 시간으로 바꿔서 테스트를 진행했다.