/** * Create a new scheduled task for a given server. * @param int $id * @param array $data * * @throws DisplayException * @throws DisplayValidationException * @return void */ public function create($id, $data) { $server = Models\Server::findOrFail($id); $validator = Validator::make($data, ['action' => 'string|required', 'data' => 'string|required', 'year' => 'string|sometimes', 'day_of_week' => 'string|sometimes', 'month' => 'string|sometimes', 'day_of_month' => 'string|sometimes', 'hour' => 'string|sometimes', 'minute' => 'string|sometimes']); if ($validator->fails()) { throw new DisplayValidationException(json_encode($validator->errors())); } if (!in_array($data['action'], $this->actions)) { throw new DisplayException('The action provided is not valid.'); } $cron = $this->defaults; foreach ($this->defaults as $setting => $value) { if (array_key_exists($setting, $data) && !is_null($data[$setting]) && $data[$setting] !== '') { $cron[$setting] = $data[$setting]; } } // Check that is this a valid Cron Entry try { $buildCron = Cron::factory(sprintf('%s %s %s %s %s %s', $cron['minute'], $cron['hour'], $cron['day_of_month'], $cron['month'], $cron['day_of_week'], $cron['year'])); } catch (\Exception $ex) { throw $ex; } $task = new Models\Task(); $task->fill(['server' => $server->id, 'active' => 1, 'action' => $data['action'], 'data' => $data['data'], 'queued' => 0, 'year' => $cron['year'], 'day_of_week' => $cron['day_of_week'], 'month' => $cron['month'], 'day_of_month' => $cron['day_of_month'], 'hour' => $cron['hour'], 'minute' => $cron['minute'], 'last_run' => null, 'next_run' => $buildCron->getNextRunDate()]); return $task->save(); }