import { Service } from "typedi"; import { CronJob } from "cron"; import MailchimpService from "../MailchimpService/MailchimpService"; import FilesService from "../FilesService/FilesService"; import IdNotService from "../IdNotService/IdNotService"; import { PrismaClient } from "@prisma/client"; import NotificationBuilder from "@Common/notifications/NotificationBuilder"; import EmailBuilder from "@Common/emails/EmailBuilder"; import TotpService from "@Services/customer/TotpService/TotpService"; // import { PrismaClient } from "@prisma/client"; @Service() export default class CronService { constructor( private mailchimpService: MailchimpService, private filesService: FilesService, private idNotService: IdNotService, private notificationBuilder: NotificationBuilder, private emailBuilder: EmailBuilder, private totpService: TotpService, ) {} public async sendMails() { const cronJob = new CronJob("*/15 * * * * *", async () => { // Every 15 seconds try { await this.mailchimpService.sendEmails(); } catch (e) { console.error(e); } }); // Start job if (!cronJob.running) { cronJob.start(); } } public async sendRecapMails() { const cronJob = new CronJob("0 20 * * FRI", async () => { // Every friday at 20:00 try { await this.emailBuilder.sendRecapEmails(); } catch (e) { console.error(e); } }); // Start job if (!cronJob.running) { cronJob.start(); } } public async archiveFiles() { const cronJob = new CronJob("0 0 * * MON", async () => { // Every monday at midnight try { await this.filesService.archiveOldFiles(); } catch (e) { console.error(e); } }); // Start job if (!cronJob.running) { cronJob.start(); } } public async updateUsers() { const cronJob = new CronJob("*/5 * * * *", async () => { // Once a day at midnight try { await this.idNotService.updateOffices(); await this.idNotService.updateUsers(); } catch (e) { console.error(e); } }); // Start job if (!cronJob.running) { cronJob.start(); } } public async checkDocumentsExpiration() { const cronJob = new CronJob("0 20 * * *", async () => { // Once a day at midnight try { const prisma = new PrismaClient(); const expiringDocuments15Days: [{ uid: string; expiration_date: Date }] = await prisma.$queryRaw`SELECT distinct o.uid, f.created_at as expiration_date FROM documents d JOIN files f ON d.uid=f.document_uid JOIN office_folders o ON o.uid=d.folder_uid WHERE o.folder_anchor_uid IS null AND d.document_status = 'DEPOSITED' AND current_date = (DATE(f.created_at) + interval '3 months' - interval '2 days');`; expiringDocuments15Days.forEach((expiringFolder) => { this.notificationBuilder.sendDocumentExpiringSoonNotification(expiringFolder.uid, expiringFolder.expiration_date); }); } catch (e) { console.error(e); } }); // Start job if (!cronJob.running) { cronJob.start(); } } public async cleanExpiredTotpCodes() { const cronJob = new CronJob("0 0 * * *", async () => { // Once a day at midnight try { await this.totpService.cleanExpiredTotpCodes(); } catch (e) { console.error(e); } }); // Start job if (!cronJob.running) { cronJob.start(); } } }