기존에 만들었던 회원탈퇴가 관리자 로그인으로 직접 삭제를 해야했기에 스케줄러로 자동으로 처리되게 했다.
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 * * * " 왼쪽부터 분 시 날 월 요일 순서이다. 그래서 잘 작동되는지 가장 빠른 시간으로 바꿔서 테스트를 진행했다.
'오늘 뭐했냐 > 함께했던 작업들' 카테고리의 다른 글
23.09.08 발표 후 피드백 아쉬운 부분 (0) | 2023.09.13 |
---|---|
23.09.06 유저 테스트 (0) | 2023.09.12 |
23.08.28 이미지 업로드 속도 문제 (0) | 2023.09.05 |
23.08.27 회원 탈퇴 만들기3 (서버 상태 모듈 적용하기) (0) | 2023.09.03 |
23.08.26 회원 탈퇴 만들기2 (서버 상태 확인 모듈 만들기) (0) | 2023.09.03 |