diff --git a/app/Http/Controllers/API/SettingsAPIController.php b/app/Http/Controllers/API/SettingsAPIController.php index d366b3b..24a73d7 100644 --- a/app/Http/Controllers/API/SettingsAPIController.php +++ b/app/Http/Controllers/API/SettingsAPIController.php @@ -6,16 +6,26 @@ use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Services\SettingsService; use App\Services\RenderService; +use App\Services\MaintenanceService; +use App\Services\AuthService; class SettingsAPIController extends Controller { protected $settings; protected $render; + protected $mainteance; + protected $auth; - public function __construct(SettingsService $settingsService, RenderService $renderService) - { - $this->settings = $settingsService; - $this->render = $renderService; + public function __construct( + SettingsService $settingsService, + RenderService $renderService, + MaintenanceService $maintenanceService, + AuthService $authService + ) { + $this->settings = $settingsService; + $this->render = $renderService; + $this->maintenance = $maintenanceService; + $this->auth = $authService; } public function publish(Request $request) @@ -37,4 +47,18 @@ class SettingsAPIController extends Controller $result = $this->settings->navSync($body); return response()->json($result)->header('Content-Type', 'application/json'); } + + public function createBackup(Request $request) + { + return response()->json($this->maintenance->createBackup())->header('Content-Type', 'application/json'); + } + + public function downloadBackup(Request $request) + { + if ($this->auth::status()) { + $latest = $this->settings->getGlobal()['last_backup']; + $file = 'backup-' . $latest . '.zip'; + return response()->download('../content/backups/' . $file, $file, ['Content-Type: application/zip']); + } + } } diff --git a/app/Providers/FipamoServiceProvider.php b/app/Providers/FipamoServiceProvider.php index d157b2b..69d3d33 100644 --- a/app/Providers/FipamoServiceProvider.php +++ b/app/Providers/FipamoServiceProvider.php @@ -15,6 +15,7 @@ use App\Services\FileUploadService; use App\Services\RenderService; use App\Services\SortingService; use App\Services\AssetService; +use App\Services\MaintenanceService; class FipamoServiceProvider extends ServiceProvider { @@ -79,6 +80,12 @@ class FipamoServiceProvider extends ServiceProvider ) ); }); + + $this->app->bind(MaintenanceService::class, function ($app) { + return new MaintenanceService( + new SettingsService(new DocService(), new ContentService()) + ); + }); } /** diff --git a/app/Services/MaintenanceService.php b/app/Services/MaintenanceService.php new file mode 100644 index 0000000..0297579 --- /dev/null +++ b/app/Services/MaintenanceService.php @@ -0,0 +1,96 @@ +settings = $settingsService; + } + + public function createBackUp() + { + //make sure back directory is there + $stamp = Carbon::now()->format("YmdGis"); + if (!is_dir('../content/backups')) { + mkdir('../content/backups', 0755, true); + } + //creat backup zip + $zip = new \ZipArchive(); + + $zip->open( + '../content/backups/backup-' . $stamp . '.zip', + \ZipArchive::CREATE | \ZipArchive::OVERWRITE + ); + //gather data and path info for md pages + $pagePath = '../content/pages'; + $yearPaths = glob($pagePath . '/*', GLOB_ONLYDIR); + foreach ($yearPaths as $years) { + $year = explode('/', $years); + //grap the index and save it + if (trim($year[3]) == 'start') { + $options = [ + 'add_path' => 'content/pages/' . $year[3] . '/', + 'remove_all_path' => true, + ]; + $zip->addGlob($years . '/*.md', GLOB_BRACE, $options); + } + $monthsPath = glob($pagePath . '/' . $year[3] . '/*', GLOB_ONLYDIR); + foreach ($monthsPath as $months) { + $month = explode('/', $months); + //once info is collected, add md pages to zip + $options = [ + 'add_path' => 'content/pages/' . $year[3] . '/' . $month[4] . '/', + 'remove_all_path' => true, + ]; + $zip->addGlob($months . '/*.md', GLOB_BRACE, $options); + } + } + + //gather paths for blog images + $blogImages = []; + $dir = new \RecursiveDirectoryIterator('../public/assets/images/blog'); + $flat = new \RecursiveIteratorIterator($dir); + $files = new \RegexIterator($flat, '/\.png|jpg|gif$/i'); + foreach ($files as $file) { + $blogImages[] = ['path' => $file->getPath(), 'file' => $file->getFilename()]; + }; + + //gather paths for user images + $userImages = []; + $dir = new \RecursiveDirectoryIterator('../public/assets/images/user'); + $flat = new \RecursiveIteratorIterator($dir); + $files = new \RegexIterator($flat, '/\.png|jpg|gif$/i'); + foreach ($files as $file) { + $userImages[] = ['path' => $file->getPath(), 'file' => $file->getFilename()]; + }; + + //add directory for settings and save them + $zip->addEmptyDir('config'); + $zip->addEmptyDir('images'); + $zip->addFile(env('SETTINGS_PATH'), 'config/settings.json'); + $zip->addFile(env('FOLKS_PATH'), 'config/folks.json'); + $zip->addFile(env('TAGS_PATH'), 'config/tags.json'); + // create temp files for image lists + file_put_contents('../content/backups/blog_temp.json', json_encode($blogImages)); + file_put_contents('../content/backups/user_temp.json', json_encode($userImages)); + //add to zip + $zip->addFile('../content/backups/blog_temp.json', 'images/blog.json'); + $zip->addFile('../content/backups/user_temp.json', 'images/user.json'); + //save zip file + $zip->close(); + //clean up temp files + unlink('../content/backups/blog_temp.json'); + unlink('../content/backups/user_temp.json'); + + //update settings file with latest back up date + $this->settings->updateGlobalData('last_backup', $stamp); + + return ['message' => "Backup created. THIS IS A SAFE SPACE!"]; + } +} diff --git a/app/Services/SettingsService.php b/app/Services/SettingsService.php index ad9f13f..140be3b 100644 --- a/app/Services/SettingsService.php +++ b/app/Services/SettingsService.php @@ -70,7 +70,7 @@ class SettingsService public function updateGlobalData($key, $value) { $this->settings = $this->loadSettings(); - $this->settings['global'][$key] = $data; + $this->settings['global'][$key] = $value; $this->docs->writeSettings($this->settings); } diff --git a/app/Services/SortingService.php b/app/Services/SortingService.php index 1c102af..c2d35a7 100644 --- a/app/Services/SortingService.php +++ b/app/Services/SortingService.php @@ -274,7 +274,7 @@ class SortingService 'siteTitle' => $global['title'], 'baseUrl' => $global['base_url'], 'desc' => $global['descriptions'], - 'lastBackup' => $updated->format('Y M D d'), + 'lastBackup' => $updated->format('Y M D G i s'), 'currentTheme' => $global['theme'], 'themes' => $this->themes->getThemes(), 'apiStatus' => isset($global['externalAPI']) ? $global['externalAPI'] : 'false', diff --git a/public/assets/scripts/dash/app/controllers/MaintenanceManager.js b/public/assets/scripts/dash/app/controllers/MaintenanceManager.js index 5de2663..c8e648e 100644 --- a/public/assets/scripts/dash/app/controllers/MaintenanceManager.js +++ b/public/assets/scripts/dash/app/controllers/MaintenanceManager.js @@ -12,7 +12,7 @@ export const API_INIT = '/api/v1/init'; export const API_RESTORE = '/api/v1/restore'; export const API_GET_SECRET = '/api/v1/get-secret'; export const API_RESET_PASS = '/api/v1/reset-password'; -export const API_CREATE_BACKUP = '/api/v1/backup'; +export const API_CREATE_BACKUP = '/api/v1/backup/create'; export const API_DOWNLOAD_BACKUP = '/api/v1/backup/download'; export const API_RESTORE_BACKUP = '/api/v1/backup/restore'; export const API_UPLOAD_AVATAR = '/api/v1/settings/add-avatar'; @@ -133,7 +133,7 @@ class MaintenanceManager { url = API_CREATE_BACKUP; event = TASK_BACKUP_CREATE; - method = REQUEST_TYPE_POST; + method = REQUEST_TYPE_PUT; type = CONTENT_TYPE_JSON; data = { task: 'create_backup' }; this._request(url, null, event, method, type, data) diff --git a/resources/views/back/settings.blade.php b/resources/views/back/settings.blade.php index 5198c8d..ecaa985 100644 --- a/resources/views/back/settings.blade.php +++ b/resources/views/back/settings.blade.php @@ -30,7 +30,7 @@
@if($lastBackup != '') LAST BACK UP
- {{ $lastBackup }}
+ {{ $lastBackup }}
@else span No back ups. Frowny face. @endif diff --git a/routes/api.php b/routes/api.php index a7330fe..eb52653 100644 --- a/routes/api.php +++ b/routes/api.php @@ -28,3 +28,5 @@ Route::post("/v1/files", [FileUploadAPIController::class, 'upload']); Route::put("/v1/settings/publish", [SettingsAPIController::class, 'publish']); Route::put("/v1/settings/sync", [SettingsAPIController::class, 'sync']); Route::put("/v1/settings/nav-sync", [SettingsAPIController::class, 'navSync']); +Route::put("/v1/backup/create", [SettingsAPIController::class, 'createBackup']); +Route::get("/v1/backup/download", [SettingsAPIController::class, 'downloadBackup']);