Replaced Moment with Carbon #84
8 changed files with 138 additions and 9 deletions
|
@ -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']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
96
app/Services/MaintenanceService.php
Normal file
96
app/Services/MaintenanceService.php
Normal file
|
@ -0,0 +1,96 @@
|
|||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use Carbon\Carbon;
|
||||
|
||||
class MaintenanceService
|
||||
{
|
||||
protected $settings;
|
||||
|
||||
public function __construct(SettingsService $settingsService)
|
||||
{
|
||||
$this->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!"];
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
</button><br/>
|
||||
@if($lastBackup != '')
|
||||
LAST BACK UP<br/>
|
||||
<a href="/api/v1/files">{{ $lastBackup }}</a><br/>
|
||||
<a href="/api/v1/backup/download">{{ $lastBackup }}</a><br/>
|
||||
@else
|
||||
<span>span No back ups. Frowny face.</span>
|
||||
@endif
|
||||
|
|
|
@ -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']);
|
||||
|
|
Loading…
Add table
Reference in a new issue