finnow/finnow-api/source/scheduled_jobs.d

70 lines
2.2 KiB
D

module scheduled_jobs;
import scheduled;
import std.datetime;
import slf4d;
void startScheduledJobs() {
JobSchedule analyticsSchedule = new FixedIntervalSchedule(
days(1),
Clock.currTime(UTC()) + seconds(5)
);
JobScheduler jobScheduler = new TaskPoolScheduler();
jobScheduler.addJob(() {
// Clear old analytics data from profiles.
import profile.data;
import profile.data_impl_sqlite;
import profile.model;
FileSystemProfileRepository.doForAllUserProfiles(
(Profile profile, ProfileRepository profileRepo) {
ProfileDataSource ds = profileRepo.getDataSource(profile);
auto props = ds.getPropertiesRepository().findAll();
bool shouldDelete = false;
foreach (prop; props) {
import std.string : startsWith;
if (startsWith(prop.property, "analytics")) {
shouldDelete = true;
break;
}
}
if (shouldDelete) {
ds.getPropertiesRepository().deleteAllByPrefix("analytics");
infoF!"Deleted all old \"analytics\" properties for user %s profile %s."(
profile.username, profile.name
);
}
}
);
}, analyticsSchedule);
// Add a scheduled job to regularly check for and create recurring transaction drafts.
jobScheduler.addJob(() {
import profile.data;
import profile.data_impl_sqlite;
import profile.model;
import transaction.dto;
import transaction.data;
import util.pagination;
import std.stdio;
import std.datetime;
import cronexp;
FileSystemProfileRepository.doForAllUserProfiles((Profile profile, ProfileRepository profileRepo) {
writefln!"Recurring transaction check: %s / %s"(profile.username, profile.name);
ProfileDataSource ds = profileRepo.getDataSource(profile);
RecurringTransactionRepository rtRepo = ds.getRecurringTransactionRepository();
Page!(RecurringTransactionResponse) result = rtRepo.findAll(PageRequest.unpaged());
foreach (rt; result.items) {
writeln(rt.scheduleExpr);
DateTime now = cast(DateTime) Clock.currTime();
auto cron = CronExpr(rt.scheduleExpr);
writefln!"scheduleExpr = %s -> %s"(rt.scheduleExpr, cron.getNext(now));
// TODO: Figure out how to actually create the transactions!
}
});
}, new FixedIntervalSchedule(minutes(1), Clock.currTime(UTC())));
jobScheduler.start();
}