import { Injectable } from '@nestjs/common'; import type { DailyEvaluationStep } from '../jobs/daily-evaluation-steps'; import type { JobResult } from '../jobs/job'; import { DigestService, WINDOW_END_KEY } from './digest.service'; /** * Step "digest", the last of the daily evaluation: the in-app morning * digest of every user. Running it twice for one day writes nothing the * second time (the key holds the day and the user): `digestsWritten` is 0 * on a same-day rerun. */ @Injectable() export class DigestStep implements DailyEvaluationStep { readonly name = 'digest'; constructor(private readonly digests: DigestService) {} async run(today: string): Promise { // The window of season changes ends here; the next run starts where // this one stopped, so every change is reported once. const until = new Date(); const digestsWritten = await this.digests.runFor(today, undefined, { until, }); // A run that wrote nothing (a same-day rerun, or no content) reported // no change: the next run must still read the earlier window. return digestsWritten === 0 ? { digestsWritten } : { digestsWritten, [WINDOW_END_KEY]: until.toISOString() }; } }