backend_adaptive_learning/index.js
2024-11-20 19:56:37 +07:00

95 lines
2.4 KiB
JavaScript

import express from "express";
import cors from "cors";
import dotenv from "dotenv";
import { testConnection } from "./database/db.js";
import router from "./routes/index.js";
import cookieParser from "cookie-parser";
import promBundle from "express-prom-bundle";
import cron from "node-cron";
import moment from "moment-timezone";
import models from "./models/index.js";
dotenv.config();
const app = express();
const metricsMiddleware = promBundle({
includeMethod: true,
includePath: true,
includeStatusCode: true,
promClient: {
collectDefaultMetrics: {},
},
});
app.use(metricsMiddleware);
const corsOptions = {
origin: `${process.env.CLIENT_URL}`,
methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
allowedHeaders: ["Content-Type", "Authorization"],
credentials: true,
};
app.use(cors(corsOptions));
app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(router);
app.use("/api", express.static("media"));
// cron.schedule("0 17 * * *", async () => { ini kalau timezone servernya UTC
cron.schedule("0 0 * * *", async () => {
const now = moment().tz("Asia/Jakarta").format("YYYY-MM-DD HH:mm:ss");
console.log(`Cron job executed at ${now} (WIB)`);
const transaction = await models.db.transaction();
try {
const unvalidatedUsers = await models.User.findAll({
attributes: ["ID"],
where: {
IS_VALIDATED: 0,
},
transaction,
});
const unvalidatedUserIDs = unvalidatedUsers.map((user) => user.ID);
if (unvalidatedUserIDs.length > 0) {
await models.Student.destroy({
where: { ID: { [models.Sequelize.Op.in]: unvalidatedUserIDs } },
transaction,
});
await models.Teacher.destroy({
where: { ID: { [models.Sequelize.Op.in]: unvalidatedUserIDs } },
transaction,
});
await models.User.destroy({
where: { ID: { [models.Sequelize.Op.in]: unvalidatedUserIDs } },
transaction,
});
}
await transaction.commit();
console.log(
"Removed unvalidated users and their related data"
);
} catch (error) {
await transaction.rollback();
console.error(
"Failed to delete unvalidated users and related data:",
error
);
}
}, {
timezone: "Asia/Jakarta"
});
app.listen(process.env.APP_PORT, () => {
testConnection();
console.log(`Server running on port ${process.env.APP_PORT}`);
});