Add base support for editing an existing task

This commit is contained in:
Dane Everitt 2020-03-18 22:28:32 -07:00
parent edb9657e2b
commit ef38a51d6d
No known key found for this signature in database
GPG key ID: EEA66103B3D71F53
8 changed files with 266 additions and 27 deletions

View file

@ -10,9 +10,11 @@ use Illuminate\Http\JsonResponse;
use Pterodactyl\Models\Permission;
use Pterodactyl\Repositories\Eloquent\TaskRepository;
use Pterodactyl\Exceptions\Http\HttpForbiddenException;
use Pterodactyl\Transformers\Api\Client\TaskTransformer;
use Pterodactyl\Http\Requests\Api\Client\ClientApiRequest;
use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Pterodactyl\Http\Requests\Api\Client\Servers\Schedules\StoreTaskRequest;
class ScheduleTaskController extends ClientApiController
{
@ -33,6 +35,67 @@ class ScheduleTaskController extends ClientApiController
$this->repository = $repository;
}
/**
* Create a new task for a given schedule and store it in the database.
*
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Schedules\StoreTaskRequest $request
* @param \Pterodactyl\Models\Server $server
* @param \Pterodactyl\Models\Schedule $schedule
* @return array
*
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
*/
public function store(StoreTaskRequest $request, Server $server, Schedule $schedule)
{
if ($schedule->server_id !== $server->id) {
throw new NotFoundHttpException;
}
$lastTask = $schedule->tasks->last();
/** @var \Pterodactyl\Models\Task $task */
$task = $this->repository->create([
'schedule_id' => $schedule->id,
'sequence_id' => ($lastTask->sequence_id ?? 0) + 1,
'action' => $request->input('action'),
'payload' => $request->input('payload'),
'time_offset' => $request->input('time_offset'),
]);
return $this->fractal->item($task)
->transformWith($this->getTransformer(TaskTransformer::class))
->toArray();
}
/**
* Updates a given task for a server.
*
* @param \Pterodactyl\Http\Requests\Api\Client\Servers\Schedules\StoreTaskRequest $request
* @param \Pterodactyl\Models\Server $server
* @param \Pterodactyl\Models\Schedule $schedule
* @param \Pterodactyl\Models\Task $task
* @return array
*
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
*/
public function update(StoreTaskRequest $request, Server $server, Schedule $schedule, Task $task)
{
if ($schedule->id !== $task->schedule_id || $server->id !== $schedule->server_id) {
throw new NotFoundHttpException;
}
$this->repository->update($task->id, [
'action' => $request->input('action'),
'payload' => $request->input('payload'),
'time_offset' => $request->input('time_offset'),
]);
return $this->fractal->item($task->refresh())
->transformWith($this->getTransformer(TaskTransformer::class))
->toArray();
}
/**
* Determines if a user can delete the task for a given server.
*

View file

@ -0,0 +1,34 @@
<?php
namespace Pterodactyl\Http\Requests\Api\Client\Servers\Schedules;
use Pterodactyl\Models\Permission;
use Pterodactyl\Http\Requests\Api\Client\ClientApiRequest;
class StoreTaskRequest extends ClientApiRequest
{
/**
* Determine if the user is allowed to create a new task for this schedule. We simply
* check if they can modify a schedule to determine if they're able to do this. There
* are no task specific permissions.
*
* @return string
*/
public function permission()
{
return Permission::ACTION_SCHEDULE_UPDATE;
}
/**
* @return array
*/
public function rules(): array
{
return [
'action' => 'required|in:command,power',
'payload' => 'required|string',
'time_offset' => 'required|numeric|min:0|max:900',
'sequence_id' => 'sometimes|required|numeric|min:1',
];
}
}