404 ) ); } return current_user_can( 'edit_post', $post_id ) && waysill_user_can_see_results(); } /** * GET /results/{id}: the stored result of a post, or null. * * @param WP_REST_Request $request Request. * @return WP_REST_Response */ function waysill_rest_get_result( $request ) { return rest_ensure_response( array( 'result' => waysill_get_result( (int) $request['id'] ) ) ); } /** * POST /results/{id}: validates and stores the result the editor's browser built. * * @param WP_REST_Request $request Request with the JSON body `{ "result": PageResult }`. * @return WP_REST_Response|WP_Error */ function waysill_rest_save_result( $request ) { if ( strlen( $request->get_body() ) > WAYSILL_MAX_BODY ) { return new WP_Error( 'waysill_too_large', __( 'The result is too large to store.', 'waysill' ), array( 'status' => 413 ) ); } $result = waysill_sanitize_result( $request->get_param( 'result' ) ); if ( null === $result ) { return new WP_Error( 'waysill_bad_result', __( 'The check result is not valid.', 'waysill' ), array( 'status' => 400 ) ); } $post_id = (int) $request['id']; waysill_save_result( $post_id, $result ); return rest_ensure_response( array( 'result' => $result ) ); } /** * POST /preferences: the current user's own check on save choice. * * @param WP_REST_Request $request Request with the JSON body `{ "checkOnSave": bool }`. * @return WP_REST_Response */ function waysill_rest_save_preferences( $request ) { $user_id = get_current_user_id(); update_user_meta( $user_id, 'waysill_check_on_save', $request->get_param( 'checkOnSave' ) ? '1' : '0' ); return rest_ensure_response( array( 'checkOnSave' => waysill_user_check_on_save( $user_id ) ) ); } /** Registers the routes. */ function waysill_register_rest_routes(): void { $id = array( 'type' => 'integer', 'minimum' => 1, 'required' => true, ); register_rest_route( 'waysill/v1', '/results/(?P\d+)', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => 'waysill_rest_get_result', 'permission_callback' => 'waysill_rest_can_use_post', 'args' => array( 'id' => $id ), ), array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => 'waysill_rest_save_result', 'permission_callback' => 'waysill_rest_can_use_post', 'args' => array( 'id' => $id, 'result' => array( 'type' => 'object', 'required' => true, ), ), ), ) ); register_rest_route( 'waysill/v1', '/preferences', array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => 'waysill_rest_save_preferences', 'permission_callback' => static function () { return current_user_can( 'edit_posts' ) && waysill_user_can_see_results(); }, 'args' => array( 'checkOnSave' => array( 'type' => 'boolean', 'required' => true, ), ), ) ); } add_action( 'rest_api_init', 'waysill_register_rest_routes' );