Skip to content

Commit d4d9eda

Browse files
committed
Add schedule edit support
1 parent f42bc8a commit d4d9eda

File tree

5 files changed

+128
-5
lines changed

5 files changed

+128
-5
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ This project follows [Semantic Versioning](http://semver.org) guidelines.
1515
### Changed
1616
* Changed logger to skip reporting stack-traces on PDO exceptions due to sensitive information being contained within.
1717

18+
### Added
19+
* Added support for editing an existing schedule.
20+
1821
## v0.7.0-rc.1 (Derelict Dermodactylus)
1922
### Fixed
2023
* `[beta.4]` — Fixes some bad search and replace action that happened previously and was throwing errors when validating user permissions.

app/Http/Controllers/Server/Tasks/TaskManagementController.php

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Pterodactyl\Http\Controllers\Controller;
1111
use Pterodactyl\Contracts\Extensions\HashidsInterface;
1212
use Pterodactyl\Traits\Controllers\JavascriptInjection;
13+
use Pterodactyl\Services\Schedules\ScheduleUpdateService;
1314
use Pterodactyl\Services\Schedules\ScheduleCreationService;
1415
use Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface;
1516
use Pterodactyl\Http\Requests\Server\ScheduleCreationFormRequest;
@@ -38,24 +39,32 @@ class TaskManagementController extends Controller
3839
*/
3940
protected $repository;
4041

42+
/**
43+
* @var \Pterodactyl\Services\Schedules\ScheduleUpdateService
44+
*/
45+
private $updateService;
46+
4147
/**
4248
* TaskManagementController constructor.
4349
*
4450
* @param \Prologue\Alerts\AlertsMessageBag $alert
4551
* @param \Pterodactyl\Contracts\Extensions\HashidsInterface $hashids
4652
* @param \Pterodactyl\Services\Schedules\ScheduleCreationService $creationService
53+
* @param \Pterodactyl\Services\Schedules\ScheduleUpdateService $updateService
4754
* @param \Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface $repository
4855
*/
4956
public function __construct(
5057
AlertsMessageBag $alert,
5158
HashidsInterface $hashids,
5259
ScheduleCreationService $creationService,
60+
ScheduleUpdateService $updateService,
5361
ScheduleRepositoryInterface $repository
5462
) {
5563
$this->alert = $alert;
5664
$this->creationService = $creationService;
5765
$this->hashids = $hashids;
5866
$this->repository = $repository;
67+
$this->updateService = $updateService;
5968
}
6069

6170
/**
@@ -112,7 +121,7 @@ public function store(ScheduleCreationFormRequest $request): RedirectResponse
112121
$server = $request->attributes->get('server');
113122

114123
$schedule = $this->creationService->handle($server, $request->normalize(), $request->getTasks());
115-
$this->alert->success(trans('server.schedule.task_created'))->flash();
124+
$this->alert->success(trans('server.schedule.schedule_created'))->flash();
116125

117126
return redirect()->route('server.schedules.view', [
118127
'server' => $server->uuidShort,
@@ -149,15 +158,18 @@ public function view(Request $request): View
149158
*
150159
* @param \Pterodactyl\Http\Requests\Server\ScheduleCreationFormRequest $request
151160
* @return \Illuminate\Http\RedirectResponse
161+
*
162+
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
163+
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
164+
* @throws \Pterodactyl\Exceptions\Service\Schedule\Task\TaskIntervalTooLongException
152165
*/
153166
public function update(ScheduleCreationFormRequest $request): RedirectResponse
154167
{
155168
$server = $request->attributes->get('server');
156169
$schedule = $request->attributes->get('schedule');
157170

158-
$this->alert->warning('Function is not implemented.')->flash();
159-
// $this->updateService->handle($task, $request->normalize(), $request->getChainedTasks());
160-
// $this->alert->success(trans('server.schedules.task_updated'))->flash();
171+
$this->updateService->handle($schedule, $request->normalize(), $request->getTasks());
172+
$this->alert->success(trans('server.schedule.schedule_updated'))->flash();
161173

162174
return redirect()->route('server.schedules.view', [
163175
'server' => $server->uuidShort,
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?php
2+
3+
namespace Pterodactyl\Services\Schedules;
4+
5+
use Cron\CronExpression;
6+
use Pterodactyl\Models\Schedule;
7+
use Illuminate\Database\ConnectionInterface;
8+
use Pterodactyl\Contracts\Repository\TaskRepositoryInterface;
9+
use Pterodactyl\Services\Schedules\Tasks\TaskCreationService;
10+
use Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface;
11+
12+
class ScheduleUpdateService
13+
{
14+
/**
15+
* @var \Illuminate\Database\ConnectionInterface
16+
*/
17+
private $connection;
18+
/**
19+
* @var \Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface
20+
*/
21+
private $repository;
22+
/**
23+
* @var \Pterodactyl\Contracts\Repository\TaskRepositoryInterface
24+
*/
25+
private $taskRepository;
26+
/**
27+
* @var \Pterodactyl\Services\Schedules\Tasks\TaskCreationService
28+
*/
29+
private $taskCreationService;
30+
31+
/**
32+
* ScheduleUpdateService constructor.
33+
*
34+
* @param \Illuminate\Database\ConnectionInterface $connection
35+
* @param \Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface $repository
36+
* @param \Pterodactyl\Services\Schedules\Tasks\TaskCreationService $taskCreationService
37+
* @param \Pterodactyl\Contracts\Repository\TaskRepositoryInterface $taskRepository
38+
*/
39+
public function __construct(
40+
ConnectionInterface $connection,
41+
ScheduleRepositoryInterface $repository,
42+
TaskCreationService $taskCreationService,
43+
TaskRepositoryInterface $taskRepository
44+
) {
45+
$this->connection = $connection;
46+
$this->repository = $repository;
47+
$this->taskCreationService = $taskCreationService;
48+
$this->taskRepository = $taskRepository;
49+
}
50+
51+
/**
52+
* Update an existing schedule by deleting all current tasks and re-inserting the
53+
* new values.
54+
*
55+
* @param \Pterodactyl\Models\Schedule $schedule
56+
* @param array $data
57+
* @param array $tasks
58+
* @return \Pterodactyl\Models\Schedule
59+
*
60+
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
61+
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
62+
* @throws \Pterodactyl\Exceptions\Service\Schedule\Task\TaskIntervalTooLongException
63+
*/
64+
public function handle(Schedule $schedule, array $data, array $tasks): Schedule
65+
{
66+
$data = array_merge($data, [
67+
'next_run_at' => $this->getCronTimestamp($data),
68+
]);
69+
70+
$this->connection->beginTransaction();
71+
72+
$schedule = $this->repository->update($schedule->id, $data);
73+
$this->taskRepository->deleteWhere([['schedule_id', '=', $schedule->id]]);
74+
75+
foreach ($tasks as $index => $task) {
76+
$this->taskCreationService->handle($schedule, [
77+
'time_interval' => array_get($task, 'time_interval'),
78+
'time_value' => array_get($task, 'time_value'),
79+
'sequence_id' => $index + 1,
80+
'action' => array_get($task, 'action'),
81+
'payload' => array_get($task, 'payload'),
82+
], false);
83+
}
84+
85+
$this->connection->commit();
86+
87+
return $schedule;
88+
}
89+
90+
/**
91+
* Return a DateTime object after parsing the cron data provided.
92+
*
93+
* @param array $data
94+
* @return \DateTime
95+
*/
96+
private function getCronTimestamp(array $data)
97+
{
98+
$formattedCron = sprintf('%s %s %s * %s *',
99+
array_get($data, 'cron_minute', '*'),
100+
array_get($data, 'cron_hour', '*'),
101+
array_get($data, 'cron_day_of_month', '*'),
102+
array_get($data, 'cron_day_of_week', '*')
103+
);
104+
105+
return CronExpression::factory($formattedCron)->getNextRunDate();
106+
}
107+
}

app/Services/Schedules/Tasks/TaskCreationService.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public function handle($schedule, array $data, $returnModel = true)
6363
'action' => $data['action'],
6464
'payload' => $data['payload'],
6565
'time_offset' => $delay,
66-
]);
66+
], false);
6767

6868
return $task;
6969
}

resources/lang/en/server.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
'toggle' => 'Toggle Status',
3434
'run_now' => 'Trigger Schedule',
3535
'schedule_created' => 'Successfully created a new schedule for this server.',
36+
'schedule_updated' => 'Schedule has been updated.',
3637
'unnamed' => 'Unnamed Schedule',
3738
'setup' => 'Schedule Setup',
3839
'day_of_week' => 'Day of Week',

0 commit comments

Comments
 (0)