Files
wp-cycling-stats/includes/admin/pages/routes.php
T
2026-02-12 22:34:54 +01:00

182 lines
5.1 KiB
PHP

<?php
/**
* REST API routes for the plugin.
*
* @package WordPress Activity Stats
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/**
* Register REST API routes.
*/
function statpress_register_rest_routes() {
$namespace = 'statpress/v1';
// Route for getting a collection of activities
register_rest_route(
$namespace,
'/activities',
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'statpress_get_activities_api',
'permission_callback' => 'statpress_api_permissions_check',
'args' => array(
'page' => array(
'validate_callback' => 'is_numeric',
),
'per_page' => array(
'validate_callback' => 'is_numeric',
),
),
),
array(
'methods' => WP_REST_Server::CREATABLE,
'callback' => 'statpress_create_activity_api',
'permission_callback' => 'statpress_api_permissions_check',
),
)
);
// Route for a single activity
register_rest_route(
$namespace,
'/activities/(?P<id>[\d]+)',
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'statpress_get_activity_api',
'permission_callback' => 'statpress_api_permissions_check',
),
array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => 'statpress_update_activity_api',
'permission_callback' => 'statpress_api_permissions_check',
),
array(
'methods' => WP_REST_Server::DELETABLE,
'callback' => 'statpress_delete_activity_api',
'permission_callback' => 'statpress_api_permissions_check',
),
)
);
}
/**
* Permission check for API endpoints.
*
* @return bool
*/
function statpress_api_permissions_check() {
return current_user_can( 'manage_options' );
}
/**
* Get a collection of activities.
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response|WP_Error
*/
function statpress_get_activities_api( WP_REST_Request $request ) {
global $wpdb;
$table_activities = $wpdb->prefix . 'statpress_activities';
$per_page = $request->get_param( 'per_page' ) ? (int) $request->get_param( 'per_page' ) : 20;
$page = $request->get_param( 'page' ) ? (int) $request->get_param( 'page' ) : 1;
$offset = ( $page - 1 ) * $per_page;
$sql = $wpdb->prepare(
"SELECT a.*, c.name as category_name, et.name as event_type_name, eq.name as equipment_name
FROM $table_activities a
LEFT JOIN {$wpdb->prefix}statpress_categories c ON a.category_id = c.id
LEFT JOIN {$wpdb->prefix}statpress_event_types et ON a.event_type_id = et.id
LEFT JOIN {$wpdb->prefix}statpress_equipment eq ON a.equipment_id = eq.id
ORDER BY a.date DESC, a.id DESC
LIMIT %d OFFSET %d",
$per_page,
$offset
);
$results = $wpdb->get_results( $sql );
return new WP_REST_Response( $results, 200 );
}
/**
* Get a single activity.
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response|WP_Error
*/
function statpress_get_activity_api( WP_REST_Request $request ) {
global $wpdb;
$id = (int) $request['id'];
$sql = $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}statpress_activities WHERE id = %d", $id );
$activity = $wpdb->get_row( $sql );
if ( ! $activity ) {
return new WP_Error( 'not_found', 'Activity not found', array( 'status' => 404 ) );
}
return new WP_REST_Response( $activity, 200 );
}
/**
* Create a new activity.
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response|WP_Error
*/
function statpress_create_activity_api( WP_REST_Request $request ) {
$params = $request->get_json_params();
$activity_id = statpress_save_activity_data( $params );
if ( ! $activity_id ) {
return new WP_Error( 'cant-create', 'Error creating activity', array( 'status' => 500 ) );
}
$response = statpress_get_activity_api( new WP_REST_Request( 'GET', "/statpress/v1/activities/{$activity_id}" ) );
$response->set_status( 201 ); // 201 Created
return $response;
}
/**
* Update an existing activity.
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response|WP_Error
*/
function statpress_update_activity_api( WP_REST_Request $request ) {
$id = (int) $request['id'];
$params = $request->get_json_params();
$activity_id = statpress_save_activity_data( $params, $id );
if ( ! $activity_id ) {
return new WP_Error( 'cant-update', 'Error updating activity', array( 'status' => 500 ) );
}
return statpress_get_activity_api( $request );
}
/**
* Delete an activity.
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response|WP_Error
*/
function statpress_delete_activity_api( WP_REST_Request $request ) {
global $wpdb;
$id = (int) $request['id'];
$result = $wpdb->delete( $wpdb->prefix . 'statpress_activities', array( 'id' => $id ), array( '%d' ) );
if ( ! $result ) {
return new WP_Error( 'cant-delete', 'Error deleting activity', array( 'status' => 500 ) );
}
return new WP_REST_Response( array( 'message' => 'Activity deleted successfully.' ), 200 );
}