'count' => count( $results ),
'queue' => $results,
)
);
}
function ebp_quote_bridge_request_ids( WP_REST_Request $request ) {
$form_id = absint( $request->get_param( 'form_id' ) );
$submission_id = absint( $request->get_param( 'submission_id' ) );
if ( ! ebp_quote_bridge_is_supported_form( $form_id ) ) {
return new WP_Error( 'unsupported_form', 'Unsupported form ID.', array( 'status' => 400 ) );
}
if ( ! $submission_id ) {
return new WP_Error( 'invalid_submission', 'Invalid submission ID.', array( 'status' => 400 ) );
}
return array( $form_id, $submission_id );
}
function ebp_quote_bridge_claim( WP_REST_Request $request ) {
$ids = ebp_quote_bridge_request_ids( $request );
if ( is_wp_error( $ids ) ) { return $ids; }
list( $form_id, $submission_id ) = $ids;
if ( ebp_quote_bridge_get_export_record( $form_id, $submission_id ) ) {
return new WP_Error( 'already_exported', 'Submission is already exported.', array( 'status' => 409 ) );
}
$claim_name = ebp_quote_bridge_claim_option_name( $form_id, $submission_id );
$existing = ebp_quote_bridge_get_active_claim( $form_id, $submission_id );
if ( is_array( $existing ) ) {
return new WP_Error( 'already_claimed', 'Submission is already claimed by another bridge session.', array( 'status' => 409 ) );
}
$token = wp_generate_password( 40, false, false );
$user = wp_get_current_user();
$record = array(
'token' => $token,
'created' => time(),
'user_id' => get_current_user_id(),
'user' => $user ? $user->user_login : '',
);
if ( ! add_option( $claim_name, $record, '', false ) ) {
return new WP_Error( 'claim_conflict', 'Unable to claim submission because another request claimed it first.', array( 'status' => 409 ) );
}
return rest_ensure_response(
array(
'ok' => true,
'token' => $token,
'message' => 'Submission claimed.',
)
);
}
function ebp_quote_bridge_complete( WP_REST_Request $request ) {
$ids = ebp_quote_bridge_request_ids( $request );
if ( is_wp_error( $ids ) ) { return $ids; }
list( $form_id, $submission_id ) = $ids;
$token = (string) $request->get_param( 'token' );
$evo_quote = absint( $request->get_param( 'evo_quote' ) );
$evo_customer = sanitize_text_field( (string) $request->get_param( 'evo_customer' ) );
if ( $token === '' || ! $evo_quote || $evo_customer === '' ) {
return new WP_Error( 'invalid_complete', 'Token, EVO quote number, and EVO customer are required.', array( 'status' => 400 ) );
}
$claim_name = ebp_quote_bridge_claim_option_name( $form_id, $submission_id );
$claim = ebp_quote_bridge_get_active_claim( $form_id, $submission_id );
if ( ! is_array( $claim ) || ! isset( $claim['token'] ) || ! hash_equals( (string) $claim['token'], $token ) ) {
return new WP_Error( 'claim_mismatch', 'The claim token is missing, expired, or does not match.', array( 'status' => 409 ) );
}
$user = wp_get_current_user();
$record = array(
'evo_quote' => $evo_quote,
'evo_customer' => $evo_customer,
'exported_at' => current_time( 'mysql' ),
'exported_by' => $user ? $user->user_login : '',
);
update_option( ebp_quote_bridge_export_option_name( $form_id, $submission_id ), $record, false );
delete_option( $claim_name );
return rest_ensure_response(
array(
'ok' => true,
'message' => 'Submission marked exported.',
)
);
}
function ebp_quote_bridge_release( WP_REST_Request $request ) {
$ids = ebp_quote_bridge_request_ids( $request );
if ( is_wp_error( $ids ) ) { return $ids; }
list( $form_id, $submission_id ) = $ids;
$token = (string) $request->get_param( 'token' );
$claim_name = ebp_quote_bridge_claim_option_name( $form_id, $submission_id );
$claim = ebp_quote_bridge_get_active_claim( $form_id, $submission_id );
if ( ! is_array( $claim ) ) {
return rest_ensure_response( array( 'ok' => true, 'message' => 'No active claim remained.' ) );
}
if ( ! isset( $claim['token'] ) || ! hash_equals( (string) $claim['token'], $token ) ) {
return new WP_Error( 'claim_mismatch', 'The claim token does not match.', array( 'status' => 409 ) );
}
delete_option( $claim_name );
return rest_ensure_response( array( 'ok' => true, 'message' => 'Claim released.' ) );
}
leather| Ed Brown Products