fix(07): CR-02 correct cron expression for pollIntervalMin >= 60
Tessera CI/CD / Tests (push) Blocked by required conditions
Tessera CI/CD / Build & Deploy (push) Blocked by required conditions
Tessera CI/CD / Lint & Type Check (push) Has started running

Values >=60 in the cron minute field silently misbehave (*/60 fires once per
hour, */90 fires once per hour, etc.). Use the hours field for intervals >=60:
  <60 min  → */N * * * *
  >=60 min → 0 */H * * * (H = floor(N/60))
Also adds @Max(1440) to DkvConfigDto to bound the field at 24 h.
This commit is contained in:
2026-06-27 17:20:11 +02:00
parent f3f610f9e1
commit 955a94638c
2 changed files with 12 additions and 3 deletions
+9 -2
View File
@@ -101,8 +101,15 @@ export class DkvSchedulerService implements OnModuleInit {
/* Job not yet registered — this is expected on first call */
}
// Create new cron job with computed expression: every N minutes
const cronExpr = `*/${intervalMin} * * * *`;
// Create new cron job with computed expression.
// Standard cron minute field only accepts 0–59; for longer intervals use the hours field.
let cronExpr: string;
if (intervalMin < 60) {
cronExpr = `*/${intervalMin} * * * *`; // e.g. */15 * * * *
} else {
const hours = Math.floor(intervalMin / 60);
cronExpr = `0 */${hours} * * *`; // e.g. 0 */2 * * *
}
const job = new CronJobClass(cronExpr, () => {
this.dkvService.processInbox(tenant).catch((err) =>
this.logger.error(
+3 -1
View File
@@ -72,11 +72,13 @@ export class DkvConfigDto {
/**
* Polling interval in minutes. Minimum 5 minutes to prevent DoS via excessive polling
* (T-07-05, UI-SPEC minimum = 5).
* (T-07-05, UI-SPEC minimum = 5). Maximum 1440 (24 h) — values above 59 use the cron
* hours field (must be a factor of 24 for predictable hourly+ behaviour).
*/
@IsOptional()
@IsInt()
@Min(5)
@Max(1440)
pollIntervalMin?: number;
/**