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[\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 ); }