import { DateHelper } from "../../../../browser/date/DateHelper"; import { DateMath } from "../../../../browser/date/DateMath"; import { ISOTimeStamp } from "../../../../browser/date/ISOTimeStamp"; import { PathReference } from "../../../files/PathReference"; import { iTaskScheduler } from "../../scheduler/iTaskScheduler"; import { Task } from "../../scheduler/Task"; import { UserData } from "../../UserData"; import { UserManagementServer } from "../../UserManagementServer"; import { UserApp } from "../UserApp"; import { MailEntry } from "./data/MailEntry"; import { ReminderData } from "./data/ReminderData"; export class ReminderApp extends UserApp implements iTaskScheduler { static readonly id = "reminder"; constructor( ums:UserManagementServer ) { super( ReminderApp.id, ums ); this.onFileChange.addListener( async ( filePath )=> { let pathReference = new PathReference( filePath ); let id = pathReference.fileNameWithoutExtension; let user = await this.ums.userDB.byID( id ); if ( ! user ) { console.log( "file changed:", filePath, "but no user associated" ); return; } let data = await pathReference.loadJSON(); let tasks:Task[] =[]; this.grabTasks( user, data, this.ums.scheduler.maxDate, tasks ); this.ums.scheduler.scheduleTasks( tasks ); } ) } async getTasksToSchedule( maxDate:Date ):Promise { let tasks = []; await this.iterateUserData( ( userData:UserData, reminderData:ReminderData )=> { this.grabTasks( userData, reminderData, maxDate, tasks ); return Promise.resolve(); } ); return Promise.resolve( tasks ); } grabTasks( userData:UserData, rd:ReminderData, maxDate:Date, tasks:Task[] ) { rd.mailEntries.forEach( ( me )=> { let date = DateHelper.parseDateExpression( me.date ); if ( DateMath.isBefore( date, maxDate ) ) { let task = Task.createAt( me.id, date, ()=> { this.ums.sendEmail( userData.email, me.subject, me.message ); } ); task.setUserContext( this.id, userData.id ); tasks.push( task ) } } ); } }