From 077e4c434c90e6ab6416d3e080a33f1b060af8a3 Mon Sep 17 00:00:00 2001 From: Riyyi Date: Fri, 27 Aug 2021 16:15:03 +0200 Subject: [PATCH] Everywhere: Add config and cache page Add config database table and enable crud page. Also add cache controller, model and view and routes for these pages. Make the JavaScript display a message when changing the state of development mode. --- app/controllers/AdminController.php | 32 ------- app/controllers/CacheController.php | 128 ++++++++++++++++++++++++++++ app/model/ConfigModel.php | 23 +++++ app/views/admin/cache.php | 82 ++++++++++++++++++ app/views/partials/admin.php | 5 +- config.php.example | 6 +- public/js/app.js | 20 ++++- route.php | 4 +- 8 files changed, 261 insertions(+), 39 deletions(-) create mode 100644 app/controllers/CacheController.php create mode 100644 app/model/ConfigModel.php create mode 100644 app/views/admin/cache.php diff --git a/app/controllers/AdminController.php b/app/controllers/AdminController.php index f844fd1..2a4c0f7 100644 --- a/app/controllers/AdminController.php +++ b/app/controllers/AdminController.php @@ -2,7 +2,6 @@ namespace App\Controllers; -use App\Classes\Config; use App\Classes\User; class AdminController extends PageController { @@ -13,37 +12,6 @@ class AdminController extends PageController { parent::view('', 'Admin'); } - public function developmentAction(): void - { - if (Config::c('DEVELOPMENT_MODE') == 'cloudflare') { - $token = Config::c('DEVELOPMENT_MODE_TOKEN'); - $zone = Config::c('DEVELOPMENT_MODE_ZONE'); - - $url = "https://api.cloudflare.com/client/v4/zones/$zone/settings/development_mode"; - $headers = [ - "Authorization: Bearer $token", - "Content-Type: application/json" - ]; - $data = '{"value": "on"}'; - - $curl = curl_init(); - curl_setopt($curl, CURLOPT_URL, $url); - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - curl_setopt($curl, CURLOPT_POSTFIELDS, $data); - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH'); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); - // curl_setopt($curl, CURLINFO_HEADER_OUT, 1); - - $response = curl_exec($curl); - // $info = curl_getinfo($curl, CURLINFO_HEADER_OUT); - - curl_close($curl); - } - - echo $response; - // echo $info; - } - public function toggleAction(): void { User::toggle(); echo User::getToggle() ? '1' : '0'; diff --git a/app/controllers/CacheController.php b/app/controllers/CacheController.php new file mode 100644 index 0000000..736173b --- /dev/null +++ b/app/controllers/CacheController.php @@ -0,0 +1,128 @@ +getConfigValues(); + + $this->router->service()->config = $config; + parent::view(); + } + + public function developmentAction(): void + { + if (Config::c('CLOUDFLARE_ENABLED') != '1') { + return; + } + + $token = Config::c('CLOUDFLARE_TOKEN'); + $zone = Config::c('CLOUDFLARE_ZONE'); + + $url = "https://api.cloudflare.com/client/v4/zones/$zone/settings/development_mode"; + $headers = [ + "Authorization: Bearer $token", + "Content-Type: application/json" + ]; + + $config = $this->getConfigValues(); + $currentState = $config['CLOUDFLARE_DEVELOPMENT_MODE_ENABLED']; + + $newState = $currentState == '1' ? 'off' : 'on'; + $data = '{"value": "' . $newState . '"}'; + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + curl_setopt($curl, CURLOPT_POSTFIELDS, $data); + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH'); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + // curl_setopt($curl, CURLINFO_HEADER_OUT, 1); + + $response = curl_exec($curl); + // $info = curl_getinfo($curl, CURLINFO_HEADER_OUT); + + curl_close($curl); + + $this->saveConfigValues($response); + + echo $response; + // echo $info; + } + + //-------------------------------------// + + private static function getConfigValues(): array + { + $result = []; + + $config = [ + 'CLOUDFLARE_DEVELOPMENT_MODE_ENABLED' => '0', + 'CLOUDFLARE_DEVELOPMENT_MODE_UPDATED_AT' => '', + 'CLOUDFLARE_DEVELOPMENT_MODE_EXPIRES_IN' => '', + ]; + + foreach ($config as $key => $value) { + $result[$key] = ConfigModel::firstOrCreate( + ['key' => $key], + ['value' => $value] + )->value; + } + + if ($result['CLOUDFLARE_DEVELOPMENT_MODE_ENABLED']) { + $expiresIn = $result['CLOUDFLARE_DEVELOPMENT_MODE_EXPIRES_IN']; + $updatedAt = $result['CLOUDFLARE_DEVELOPMENT_MODE_UPDATED_AT']; + + $expiresAtObject = new \DateTime($updatedAt); + $expiresAt = $expiresAtObject + ->modify("+ $expiresIn seconds") + ->format('Y-m-d H:i:s'); + $nowObject = new \DateTime('now'); + $now = $nowObject->format('Y-m-d H:i:s'); + + if ($now >= $expiresAt) { + ConfigModel::updateOrCreate( + ['key' => 'CLOUDFLARE_DEVELOPMENT_MODE_ENABLED'], + ['value' => 0]); + $result['CLOUDFLARE_DEVELOPMENT_MODE_ENABLED'] = 0; + } + else { + $result['enabled-remaining'] = $expiresAtObject->modify( + '- ' . $nowObject->getTimestamp() . ' seconds' + )->format('H:i:s'); + } + } + + return $result; + } + + private static function saveConfigValues(string $response): void + { + $decodedResponse = json_decode($response, true); + if ($decodedResponse['success'] == true) { + $state = $decodedResponse['result']['value']; + $expiresIn = $decodedResponse['result']['time_remaining']; + $updatedAt = $decodedResponse['result']['modified_on']; + + $updatedAtFormatted = (new \DateTime($updatedAt))->format('Y-m-d H:i:s'); + + ConfigModel::updateOrCreate( + ['key' => 'CLOUDFLARE_DEVELOPMENT_MODE_ENABLED'], + ['value' => $state == 'on' ? 1 : 0]); + + ConfigModel::updateOrCreate( + ['key' => 'CLOUDFLARE_DEVELOPMENT_MODE_EXPIRES_IN'], + ['value' => $expiresIn]); + + ConfigModel::updateOrCreate( + ['key' => 'CLOUDFLARE_DEVELOPMENT_MODE_UPDATED_AT'], + ['value' => $updatedAtFormatted]); + } + } + +} diff --git a/app/model/ConfigModel.php b/app/model/ConfigModel.php new file mode 100644 index 0000000..0411647 --- /dev/null +++ b/app/model/ConfigModel.php @@ -0,0 +1,23 @@ + +
+

Cache

+ + + To enable the Cloudflare cache options, + make sure to set the following option in the

config.php

file: +

'CLOUDFLARE_ENABLED' => '1',

+

+
+

+ Cloudflare cache options: +

+
+
+
+
+
Purge CSS/JavaScript
+

Granuarly remove .css and .js files from Cloudflare's cache.

+
+
+
+ +
+
+
+
+
+
+
Purge Fonts/Images
+

Granuarly remove font and images files from Cloudflare's cache.

+
+
+
+ +
+
+
+
+
+
+
Purge All Files
+

Remove ALL files from Cloudflare's cache.

+
+
+
+ +
+
+
+
+
+
+
Enable Development Mode
+

+ This will bypass Cloudflare's accelerated cache and slow down your site, + but is useful if you are making changes to cacheable content + (like images, CSS, or JavaScript) and would like to see those changes right away. + Once entered, development mode will last for 3 hours and then automatically toggle off. + config['CLOUDFLARE_DEVELOPMENT_MODE_ENABLED']; ?> + + Enabled for another + + config['enabled-remaining'] : ''; ?> + hours. + +

+
+
+
+ config['CLOUDFLARE_DEVELOPMENT_MODE_ENABLED'] ? 'checked' : ''; ?>> +
+
+
+ + +
+
diff --git a/app/views/partials/admin.php b/app/views/partials/admin.php index 5d35318..fc96817 100644 --- a/app/views/partials/admin.php +++ b/app/views/partials/admin.php @@ -23,7 +23,10 @@ - Syntax Highlighting
-
Development mode  
+
Config
+ - Cache +
+ - Config
- Log out diff --git a/config.php.example b/config.php.example index 3e9a032..46d3cc4 100644 --- a/config.php.example +++ b/config.php.example @@ -15,7 +15,7 @@ return [ 'MAIL_USERNAME' => '', 'MAIL_PASSWORD' => '', - 'DEVELOPMENT_MODE' => '', - 'DEVELOPMENT_MODE_TOKEN' => '', - 'DEVELOPMENT_MODE_ZONE' => '', + 'CLOUDFLARE_ENABLED' => '', + 'CLOUDFLARE_TOKEN' => '', + 'CLOUDFLARE_ZONE' => '', ]; diff --git a/public/js/app.js b/public/js/app.js index 9412469..ed55328 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -232,15 +232,31 @@ $(document).ready(function() { // Developer mode $('#development-mode').on('click', function(e) { + e.preventDefault(); + + if (!confirm('Are you sure you want to continue?')) { + return; + } + $.get('/admin/toggle-development-mode').done(function(data) { const response = JSON.parse(data); if (response.success == true) { - alert("Development mode has been turned: " + response.result.value); + if (response.result.value == 'on') { + e.target.checked = true; + $('#develop-enabled').css('visibility', 'visible'); + $('#develop-remaining').text('03:00:00'); + } + else { + e.target.checked = false; + $('#develop-enabled').css('visibility', 'hidden'); + } + + alert("Development mode has been set to: '" + response.result.value + "'"); } else { - alert("Development mode could not be enabled!") console.log(data); + alert("Development mode could not be enabled!") } }); }); diff --git a/route.php b/route.php index 6f6d038..560467a 100644 --- a/route.php +++ b/route.php @@ -2,6 +2,7 @@ use \App\Classes\Router; +Router::resource('/admin/config', 'CrudController'); Router::resource('/admin/section', 'CrudController'); Router::resource('/admin/page', 'CrudController'); Router::resource('/admin/content', 'CrudController'); @@ -20,8 +21,9 @@ return [ ['/reset-password', 'LoginController', 'reset', ['', 'Reset password', '']], ['/logout', 'LoginController', 'logout', ''], ['/admin', 'AdminController', '', ''], + ['/admin/cache', 'CacheController', 'cache', ''], ['/admin/toggle', 'AdminController', 'toggle', ''], - ['/admin/toggle-development-mode', 'AdminController', 'development', ''], + ['/admin/toggle-development-mode', 'CacheController', 'development', ''], ['/admin/syntax-highlighting', 'AdminController', 'syntax', ''], ['/test', 'TestController', '', ''], // ["", "", "", ""],