120 lines
4.1 KiB
PHP
120 lines
4.1 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
use Reservair\Logger\Logger;
|
||
|
|
|
||
|
|
|
||
|
|
class RsvFormDefinitionController {
|
||
|
|
use RsvPagedResponseTrait;
|
||
|
|
private string $namespace = 'reservations/v1';
|
||
|
|
private string $resource_name = 'form-definition';
|
||
|
|
|
||
|
|
private static function schema(): array {
|
||
|
|
return [
|
||
|
|
'type' => 'object',
|
||
|
|
'properties' => [
|
||
|
|
'form_id' => ['type' => 'integer', 'readonly' => true],
|
||
|
|
'name' => ['type' => 'string', 'required' => true, 'minLength' => 1],
|
||
|
|
'definition' => [
|
||
|
|
'type' => 'object',
|
||
|
|
'required' => false,
|
||
|
|
'properties' => [
|
||
|
|
'email_key' => ['type' => 'string', 'required' => false],
|
||
|
|
'elements' => ['type' => 'array', 'default' => []],
|
||
|
|
],
|
||
|
|
],
|
||
|
|
],
|
||
|
|
];
|
||
|
|
}
|
||
|
|
|
||
|
|
public function register_routes(): void {
|
||
|
|
register_rest_route($this->namespace, '/' . $this->resource_name, [
|
||
|
|
[
|
||
|
|
'methods' => 'GET',
|
||
|
|
'callback' => [$this, 'index'],
|
||
|
|
'permission_callback' => [RsvRestPolicy::class, 'admin'],
|
||
|
|
],
|
||
|
|
[
|
||
|
|
'methods' => 'POST',
|
||
|
|
'callback' => [$this, 'create'],
|
||
|
|
'permission_callback' => [RsvRestPolicy::class, 'admin'],
|
||
|
|
'args' => self::input_args(self::schema()),
|
||
|
|
],
|
||
|
|
]);
|
||
|
|
|
||
|
|
register_rest_route($this->namespace, '/' . $this->resource_name . '/(?P<id>\d+)', [
|
||
|
|
[
|
||
|
|
'methods' => 'GET',
|
||
|
|
'callback' => [$this, 'show'],
|
||
|
|
'permission_callback' => [RsvRestPolicy::class, 'admin'],
|
||
|
|
],
|
||
|
|
[
|
||
|
|
'methods' => 'PUT',
|
||
|
|
'callback' => [$this, 'update'],
|
||
|
|
'permission_callback' => [RsvRestPolicy::class, 'admin'],
|
||
|
|
'args' => self::input_args(self::schema()),
|
||
|
|
],
|
||
|
|
[
|
||
|
|
'methods' => 'DELETE',
|
||
|
|
'callback' => [$this, 'destroy'],
|
||
|
|
'permission_callback' => [RsvRestPolicy::class, 'admin'],
|
||
|
|
],
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
function index(WP_REST_Request $request): WP_REST_Response {
|
||
|
|
[$skip, $limit] = self::paging($request);
|
||
|
|
$repo = new RsvFormDefinitionRepository();
|
||
|
|
return $this->paged_response($repo->get_all($limit, $skip), $repo->count_all());
|
||
|
|
}
|
||
|
|
|
||
|
|
function show(WP_REST_Request $request): WP_REST_Response {
|
||
|
|
$row = (new RsvFormDefinitionRepository())->get((int) $request->get_param('id'));
|
||
|
|
|
||
|
|
if ($row === null) {
|
||
|
|
return new WP_REST_Response(['error' => 'Not found'], 404);
|
||
|
|
}
|
||
|
|
|
||
|
|
return new WP_REST_Response($row, 200);
|
||
|
|
}
|
||
|
|
|
||
|
|
function create(WP_REST_Request $request): WP_REST_Response {
|
||
|
|
try {
|
||
|
|
$id = (new RsvFormDefinitionRepository())->add(
|
||
|
|
$request->get_param('name'),
|
||
|
|
$request->get_param('definition') ?? []
|
||
|
|
);
|
||
|
|
} catch(Throwable $e) {
|
||
|
|
Logger::error($e);
|
||
|
|
return new WP_REST_Response(['error' => 'An error occurred.'], 500);
|
||
|
|
}
|
||
|
|
|
||
|
|
return new WP_REST_Response(['id' => $id], 201);
|
||
|
|
}
|
||
|
|
|
||
|
|
function destroy(WP_REST_Request $request): WP_REST_Response {
|
||
|
|
$id = (int) $request->get_param('id');
|
||
|
|
$repo = new RsvFormDefinitionRepository();
|
||
|
|
|
||
|
|
if ($repo->get($id) === null) {
|
||
|
|
return new WP_REST_Response(['error' => 'Not found'], 404);
|
||
|
|
}
|
||
|
|
|
||
|
|
$repo->delete($id);
|
||
|
|
|
||
|
|
return new WP_REST_Response(null, 204);
|
||
|
|
}
|
||
|
|
|
||
|
|
function update(WP_REST_Request $request): WP_REST_Response {
|
||
|
|
$id = (int) $request->get_param('id');
|
||
|
|
$repo = new RsvFormDefinitionRepository();
|
||
|
|
|
||
|
|
if ($repo->get($id) === null) {
|
||
|
|
return new WP_REST_Response(['error' => 'Not found'], 404);
|
||
|
|
}
|
||
|
|
|
||
|
|
$repo->update($id, $request->get_param('name'), $request->get_param('definition'));
|
||
|
|
|
||
|
|
return new WP_REST_Response(null, 204);
|
||
|
|
}
|
||
|
|
}
|