get(RoutePermissionService::class); $permissionResourceResolver = $container->get(PermissionResourceResolver::class); register_rest_route( $routeNamespace, '/entry/(?P\d+)', [ 'methods' => WP_REST_Server::READABLE, 'callback' => $container->get(GetEntryController::class), 'permission_callback' => self::permissionForEntryForm( $permissionResourceResolver, static function (int $formId) use ($routePermissionService): bool { return $routePermissionService->canViewEntries($formId); } ), ] ); register_rest_route( $routeNamespace, '/entries/forms', [ 'methods' => WP_REST_Server::READABLE, 'callback' => $container->get(GetEntryFormsController::class), 'permission_callback' => static function () use ($routePermissionService) { return $routePermissionService->canViewEntries(); }, ] ); register_rest_route( $routeNamespace, '/entries/search', [ 'methods' => WP_REST_Server::READABLE, 'callback' => $container->get(SearchEntriesController::class), 'permission_callback' => static function () use ($routePermissionService) { return $routePermissionService->canViewEntries(); }, ] ); register_rest_route( $routeNamespace, '/entries/count', [ 'methods' => WP_REST_Server::READABLE, 'callback' => $container->get(GetEntryCountController::class), 'permission_callback' => static function () use ($routePermissionService) { return $routePermissionService->canViewEntries(); }, ] ); } /** * @throws DependencyException * @throws NotFoundException */ private static function registerEntryWriteRoutes(Container $container, string $routeNamespace): void { $routePermissionService = $container->get(RoutePermissionService::class); $permissionResourceResolver = $container->get(PermissionResourceResolver::class); register_rest_route( $routeNamespace, '/entries/delete', [ 'methods' => WP_REST_Server::CREATABLE, 'callback' => $container->get(DeleteEntriesController::class), 'permission_callback' => static function () use ($routePermissionService) { return $routePermissionService->canDeleteEntries(); }, ] ); register_rest_route( $routeNamespace, '/entry/delete/(?P\d+)', [ 'methods' => WP_REST_Server::CREATABLE, 'callback' => $container->get(DeleteEntryController::class), 'permission_callback' => self::permissionForEntryForm( $permissionResourceResolver, static function (int $formId) use ($routePermissionService): bool { return $routePermissionService->canDeleteEntries($formId); } ), ] ); register_rest_route( $routeNamespace, '/entry/update/starred/(?P\d+)', [ 'methods' => WP_REST_Server::CREATABLE, 'callback' => $container->get(UpdateEntryStarredController::class), 'permission_callback' => self::permissionForEntryForm( $permissionResourceResolver, static function (int $formId) use ($routePermissionService): bool { return $routePermissionService->canEditEntries($formId); } ), ] ); register_rest_route( $routeNamespace, '/entry/update/status/(?P\d+)', [ 'methods' => WP_REST_Server::CREATABLE, 'callback' => $container->get(UpdateEntryStatusController::class), 'permission_callback' => self::permissionForEntryForm( $permissionResourceResolver, static function (int $formId) use ($routePermissionService): bool { return $routePermissionService->canEditEntries($formId); } ), ] ); register_rest_route( $routeNamespace, '/entries/batch-actions', [ 'methods' => WP_REST_Server::CREATABLE, 'callback' => [$container->get(BulkUpdateEntryController::class), 'handle'], 'permission_callback' => static function () use ($routePermissionService) { return $routePermissionService->canEditEntries(); }, ] ); } /** * @param callable(int): bool $canAccessForm * @return callable */ private static function permissionForEntryForm( PermissionResourceResolver $permissionResourceResolver, callable $canAccessForm ): callable { return static function ($request) use ($permissionResourceResolver, $canAccessForm): bool { $entryId = RestRouteParamReader::getPositiveIntParam($request); if ($entryId === null) { return false; } $formId = $permissionResourceResolver->formIdFromEntryId($entryId); if ($formId === null) { return false; } return $canAccessForm($formId); }; } }