const fs = require('fs') var moment = require('moment'); // require module.exports = { myJob: { task: async ({ strapi }) => { var clearOptions = await strapi.entityService.findOne('api::clear-monthly.clear-monthly', 1, { fields: ['Active','Every','LastClearedAt'], }); if(!clearOptions||!clearOptions.LastClearedAt){ if(!clearOptions){ strapi.entityService.create('api::clear-monthly.clear-monthly', { data: {Active:false,LastClearedAt:'1000-01-01',Every:1}, }); } else{ try{ strapi.entityService.update('api::clear-monthly.clear-monthly', 1, { data: {LastClearedAt:'1000-01-01'}, }); } catch(e){ strapi.entityService.create('api::article.article', { data: {Active:false,LastClearedAt:'1000-01-01',Every:1}, }); } } clearOptions = {Active:false,LastClearedAt:'1000-01-01',Every:1}; } if(clearOptions.Active){ var present = moment(); if(present.diff(moment(clearOptions.LastClearedAt,'YYYY-MM-DD'), 'months')>=(clearOptions.Every||1)){ console.log('scheduled cleaning'); var now = new Date(); now.setMonth(now.getMonth()-clearOptions.Every); const entries = await strapi.entityService.findMany('api::material.material', { sort: { createdAt: 'DESC' }, filters: { $and: [ { Cleared:false }, { createdAt: { $lte: moment(now).format('YYYY-MM-DD')}, } ], }, populate:['Video', 'Images','Attachments'] }); var errorCount = 0; if(entries&& entries.length>0){ var clearMaterial = {}; entries.forEach(element => { var deleteFiles = []; if(element.Video){ deleteFiles.push(element.Video.hash); } if(element.Attachments){ element.Attachments.forEach(el=>{ deleteFiles.push(el.hash); }); } if(element.Images){ element.Images.forEach(el=>{ deleteFiles.push(el.hash); }); } clearMaterial[element.id] = deleteFiles; }); var listFiles = []; fs.readdirSync("./public/uploads").forEach(file => { listFiles.push(file); }); Object.keys(clearMaterial).forEach((i)=>{ clearMaterial[i].forEach(name=>{ var files = listFiles.filter(file=>file.includes(name)); files.forEach(file=>{ try { fs.unlinkSync("./public/uploads/"+file); } catch(err) { console.log("Error deleting file",err); errorCount++; } }); }); // update id disini strapi.entityService.update('api::material.material', i, { data: { Cleared:true, publishedAt:null }, }); }); } else{ strapi.entityService.update('api::clear-monthly.clear-monthly', 1, { data: { LastClearedAt:moment().format('YYYY-MM-DD'), }, }); } if(errorCount==0){ strapi.entityService.update('api::clear-monthly.clear-monthly', 1, { data: { LastClearedAt:moment().format('YYYY-MM-DD'), }, }); } } } }, options: { rule: '*/10 * * * * *', tz: 'Asia/Bangkok', }, }, };