mirror of
https://github.com/Studio-Saelix/sencho.git
synced 2026-08-07 09:24:09 +00:00
db8bb70b7d
* fix(scheduler): reject 6-field cron in Scheduled Operations Create and edit validation parsed cron with cron-parser, which accepts both 5- and 6-field expressions, while the form, presets, and docs all describe a 5-field cron. Because the scheduler ticks once per minute, a leading seconds field can never improve precision, so a 6-field expression was silently accepted but never honored on its stated schedule. Add a field-count guard on both sides: the API rejects 6-field input at create and edit with a clear message, and the form surfaces the same error inline and disables save. Cron nicknames such as @daily still pass. Document the five-field requirement in the cron reference. * chore: merge main into scheduled cron validation * fix: avoid logging policy bypass actor in debug output
29 lines
899 B
TypeScript
29 lines
899 B
TypeScript
import cronstrue from 'cronstrue';
|
|
|
|
export function getCronDescription(expression: string): string {
|
|
try {
|
|
return cronstrue.toString(expression);
|
|
} catch {
|
|
return 'Invalid expression';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Reject cron expressions with a leading seconds field (6 or more fields). The
|
|
* scheduler is minute-granular, so the seconds field could never be honored.
|
|
* Nicknames like `@daily` (one token) pass. Returns an error message or null
|
|
* when the field count is acceptable.
|
|
*/
|
|
export function getCronFieldError(expression: string): string | null {
|
|
const trimmed = expression.trim();
|
|
if (trimmed && trimmed.split(/\s+/).length >= 6) {
|
|
return 'Use 5 fields (minute hour day month weekday). The seconds field is not supported.';
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export function formatTimestamp(ts: number | null): string {
|
|
if (ts == null) return '-';
|
|
return new Date(ts).toLocaleString();
|
|
}
|