Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
44.87% covered (danger)
44.87%
35 / 78
25.00% covered (danger)
25.00%
1 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
CacheController
44.87% covered (danger)
44.87%
35 / 78
25.00% covered (danger)
25.00%
1 / 4
65.42
0.00% covered (danger)
0.00%
0 / 1
 register_routes
100.00% covered (success)
100.00%
21 / 21
100.00% covered (success)
100.00%
1 / 1
1
 get_settings
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 update_settings
31.82% covered (danger)
31.82%
14 / 44
0.00% covered (danger)
0.00%
0 / 1
76.12
 purge_all
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace NewfoldLabs\WP\Module\Performance\RestApi;
4
5use NewfoldLabs\WP\Module\Performance\Permissions;
6use NewfoldLabs\WP\Module\Performance\Cache\CacheExclusion;
7use NewfoldLabs\WP\Module\Performance\Cache\CacheManager;
8use NewfoldLabs\WP\Module\Performance\Cache\CachePurgingService;
9use NewfoldLabs\WP\Module\Performance\Cache\Types\ObjectCache;
10
11use function NewfoldLabs\WP\ModuleLoader\container;
12use function NewfoldLabs\WP\Module\Performance\get_cache_level;
13use function NewfoldLabs\WP\Module\Performance\get_cache_exclusion;
14
15/**
16 * Class CacheExclusionController
17 */
18class CacheController {
19    /**
20     * REST namespace
21     *
22     * @var string
23     */
24    protected $namespace = 'newfold-performance/v1';
25
26    /**
27     * REST base
28     *
29     * @var string
30     */
31    protected $rest_base = '/cache';
32
33    /**
34     * Registers rest routes for PluginsController class.
35     *
36     * @return void
37     */
38    public function register_routes() {
39
40        \register_rest_route(
41            $this->namespace,
42            $this->rest_base . '/settings',
43            array(
44                array(
45                    'methods'             => \WP_REST_Server::READABLE,
46                    'callback'            => array( $this, 'get_settings' ),
47                    'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
48                ),
49                array(
50                    'methods'             => \WP_REST_Server::CREATABLE,
51                    'callback'            => array( $this, 'update_settings' ),
52                    'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
53                ),
54                array(
55                    'methods'             => \WP_REST_Server::DELETABLE,
56                    'callback'            => array( $this, 'purge_all' ),
57                    'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
58                ),
59            )
60        );
61    }
62
63    /**
64     * Get the settings
65     *
66     * @return \WP_REST_Response
67     */
68    public function get_settings() {
69        // If user preference is "on" but the drop-in is missing, restore it so the UI shows enabled.
70        ObjectCache::maybe_restore_dropin();
71        $response = array(
72            'cacheExclusion' => get_cache_exclusion(),
73            'cacheLevel'     => get_cache_level(),
74            'objectCache'    => ObjectCache::get_state(),
75        );
76        return new \WP_REST_Response( $response, 200 );
77    }
78
79    /**
80     * Update the settings
81     *
82     * @param \WP_REST_Request $request the request.
83     * @return \WP_REST_Response
84     */
85    public function update_settings( \WP_REST_Request $request ) {
86
87        if ( $request->has_param( 'cacheExclusion' ) ) {
88            $cache_exclusion = $request->get_param( 'cacheExclusion' );
89            $normalized      = CacheExclusion::normalize( $cache_exclusion );
90            if ( ! preg_match( CacheExclusion::CACHE_EXCLUSION_VALIDATE_REGEX, $normalized ) ) {
91                return new \WP_REST_Response(
92                    array(
93                        'result'  => false,
94                        'message' => 'Invalid cache exclusion format.',
95                    ),
96                    400
97                );
98            }
99            $result = update_option( CacheExclusion::OPTION_CACHE_EXCLUSION, $normalized );
100            if ( $result ) {
101                return new \WP_REST_Response( array( 'result' => true ), 200 );
102            }
103            return new \WP_REST_Response( array( 'result' => false ), 400 );
104        }
105
106        if ( $request->has_param( 'cacheLevel' ) ) {
107            $cache_level = (int) $request->get_param( 'cacheLevel' );
108            $result      = update_option( CacheManager::OPTION_CACHE_LEVEL, $cache_level );
109            if ( $result ) {
110                // When cache is disabled, turn off object caching too so the UI stays in sync.
111                if ( $cache_level <= 0 ) {
112                    ObjectCache::disable();
113                }
114                $response = array( 'result' => true );
115                if ( $cache_level <= 0 ) {
116                    $response['objectCache'] = ObjectCache::get_state();
117                }
118                return new \WP_REST_Response( $response, 200 );
119            }
120            return new \WP_REST_Response( array( 'result' => false ), 400 );
121        }
122
123        if ( $request->has_param( 'objectCache' ) ) {
124            $object_cache = $request->get_param( 'objectCache' );
125            if ( is_array( $object_cache ) && isset( $object_cache['enabled'] ) ) {
126                $enable = (bool) $object_cache['enabled'];
127                if ( $enable ) {
128                    $out = ObjectCache::enable();
129                } else {
130                    $out = ObjectCache::disable();
131                }
132                if ( $out['success'] ) {
133                    // Purge page cache and object cache (purge_all includes flush_object_cache).
134                    container()->get( 'cachePurger' )->purge_all();
135                    return new \WP_REST_Response( array( 'result' => true ), 200 );
136                }
137                return new \WP_REST_Response(
138                    array(
139                        'result'  => false,
140                        'message' => isset( $out['message'] ) ? $out['message'] : '',
141                    ),
142                    400
143                );
144            }
145        }
146
147        return new \WP_REST_Response( array( 'result' => false ), 400 );
148    }
149
150    /**
151     * Clears the entire cache (page cache and object cache when enabled).
152     */
153    public function purge_all() {
154
155        container()->get( 'cachePurger' )->purge_all();
156        ObjectCache::flush_object_cache();
157
158        return array(
159            'status'  => 'success',
160            'message' => 'Cache purged',
161        );
162    }
163}