# booktics/1.0.0/core/extensions/controllers/extension-controller.php

Booktics – Appointment Booking Calendar for Service Businesses, version 1.0.0. 175 lines.

- Page: https://pluginprobe.com/plugins/booktics/1.0.0/code/core/extensions/controllers/extension-controller.php
- Raw: https://pluginprobe.com/plugins/booktics/1.0.0/raw/core/extensions/controllers/extension-controller.php
- Modified: 2025-07-03T16:48:18+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/booktics/1.0.0/code/core/extensions/controllers/extension-controller.php#L10-L20`.

```php
<?php

namespace Booktics\Extensions\Controllers;

use Booktics\Abstracts\Base_Rest_Controller;
use Booktics\Extensions\Plugin_Manager;
use WP_HTTP_Response;

class Extension_Controller extends Base_Rest_Controller {
    /**
     * Store namespace of api
     *
     * @var string
     */
    protected $namespace = 'booktics/v1';

    /**
     * Store base url
     *
     * @var string
     */
    protected $base = 'extensions';

    /**
     *
     *
     * @return void
     */
    public function register_routes(): void {
        register_rest_route(
            $this->namespace, $this->base, array(
				array(
					'methods'             => \WP_REST_Server::READABLE,
					'callback'            => array( $this, 'get_items' ),
					'permission_callback' => array(
						$this,
						'get_items_permissions_check',
					),
				),
            )
        );

        register_rest_route(
            $this->namespace, $this->base, array(
				array(
					'methods'             => \WP_REST_Server::EDITABLE,
					'callback'            => array( $this, 'update_item' ),
					'permission_callback' => array(
						$this,
						'update_item_permissions_check',
					),
				),
            )
        );
    }

    /**
     * Check if a given request has access to get items
     *
     * @param $request
     *
     * @return bool|\WP_Error
     */
    public function get_items_permissions_check( $request ) {
        return true;
    }

    /**
     * Get all extensions
     *
     * @param $request
     *
     * @return WP_HTTP_Response
     */
    public function get_items( $request ) {
        $type = ! empty( $request['type'] ) ? $request['type'] : 'addon';

        $extensions = array_values(
            array_filter(
                Plugin_Manager::extensions(),
                function ( $extension ) use ( $type ) {
                    return $extension['type'] === $type;
                }
            )
        );

        $extensions = array_map(
            function ( $extension ) {
                if ( Plugin_Manager::is_installed( $extension['name'] ) ) {
                        $extension['status'] = 'installed';
                }
                if ( Plugin_Manager::is_activated( $extension['name'] ) ) {
                    $extension['status'] = 'activated';
                }

                return $extension;
            }, $extensions
        );

        return $this->response( $extensions );
    }

    /**
     * Check if a given request has access to get items
     *
     * @param $request
     *
     * @return bool|\WP_Error
     */
    public function update_item_permissions_check( $request ) {
        return true;
    }

    /**
     * Enable or disable extension
     *
     * @param $request
     *
     * @return  WP_HTTP_Response
     */
    public function update_item( $request ) {
        $input_data = json_decode( $request->get_body(), true );
        $name       = $input_data['name'];
        $status     = $input_data['status'];

        $statuses   = array( 'off', 'on', 'install', 'activate', 'deactivate' );
        $extensions = Plugin_Manager::extensions();
        if ( ! $name ) {
            return $this->error( __( 'Please enter extension name', 'booktics' ) );
        }

        if ( ! $status ) {
            return $this->error( __( 'Please enter status', 'booktics' ) );
        }

        if ( ! in_array( $status, $statuses ) ) {
            return $this->error( __( 'Please enter status on/off', 'booktics' ) );
        }

        if ( ! isset( $extensions[ $name ] ) ) {
            return $this->error( __( 'Invalid extension', 'booktics' ) );
        }
        $extension = $extensions[ $name ];
        if ( 'addon' === $extension['type'] ) {
            $result = null;

            if ( in_array( $status, array( 'install', 'activate' ) ) ) {
                $result = Plugin_Manager::install_plugin( $name );
                $result = Plugin_Manager::activate_plugin( $name );
            }

            if ( 'deactivate' === $status && Plugin_Manager::is_activated( $name ) ) {
                $result = Plugin_Manager::deactivate_plugin( $name );
            }

            if ( is_wp_error( $result ) ) {
                return $this->error( __( 'Extension installation error', 'booktics' ) );
            }

            if ( ! $result ) {
                return $this->error( __( "Extension couldn't " . $status, 'booktics' ) );
            }
        }
        $response = Plugin_Manager::extensions()[ $name ];
        if ( Plugin_Manager::is_installed( $response['name'] ) ) {
            $response['status'] = 'installed';
        }
        if ( Plugin_Manager::is_activated( $response['name'] ) ) {
            $response['status'] = 'activated';
        }

        return $this->response( $response, __( 'Successfully updated', 'booktics' ) );
    }
}

```
