| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- <?php
- /**
- * Media REST API Controller for the plugin.
- *
- * This class handles REST API endpoints for media operations.
- *
- * @package QDR_Temporary_Shared_Storage
- * @since 1.0.0
- */
- class QDR_TSS_Media_Controller {
- /**
- * The plugin name.
- *
- * @since 1.0.0
- * @access private
- * @var string $plugin_name The name of this plugin.
- */
- private $plugin_name;
- /**
- * The plugin version.
- *
- * @since 1.0.0
- * @access private
- * @var string $version The version of this plugin.
- */
- private $version;
- /**
- * The namespace for the REST API routes.
- *
- * @since 1.0.0
- * @access private
- * @var string $namespace The namespace for the REST API routes.
- */
- private $namespace = 'qdr-tss/v1';
- /**
- * The base for the REST API routes.
- *
- * @since 1.0.0
- * @access private
- * @var string $base The base for the REST API routes.
- */
- private $base = 'media';
- /**
- * The database manager instance.
- *
- * @since 1.0.0
- * @access private
- * @var QDR_TSS_DB_Manager $db_manager The database manager instance.
- */
- private $db_manager;
- /**
- * The file manager instance.
- *
- * @since 1.0.0
- * @access private
- * @var QDR_TSS_File_Manager $file_manager The file manager instance.
- */
- private $file_manager;
- /**
- * Initialize the class and set its properties.
- *
- * @since 1.0.0
- * @param string $plugin_name The name of this plugin.
- * @param string $version The version of this plugin.
- */
- public function __construct($plugin_name, $version) {
- $this->plugin_name = $plugin_name;
- $this->version = $version;
- $this->db_manager = QDR_TSS_DB_Manager::instance();
- $this->file_manager = QDR_TSS_File_Manager::instance();
- }
- /**
- * Register the REST API routes.
- *
- * @since 1.0.0
- */
- public function register_routes() {
- register_rest_route($this->namespace, '/' . $this->base, array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array($this, 'get_items'),
- 'permission_callback' => array($this, 'check_permission'),
- ),
- ));
-
- register_rest_route($this->namespace, '/' . $this->base . '/(?P<id>[\w]+)', array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array($this, 'get_item'),
- 'permission_callback' => array($this, 'check_permission'),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array($this, 'update_item'),
- 'permission_callback' => array($this, 'check_permission'),
- ),
- array(
- 'methods' => WP_REST_Server::DELETABLE,
- 'callback' => array($this, 'delete_item'),
- 'permission_callback' => array($this, 'check_permission'),
- ),
- ));
- }
- /**
- * Check permission for REST API requests.
- *
- * @since 1.0.0
- * @return bool True if authorized, false otherwise.
- */
- public function check_permission() {
- $rest_controller = new QDR_TSS_REST_Controller($this->plugin_name, $this->version);
- return $rest_controller->check_rest_permission();
- }
- /**
- * Get a collection of items.
- *
- * @since 1.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
- */
- public function get_items($request) {
- $args = array(
- 'per_page' => isset($request['per_page']) ? (int) $request['per_page'] : 10,
- 'page' => isset($request['page']) ? (int) $request['page'] : 1,
- 'orderby' => isset($request['orderby']) ? $request['orderby'] : 'upload_date',
- 'order' => isset($request['order']) ? $request['order'] : 'DESC',
- 'original_file_name' => isset($request['original_file_name']) ? $request['original_file_name'] : '',
- 'reference' => isset($request['reference']) ? $request['reference'] : '',
- );
-
- $result = $this->db_manager->get_items($args);
-
- $response = new WP_REST_Response($result['items']);
- $response->header('X-WP-Total', $result['total']);
- $response->header('X-WP-TotalPages', $result['total_pages']);
-
- return $response;
- }
- /**
- * Get a single item.
- *
- * @since 1.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
- */
- public function get_item($request) {
- $id = $request['id'];
-
- $item = $this->db_manager->get_item_by_fileid($id);
-
- if (!$item) {
- return new WP_Error(
- 'qdr_tss_not_found',
- __('Media not found.', 'qdr-temporary-shared-storage'),
- array('status' => 404)
- );
- }
-
- // Remove password from response
- unset($item->password);
-
- return new WP_REST_Response($item, 200);
- }
- /**
- * Update a single item.
- *
- * @since 1.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
- */
- public function update_item($request) {
- $id = $request['id'];
-
- $item = $this->db_manager->get_item_by_fileid($id);
-
- if (!$item) {
- return new WP_Error(
- 'qdr_tss_not_found',
- __('Media not found.', 'qdr-temporary-shared-storage'),
- array('status' => 404)
- );
- }
-
- $data = array();
-
- // Update properties
- if (isset($request['message'])) {
- $data['message'] = sanitize_textarea_field($request['message']);
- }
-
- if (isset($request['active_from'])) {
- $data['active_from'] = sanitize_text_field($request['active_from']);
- }
-
- if (isset($request['active_to'])) {
- $data['active_to'] = sanitize_text_field($request['active_to']);
- }
-
- if (isset($request['reference'])) {
- $data['reference'] = sanitize_text_field($request['reference']);
- }
-
- if (isset($request['description'])) {
- $data['description'] = sanitize_textarea_field($request['description']);
- }
-
- // Validate the active period dates
- $validation_result = $this->validate_active_period($data);
- if (is_wp_error($validation_result)) {
- return $validation_result;
- }
-
- if (empty($data)) {
- return new WP_Error(
- 'qdr_tss_no_changes',
- __('No changes to update.', 'qdr-temporary-shared-storage'),
- array('status' => 400)
- );
- }
-
- $result = $this->db_manager->update_item_by_fileid($id, $data);
-
- if (!$result) {
- return new WP_Error(
- 'qdr_tss_update_failed',
- __('Failed to update media.', 'qdr-temporary-shared-storage'),
- array('status' => 500)
- );
- }
-
- $updated_item = $this->db_manager->get_item_by_fileid($id);
-
- // Remove password from response
- unset($updated_item->password);
-
- return new WP_REST_Response($updated_item, 200);
- }
- /**
- * Validate active period dates.
- *
- * @since 1.0.0
- * @param array $data The data array containing active_from and active_to
- * @return true|WP_Error True if valid, WP_Error if invalid
- */
- private function validate_active_period($data) {
- // If both dates are provided, validate them
- if (isset($data['active_from']) && isset($data['active_to'])) {
- $active_from = $data['active_from'];
- $active_to = $data['active_to'];
-
- // Skip validation if either field is empty
- if (empty($active_from) || empty($active_to)) {
- return true;
- }
-
- // Parse dates
- $from_timestamp = strtotime($active_from);
- $to_timestamp = strtotime($active_to);
-
- // Check if dates are valid
- if ($from_timestamp === false) {
- return new WP_Error(
- 'invalid_active_from',
- __('Invalid Active From date format.', 'qdr-temporary-shared-storage'),
- array('status' => 400)
- );
- }
-
- if ($to_timestamp === false) {
- return new WP_Error(
- 'invalid_active_to',
- __('Invalid Active To date format.', 'qdr-temporary-shared-storage'),
- array('status' => 400)
- );
- }
-
- // Check if active_from is greater than or equal to active_to
- if ($from_timestamp >= $to_timestamp) {
- return new WP_Error(
- 'invalid_active_period',
- __('Active From date must be before Active To date.', 'qdr-temporary-shared-storage'),
- array('status' => 400)
- );
- }
- }
-
- return true;
- }
- /**
- * Delete a single item.
- *
- * @since 1.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
- */
- public function delete_item($request) {
- $id = $request['id'];
-
- $item = $this->db_manager->get_item_by_fileid($id);
-
- if (!$item) {
- return new WP_Error(
- 'qdr_tss_not_found',
- __('Media not found.', 'qdr-temporary-shared-storage'),
- array('status' => 404)
- );
- }
-
- // Delete file
- $this->file_manager->delete_file($item->file_path);
-
- // Delete from database
- $result = $this->db_manager->delete_item_by_fileid($id);
-
- if (!$result) {
- return new WP_Error(
- 'qdr_tss_delete_failed',
- __('Failed to delete media.', 'qdr-temporary-shared-storage'),
- array('status' => 500)
- );
- }
-
- return new WP_REST_Response(array(
- 'deleted' => true,
- 'fileid' => $id
- ), 200);
- }
- }
|