'GET', 'callback' => array(Abency_Content::class, 'list_post_types'), 'permission_callback' => $auth, )); // Contingut. register_rest_route(ABENCY_CONNECTOR_REST_NS, '/posts', array( array('methods' => 'GET', 'callback' => array(Abency_Content::class, 'list_posts'), 'permission_callback' => $auth), array('methods' => 'POST', 'callback' => array(Abency_Content::class, 'create_post'), 'permission_callback' => $auth), )); register_rest_route(ABENCY_CONNECTOR_REST_NS, '/posts/(?P\d+)', array( array('methods' => 'GET', 'callback' => array(Abency_Content::class, 'get_post'), 'permission_callback' => $auth), array('methods' => 'POST', 'callback' => array(Abency_Content::class, 'update_post'), 'permission_callback' => $auth), )); register_rest_route(ABENCY_CONNECTOR_REST_NS, '/terms', array( 'methods' => 'GET', 'callback' => array(Abency_Content::class, 'list_terms'), 'permission_callback' => $auth, )); // Propostes de canvi sobre contingut publicat. register_rest_route(ABENCY_CONNECTOR_REST_NS, '/proposals', array( 'methods' => 'POST', 'callback' => array($this, 'receive_proposal'), 'permission_callback' => $auth, )); } /** * Verifica la capçalera X-Abency-Token contra el token del pairing. */ public function authorize(WP_REST_Request $request) { $stored = Abency_Settings::get(Abency_Settings::OPT_PLUGIN_TOKEN); if (empty($stored)) { return new WP_Error('abency_unpaired', 'El plugin no està vinculat.', array('status' => 401)); } $token = (string) $request->get_header('x_abency_token'); if ($token === '') { return new WP_Error('abency_no_token', 'Falta la capçalera X-Abency-Token.', array('status' => 401)); } if (! hash_equals($stored, $token)) { return new WP_Error('abency_bad_token', 'Token invàlid.', array('status' => 403)); } return true; } /** * Desa una proposta entrant (sense tocar el contingut viu). Retorna remote_ref. */ public function receive_proposal(WP_REST_Request $request) { $params = $request->get_json_params(); if (empty($params['proposal_id']) || empty($params['wp_post_id']) || empty($params['fields'])) { return new WP_REST_Response(array('message' => 'Falten camps obligatoris (proposal_id, wp_post_id, fields).'), 422); } $post = Abency_Content::checked_post($params['wp_post_id'], $params['post_type'] ?? 'posts'); if (is_wp_error($post)) { return $post; } if ('publish' !== $post->post_status) { return new WP_Error('abency_invalid_status', 'Les propostes només admeten contingut publicat.', array('status' => 409)); } $local_id = Abency_Proposals::store(array( 'proposal_id' => (int) $params['proposal_id'], 'wp_post_id' => (int) $params['wp_post_id'], 'post_type' => Abency_Content::external_type($post->post_type), 'fields' => (array) $params['fields'], 'base_snapshot' => isset($params['base_snapshot']) ? (array) $params['base_snapshot'] : null, 'callback_url' => isset($params['callback_url']) ? $params['callback_url'] : null, )); return new WP_REST_Response(array('remote_ref' => (string) $local_id), 201); } }