namespace, '/' . $this->rest_base, [ [ 'methods' => WP_REST_Server::READABLE, 'callback' => [ $this, 'get_holidays' ], 'args' => $this->get_collection_params(), 'permission_callback' => function ( $request ) { return current_user_can( 'erp_view_list' ); }, ], [ 'methods' => WP_REST_Server::CREATABLE, 'callback' => [ $this, 'create_holiday' ], 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), 'permission_callback' => function ( $request ) { return current_user_can( 'erp_leave_manage' ); }, ], 'schema' => [ $this, 'get_public_item_schema' ], ] ); register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', [ [ 'methods' => WP_REST_Server::READABLE, 'callback' => [ $this, 'get_holiday' ], 'args' => [ 'context' => $this->get_context_param( [ 'default' => 'view' ] ), ], 'permission_callback' => function ( $request ) { return current_user_can( 'erp_view_list' ); }, ], [ 'methods' => WP_REST_Server::EDITABLE, 'callback' => [ $this, 'update_holiday' ], 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), 'permission_callback' => function ( $request ) { return current_user_can( 'erp_leave_manage' ); }, ], [ 'methods' => WP_REST_Server::DELETABLE, 'callback' => [ $this, 'delete_holiday' ], 'permission_callback' => function ( $request ) { return current_user_can( 'erp_leave_manage' ); }, ], 'schema' => [ $this, 'get_public_item_schema' ], ] ); } /** * Get a collection of holidays * * @param WP_REST_Request $request * * @return WP_Error|WP_REST_Response */ public function get_holidays( $request ) { $args = [ 'number' => $request['per_page'], 'offset' => ( $request['per_page'] * ( $request['page'] - 1 ) ), ]; $items = erp_hr_get_holidays( $args ); $total_items = erp_hr_count_holidays(); $formated_items = []; foreach ( $items as $item ) { $data = $this->prepare_item_for_response( $item, $request ); $formated_items[] = $this->prepare_response_for_collection( $data ); } $response = rest_ensure_response( $formated_items ); $response = $this->format_collection_response( $response, $request, $total_items ); return $response; } /** * Get a specific holiday * * @param WP_REST_Request $request * * @return WP_Error|WP_REST_Response */ public function get_holiday( $request ) { $id = (int) $request['id']; $item = \WeDevs\ERP\HRM\Models\Leave_Holiday::find( $id ); if ( empty( $id ) || empty( $item->id ) ) { return new WP_Error( 'rest_holiday_invalid_id', __( 'Invalid resource id.' ), [ 'status' => 404 ] ); } $item = $this->prepare_item_for_response( $item, $request ); $response = rest_ensure_response( $item ); return $response; } /** * Create a holiday * * @param WP_REST_Request $request * * @return WP_Error|WP_REST_Request */ public function create_holiday( $request ) { $item = $this->prepare_item_for_database( $request ); $holiday_id = erp_hr_leave_insert_holiday( $item ); $holiday = \WeDevs\ERP\HRM\Models\Leave_Holiday::find( $holiday_id ); $request->set_param( 'context', 'edit' ); $response = $this->prepare_item_for_response( $holiday, $request ); $response = rest_ensure_response( $response ); $response->set_status( 201 ); $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) ); return $response; } /** * Update a holiday * * @param WP_REST_Request $request * * @return WP_Error|WP_REST_Request */ public function update_holiday( $request ) { $id = (int) $request['id']; $holiday = \WeDevs\ERP\HRM\Models\Leave_Holiday::find( $id ); if ( empty( $id ) || empty( $holiday->id ) ) { return new WP_Error( 'rest_holiday_invalid_id', __( 'Invalid resource id.' ), [ 'status' => 400 ] ); } $item = $this->prepare_item_for_database( $request ); $holiday_id = erp_hr_leave_insert_holiday( $item ); $holiday = \WeDevs\ERP\HRM\Models\Leave_Holiday::find( $holiday_id ); $request->set_param( 'context', 'edit' ); $response = $this->prepare_item_for_response( $holiday, $request ); $response = rest_ensure_response( $response ); $response->set_status( 201 ); $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) ); return $response; } /** * Delete a holiday * * @param WP_REST_Request $request * * @return WP_Error|WP_REST_Request */ public function delete_holiday( $request ) { $id = (int) $request['id']; erp_hr_delete_holidays( $id ); return new WP_REST_Response( true, 204 ); } /** * Prepare a single item for create or update * * @param WP_REST_Request $request Request object. * * @return array $prepared_item */ protected function prepare_item_for_database( $request ) { $prepared_item = []; // required arguments. if ( isset( $request['name'] ) ) { $prepared_item['title'] = $request['name']; } if ( isset( $request['start_date'] ) ) { $prepared_item['start'] = date( 'Y-m-d', strtotime( $request['start_date'] ) ); } // optional arguments. if ( isset( $request['id'] ) ) { $prepared_item['id'] = absint( $request['id'] ); } $prepared_item['end'] = isset( $request['end_date'] ) ? date( 'Y-m-d', strtotime( $request['end_date'] ) ) : date( 'Y-m-d', strtotime( $request['start_date'] . "+1 days" ) ); if ( isset( $request['description'] ) ) { $prepared_item['description'] = $request['description']; } return $prepared_item; } /** * Prepare a single user output for response * * @param object $item * @param WP_REST_Request $request Request object. * @param array $additional_fields (optional) * * @return WP_REST_Response $response Response data. */ public function prepare_item_for_response( $item, $request, $additional_fields = [] ) { $data = [ 'id' => (int) $item->id, 'name' => $item->title, 'start_date' => date( 'Y-m-d', strtotime( $item->start ) ), 'end_date' => date( 'Y-m-d', strtotime( $item->end ) ), 'description' => $item->description, ]; $data = array_merge( $data, $additional_fields ); // Wrap the data in a response object $response = rest_ensure_response( $data ); $response = $this->add_links( $response, $item ); return $response; } /** * Get the User's schema, conforming to JSON Schema * * @return array */ public function get_item_schema() { $schema = [ '$schema' => 'http://json-schema.org/draft-04/schema#', 'title' => 'holiday', 'type' => 'object', 'properties' => [ 'id' => [ 'description' => __( 'Unique identifier for the resource.' ), 'type' => 'integer', 'context' => [ 'embed', 'view', 'edit' ], 'readonly' => true, ], 'name' => [ 'description' => __( 'Name for the resource.' ), 'type' => 'string', 'context' => [ 'edit' ], 'arg_options' => [ 'sanitize_callback' => 'sanitize_text_field', ], 'required' => true, ], 'start_date' => [ 'description' => __( 'Start date for the resource.' ), 'type' => 'string', 'context' => [ 'edit' ], 'arg_options' => [ 'sanitize_callback' => 'sanitize_text_field', ], 'required' => true, ], 'end_date' => [ 'description' => __( 'End date for the resource.' ), 'type' => 'string', 'context' => [ 'edit' ], 'arg_options' => [ 'sanitize_callback' => 'sanitize_text_field', ], ], 'description' => [ 'description' => __( 'Description for the resource.' ), 'type' => 'string', 'context' => [ 'edit' ], 'arg_options' => [ 'sanitize_callback' => 'sanitize_text_field', ], ], ], ]; return $schema; } }