library-ts/node/users/apps/reminder/ReminderApp.ts

80 lines
2.3 KiB
TypeScript

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<ReminderData> 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<ReminderData>();
let tasks:Task[] =[];
this.grabTasks( user, data, this.ums.scheduler.maxDate, tasks );
this.ums.scheduler.scheduleTasks( tasks );
}
)
}
async getTasksToSchedule( maxDate:Date ):Promise<Task[]>
{
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 )
}
}
);
}
}