( params: PerformCreateJobParams )
| 127 | } |
| 128 | |
| 129 | export async function performCreateJob( |
| 130 | params: PerformCreateJobParams |
| 131 | ): Promise<PerformScheduleResult> { |
| 132 | if (!params.prompt.trim()) { |
| 133 | return { success: false, error: 'prompt is required', errorCode: 'validation' } |
| 134 | } |
| 135 | |
| 136 | const cronExpression = params.cronExpression || null |
| 137 | if (!cronExpression && !params.time) { |
| 138 | return { |
| 139 | success: false, |
| 140 | error: 'At least one of cronExpression or time must be provided', |
| 141 | errorCode: 'validation', |
| 142 | } |
| 143 | } |
| 144 | |
| 145 | let endsAt: Date | null = null |
| 146 | if (params.endsAt) { |
| 147 | const parsedEndsAt = new Date(params.endsAt) |
| 148 | if (Number.isNaN(parsedEndsAt.getTime())) { |
| 149 | return { |
| 150 | success: false, |
| 151 | error: `Invalid endsAt value: ${params.endsAt}`, |
| 152 | errorCode: 'validation', |
| 153 | } |
| 154 | } |
| 155 | endsAt = parsedEndsAt |
| 156 | } |
| 157 | |
| 158 | let nextRunAt: Date | null = null |
| 159 | if (cronExpression) { |
| 160 | const validation = validateCronExpression(cronExpression, params.timezone) |
| 161 | if (!validation.isValid) { |
| 162 | return { |
| 163 | success: false, |
| 164 | error: validation.error || 'Invalid cron expression', |
| 165 | errorCode: 'validation', |
| 166 | } |
| 167 | } |
| 168 | nextRunAt = computeNextRunAt({ cronExpression, timezone: params.timezone, endsAt }) |
| 169 | } |
| 170 | |
| 171 | if (params.time) { |
| 172 | const parsed = parseOneTimeRun(params.time, params.timezone) |
| 173 | if (!parsed) { |
| 174 | return { |
| 175 | success: false, |
| 176 | error: `Invalid time value: ${params.time}`, |
| 177 | errorCode: 'validation', |
| 178 | } |
| 179 | } |
| 180 | if (!cronExpression || parsed > new Date()) nextRunAt = parsed |
| 181 | } |
| 182 | |
| 183 | if (params.startDate) { |
| 184 | const start = new Date(params.startDate) |
| 185 | if (start > new Date()) nextRunAt = start |
| 186 | } |
no test coverage detected