'object', 'properties' => [ 'id' => ['type' => 'integer', 'readonly' => true], 'name' => ['type' => 'string', 'required' => true, 'minLength' => 1], 'active' => ['type' => 'boolean', 'default' => true], ], ]; } 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\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, 'delete'], 'permission_callback' => [RsvRestPolicy::class, 'admin'], ], ]); register_rest_route($this->namespace, '/' . $this->resource_name . '/(?P\d+)/keys', [ [ 'methods' => 'GET', 'callback' => [$this, 'index_keys'], 'permission_callback' => [RsvRestPolicy::class, 'admin'], ], [ 'methods' => 'POST', 'callback' => [$this, 'add_key'], 'permission_callback' => [RsvRestPolicy::class, 'admin'], ], ]); register_rest_route($this->namespace, '/' . $this->resource_name . '/(?P\d+)/keys/(?P\d+)', [ [ 'methods' => 'DELETE', 'callback' => [$this, 'delete_key'], 'permission_callback' => [RsvRestPolicy::class, 'admin'], ], ]); } public function index(WP_REST_Request $request): WP_REST_Response { [$skip, $limit] = self::paging($request); $repo = new RsvMembershipProgramRepository(); $programs = array_map(fn($p) => $p->to_array(), $repo->all($limit, $skip)); return $this->paged_response($programs, $repo->count_all()); } public function create(WP_REST_Request $request): WP_REST_Response { $params = $request->get_json_params(); $name = $params['name'] ?? ''; $active = $params['active'] ?? true; if (trim($name) === '') { throw new InvalidArgumentException('Name is required.'); } $repo = new RsvMembershipProgramRepository(); $id = $repo->add($name, $active); return new WP_REST_Response(RsvMembershipProgram::from_array(['id' => $id, 'name' => $name, 'active' => $active])->to_array(), 201); } public function show(WP_REST_Request $request): WP_REST_Response { $id = (int) $request->get_param('id'); $repo = new RsvMembershipProgramRepository(); $program = $repo->get($id); if ($program === null) { return new WP_REST_Response(['error' => 'Not found'], 404); } return new WP_REST_Response($program, 200); } public function update(WP_REST_Request $request): WP_REST_Response { $id = (int) $request->get_param('id'); $params = $request->get_json_params(); $name = $params['name'] ?? ''; $active = $params['active'] ?? true; if (trim($name) === '') { throw new InvalidArgumentException('Name is required.'); } $repo = new RsvMembershipProgramRepository(); if ($repo->get($id) === null) { return new WP_REST_Response(['error' => 'Not found'], 404); } $repo->update($id, $name, $active); return new WP_REST_Response(['id' => $id, 'name' => $name, 'active' => $active], 200); } public function delete(WP_REST_Request $request): WP_REST_Response { $id = (int) $request->get_param('id'); $repo = new RsvMembershipProgramRepository(); if ($repo->get($id) === null) { return new WP_REST_Response(['error' => 'Not found'], 404); } $repo->delete($id); return new WP_REST_Response(['ok' => true], 200); } public function index_keys(WP_REST_Request $request): WP_REST_Response { [$skip, $limit] = self::paging($request); $program_id = (int) $request->get_param('id'); $repo = new RsvMembershipProgramRepository(); if ($repo->get($program_id) === null) { return new WP_REST_Response(['error' => 'Program not found'], 404); } $keys = array_map(fn($k) => $k->to_array(), $repo->keys($program_id, $limit, $skip)); return $this->paged_response($keys, $repo->count_keys($program_id)); } public function add_key(WP_REST_Request $request): WP_REST_Response { $program_id = (int) $request->get_param('id'); $params = $request->get_json_params(); $key_value = $params['key_value'] ?? ''; if (trim($key_value) === '') { throw new InvalidArgumentException('Key value is required.'); } $repo = new RsvMembershipProgramRepository(); if ($repo->get($program_id) === null) { return new WP_REST_Response(['error' => 'Program not found'], 404); } $key_id = $repo->add_key($program_id, $key_value); return new WP_REST_Response(['id' => $key_id, 'program_id' => $program_id, 'key_value' => $key_value], 201); } public function delete_key(WP_REST_Request $request): WP_REST_Response { $program_id = (int) $request->get_param('id'); $key_id = (int) $request->get_param('key_id'); $repo = new RsvMembershipProgramRepository(); if ($repo->get($program_id) === null) { return new WP_REST_Response(['error' => 'Program not found'], 404); } $repo->delete_key($key_id); return new WP_REST_Response(['ok' => true], 200); } }