From 743d7c4d9076fac6ff5bed1fc6dfd321d59335cd Mon Sep 17 00:00:00 2001 From: ro Date: Fri, 16 May 2025 17:37:53 -0600 Subject: [PATCH] routing overhaul previously all the of the page routing was handlede through controller organized by CRUD methods. it worked, but organizing by CRUD and not purpose resulted in more time spent looking for a specific task through controllers, so it turned out not to an effecient way of organizing. so routing has been completely reorganized into laravel's web routing section and methods have been moved to their appropriate controller so tasks are much easier to find front facing page routing turned out to be a bit more tricky that anticipated do the overap of routing paths, but it only affects dynamic page rendering and there's a patch in place that handles that issue until a better solution is found. Rendered HTML pages works fine. whew! --- app/Http/Controllers/DashController.php | 156 ++------- app/Http/Controllers/FrontController.php | 108 ++++-- app/Http/Controllers/PageController.php | 147 ++++++++ .../Controllers/RouteDeleteController.php | 29 -- app/Http/Controllers/RouteGetController.php | 91 ----- app/Http/Controllers/RoutePostController.php | 122 ------- ...tController.php => SettingsController.php} | 113 +++--- app/Http/Controllers/SystemMailController.php | 21 ++ app/Http/Controllers/ThemeController.php | 2 +- app/Http/Middleware/MemberCheck.php | 10 +- public/assets/css/dash/navigation.css | 24 +- public/assets/css/dash/settings.css | 2 +- .../scripts/dash/app/actions/NavActions.js | 2 +- .../scripts/dash/app/controllers/NavIndex.js | 4 +- .../dash/app/controllers/PageEditor.js | 2 +- .../scripts/dash/libraries/ContentRequest.js | 16 +- .../dash/libraries/MaintenanceRequest.js | 12 +- resources/views/back/navigation.blade.php | 33 -- resources/views/back/settings.blade.php | 323 ++++++++++-------- resources/views/back/start.blade.php | 60 ++-- resources/views/includes/nav.blade.php | 11 +- resources/views/includes/options.blade.php | 2 +- .../views/includes/recent-meta.blade.php | 26 +- .../views/includes/submenu-start.blade.php | 2 +- resources/views/theme/start.blade.php | 40 +-- routes/web.php | 90 +++-- 26 files changed, 690 insertions(+), 758 deletions(-) create mode 100644 app/Http/Controllers/PageController.php delete mode 100644 app/Http/Controllers/RouteDeleteController.php delete mode 100644 app/Http/Controllers/RouteGetController.php delete mode 100644 app/Http/Controllers/RoutePostController.php rename app/Http/Controllers/{RoutePutController.php => SettingsController.php} (54%) delete mode 100644 resources/views/back/navigation.blade.php diff --git a/app/Http/Controllers/DashController.php b/app/Http/Controllers/DashController.php index 2b506d3..30bcea4 100644 --- a/app/Http/Controllers/DashController.php +++ b/app/Http/Controllers/DashController.php @@ -4,157 +4,71 @@ namespace App\Http\Controllers; use App\Interfaces\PageRepositoryInterface; use App\Interfaces\MemberRepositoryInterface; -use App\Services\Data\ThemeService; -use App\Services\Data\SortingService; +use App\Services\Assets\FileUploadService; +use Illuminate\Http\Request; class DashController extends Controller { protected PageRepositoryInterface $pages; protected MemberRepositoryInterface $member; - protected ThemeService $themes; - protected SortingService $sort; + protected FileUploadService $upload; public function __construct( PageRepositoryInterface $pageRepository, MemberRepositoryInterface $memberRepo, - ThemeService $themeService, - SortingService $sortingService + FileUploadService $fileUploadService, ) { $this->pages = $pageRepository; $this->member = $memberRepo; - $this->themes = $themeService; - $this->sort = $sortingService; + $this->upload = $fileUploadService; } //--- // GET //--- - public function init($second, $third, $fourth) - { - switch ($second) { - case 'settings': - return $this->settings(); - break; - case 'navigation': - return $this->navigation(); - break; - case 'pages': - ($third == null) ? $third = 'all' : $third = $third; - ($fourth == null) ? $fourth = 1 : $fourth = $fourth; - return $this->book($third, $fourth); - break; - case 'page': - return $this->page($third, $fourth); - break; - case 'logout': - return $this->logout(); - break; - default: - return $this->start(); - break; - } - } - public function start() { $result = []; + if ($this->member::status()) { $result = $this->pages->getGroup(1, 4); } - return view('back.start', [ - "status" => $this->member::status(), - "result" => $result, - "title" => "Start" - ]); - } - - public function book($pageFilter = 'all', $pageNum = 1) - { - $result = []; if ($this->member::status()) { - $result = $this->pages->getGroup($pageNum, 4, $pageFilter); - } - return view('back.book', [ - "status" => $this->member::status(), - "result" => $result, - "currentPage" => $pageNum, - "title" => "Pages" - ]); - } - - public function page($mode, $uuid) - { - $title; - $page = []; - $views = []; - $mode == 'edit' ? $page = $this->pages->getByUuid($uuid) : $page = []; - $mode == 'edit' ? $title = 'Edit Page' : $title = 'Add New'; - $mode == 'edit' ? $views = $this->themes->getCustomViews($page['layout']) : $views[] = 'page'; - - //just a patch for now to get this out of the template - if ($mode == 'edit') { - $id = $page['id']; - $uuid = $page['uuid']; - $slug = $page['slug']; - $feature = $page['feature']; - $layout = $page['layout']; - $tags = $page['tags']; - $content = $page['content']; - $date = $page['created']; - $updated = $page['updated']; - $media = $page['media']; - $files = $page['docs']; - $editTitle = $page['title']; + return view('back.start', [ + "status" => $this->member::status(), + "result" => $result, + "title" => "Start" + ]); } else { - $id = ""; - $uuid = ""; - $slug = ""; - $feature = ""; - $layout = ""; - $tags = ""; - $content = ""; - $date = ""; - $updated = ""; - $media = ""; - $files = ""; - $editTitle = ""; - }; - - return view('back.page', [ - "status" => $this->member::status(), - "mode" => $mode, - "page" => $page, - "views" => $views, - "id" => $id, - "uuid" => $uuid, - "slug" => $slug, - "feature" => $feature, - "layout" => $layout, - "tags" => $tags, - "content" => $content, - "date" => $date, - "updated" => $updated, - "media" => $media, - "files" => $files, - "title" => urldecode($title), - "editTitle" => urldecode($editTitle), - ]); - } - - public function navigation() - { - return view('back.navigation', $this->sort->navigation()); - } - - public function settings() - { - return view('back.settings', $this->sort->settings()); + return view('back.login', [ + "status" => $this->member::status(), + "title" => "Hi!" + ]); + } } //--- // POST //--- + public function uploads(Request $request) + { + $result = $result = $this->upload->handleFile($request); + //update configs for specfic uploads + switch ($request['source']) { + case 'avatar-upload': + $member = []; + $member = session('member'); + $member['avatar'] = $result['filePath']; + $member = (object) $member; + $this->member->update($member); + break; + case 'background-upload': + $this->settings->updateGlobalData('background', $result['filePath']); + break; + } + return $result; + } //--- // PUT @@ -167,7 +81,7 @@ class DashController extends Controller public function login() { if ($this->member::status()) { - return redirect('dashboard'); + return redirect('dashboard/start'); } else { return view('back.login', [ "status" => $this->member::status(), diff --git a/app/Http/Controllers/FrontController.php b/app/Http/Controllers/FrontController.php index 2deef06..d17de85 100644 --- a/app/Http/Controllers/FrontController.php +++ b/app/Http/Controllers/FrontController.php @@ -6,6 +6,9 @@ use App\Interfaces\PageRepositoryInterface; use App\Services\Assets\AssetService; use App\Services\Data\SettingsService; use App\Services\Data\SortingService; +use App\Services\Upkeep\InitService; +use App\Http\Controllers\DashController; +use Illuminate\Http\Request; use function _\find; @@ -15,52 +18,95 @@ class FrontController extends Controller protected PageRepositoryInterface $pages; protected AssetService $assets; protected SortingService $sort; + protected $init; + protected $dash; public function __construct( PageRepositoryInterface $pageRepository, SettingsService $settingsService, AssetService $assetService, SortingService $sortService, + InitService $initService, + DashController $dashController, ) { $this->pages = $pageRepository; $this->settings = $settingsService; $this->assets = $assetService; $this->sort = $sortService; + $this->init = $initService; + $this->dash = $dashController; } - //REFACTOR: there is some method overlap between index and pages, so that needs to be addressed - public function index($first = 00, $second = 00, $third = 00) + public function start($one = 00, $two = 00, $three = 00) { $global = $this->settings->getGlobal(); $currentTheme = $this->assets->getCurrentTheme(); $template; $pageData = []; $pages = $this->pages->getAll(); + //weird bug where the whole url is being passed with optional params + //for now, just split it manually and set it to the vars used + + $paths = explode('/', $one); + if (isset($paths[0])) { + $one = $paths[0]; + } + if (isset($paths[1])) { + $two = $paths[1]; + } + if (isset($paths[2])) { + $three = $paths[2]; + } + //check if configs are present if (file_exists(env('FOLKS_PATH')) && file_exists(env('SETTINGS_PATH'))) { if ($global['dynamicRender'] == 'true') { - if (is_numeric($first)) { - if ($first == 00 || !isset($first)) { - $page = $pages->where('id', 1)->first(); - $pageData = $this->sort->page($page, false); - $template = $currentTheme . '.index'; - } else { - $page = $this->pages->getBySlug($third); - $pageData = $this->sort->page($page, false); - $template = $currentTheme . '.' . $page['layout']; - } - } else { - if ($first == null || $first == '') { + if (is_numeric($one)) { + if ($one == 00 || !isset($one)) { $page = $pages->where('id', 0)->first(); $pageData = $this->sort->page($page, false); $template = $currentTheme . '.index'; } else { - $page = $this->pages->getBySlug($first); + $page = $this->pages->getBySlug($three); $pageData = $this->sort->page($page, false); $template = $currentTheme . '.' . $page['layout']; } + } else { + if ($one == null || $one == '') { + $page = $pages->where('id', 0)->first(); + $pageData = $this->sort->page($page, false); + $template = $currentTheme . '.index'; + } else { + if ($one == 'archives' || $one == 'archive' || $one == 'tags') { + $currentTheme = $this->assets->getCurrentTheme(); + switch ($one) { + case 'archive': + case 'archives': + $template = $currentTheme . '.archive'; + $pageData = $this->sort->archive(false); + break; + case 'tags': + $template = $currentTheme . '.tags'; + $tags = $this->sort->tags(false); + $tagData = find($tags['tags'], ['tag_name' => $two]); + $pageData = [ + 'theme' => $currentTheme, // for theme kit + 'title' => 'Pages Tagged as ' . $two, + 'dynamicRender' => $tags['dynamicRender'], + 'info' => $tags['info'], + 'menu' => $tags['menu'], + 'pages' => $tagData['pages'], + 'media' => $tags['media'], + ]; + break; + } + } else { + $page = $this->pages->getBySlug($one); + $pageData = $this->sort->page($page, false); + $template = $currentTheme . '.' . $page['layout']; + } + } } - return view($template, $pageData); } else { if (is_file('../public/index.html')) { @@ -74,30 +120,18 @@ class FrontController extends Controller } } - public function page($first = 00, $second = 00, $third = 00) + //setup up a new site or restore from back up + public function init($task, Request $request) { - $currentTheme = $this->assets->getCurrentTheme(); - switch ($first) { - case 'archive': - case 'archives': - $template = $currentTheme . '.archive'; - $pageData = $this->sort->archive(); + $result = []; + switch ($task) { + case 'fresh': + $result = $this->init->fresh(json_decode($request->getContent())); break; - case 'tags': - $template = $currentTheme . '.tags'; - $tags = $this->sort->tags(false); - $tagData = find($tags['tags'], ['tag_name' => $second]); - $pageData = [ - 'theme' => $currentTheme, // for theme kit - 'title' => 'Pages Tagged as ' . $second, - 'dynamicRender' => $tags['dynamicRender'], - 'info' => $tags['info'], - 'menu' => $tags['menu'], - 'pages' => $tagData['pages'], - 'media' => $tags['media'], - ]; + case 'restore': + $result = $this->init->restore($request); break; } - return view($template, $pageData); + return response()->json($result)->header('Content-Type', 'application/json'); } } diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php new file mode 100644 index 0000000..b9c9735 --- /dev/null +++ b/app/Http/Controllers/PageController.php @@ -0,0 +1,147 @@ +page = $pageRepo; + $this->member = $memberRepo; + $this->themes = $themeService; + } + + //--- + // GET Actions + //--- + + public function start(string $one = 'all', string $two = '1') + { + //checks mode to see what needs to get loaded + switch ($one) { + case "edit": + case "add": + return $this->page($one, $two); + break; + + default: + return $this->book($one, $two); + break; + } + } + + private function page($mode, $uuid) + { + $title; + $page = []; + $views = []; + $mode == 'edit' ? $page = $this->page->getByUuid($uuid) : $page = []; + $mode == 'edit' ? $title = 'Edit Page' : $title = 'Add New'; + $mode == 'edit' ? $views = $this->themes->getCustomViews($page['layout']) : $views[] = 'page'; + + //just a patch for now to get this out of the template + if ($mode == 'edit') { + $id = $page['id']; + $uuid = $page['uuid']; + $slug = $page['slug']; + $feature = $page['feature']; + $layout = $page['layout']; + $tags = $page['tags']; + $content = $page['content']; + $date = $page['created']; + $updated = $page['updated']; + $media = $page['media']; + $files = $page['docs']; + $editTitle = $page['title']; + } else { + $id = ""; + $uuid = ""; + $slug = ""; + $feature = ""; + $layout = ""; + $tags = ""; + $content = ""; + $date = ""; + $updated = ""; + $media = ""; + $files = ""; + $editTitle = ""; + }; + + return view('back.page', [ + "status" => $this->member::status(), + "mode" => $mode, + "page" => $page, + "views" => $views, + "id" => $id, + "uuid" => $uuid, + "slug" => $slug, + "feature" => $feature, + "layout" => $layout, + "tags" => $tags, + "content" => $content, + "date" => $date, + "updated" => $updated, + "media" => $media, + "files" => $files, + "title" => urldecode($title), + "editTitle" => urldecode($editTitle), + ]); + } + + private function book($pageFilter, $pageNum) + { + $result = []; + if ($this->member::status()) { + $result = $this->page->getGroup($pageNum, 4, $pageFilter); + } + return view('back.book', [ + "status" => $this->member::status(), + "result" => $result, + "currentPage" => $pageNum, + "title" => "Pages" + ]); + } + + //--- + // POST Actions + //--- + public function create(Request $request) + { + $body = json_decode($request->getContent()); + $result = $this->page->create($body); + return response()->json($result)->header('Content-Type', 'application/json'); + } + + //--- + // PUT Actions + //--- + public function write(Request $request) + { + $body = json_decode($request->getContent()); + $result = $this->page->update($body); + return response()->json($result)->header('Content-Type', 'application/json'); + } + + //--- + // DELETE Actions + //--- + public function delete(Request $request) + { + $body = json_decode($request->getContent()); + $result = $this->page->delete($body); + return response()->json($result)->header('Content-Type', 'application/json'); + } +} diff --git a/app/Http/Controllers/RouteDeleteController.php b/app/Http/Controllers/RouteDeleteController.php deleted file mode 100644 index 857ad22..0000000 --- a/app/Http/Controllers/RouteDeleteController.php +++ /dev/null @@ -1,29 +0,0 @@ -page = $pageRepo; - } - - public function handleRequest(Request $request) - { - $path = explode('/', $request->path()); - switch ($path[0]) { - case 'page': - $body = json_decode($request->getContent()); - $result = $this->page->delete($body); - return response()->json($result)->header('Content-Type', 'application/json'); - break; - } - } -} diff --git a/app/Http/Controllers/RouteGetController.php b/app/Http/Controllers/RouteGetController.php deleted file mode 100644 index 0c53be9..0000000 --- a/app/Http/Controllers/RouteGetController.php +++ /dev/null @@ -1,91 +0,0 @@ -dash = $dashController; - $this->gate = $authController; - $this->theme = $themeController; - $this->front = $frontController; - $this->member = $memberRepo; - $this->settings = $settingsService; - } - - public function handleRequest($first = null, $second = null, $third = null, $fourth = null) - { - if (isset($first) && !is_numeric($first)) { - switch ($first) { - case 'dashboard': - if ($this->member::status()) { - return $this->dash->init($second, $third, $fourth); - } else { - return $this->dash->login(); - } - break; - case 'theme': - if ($this->member::status()) { - if (isset($second)) { - return $this->theme->getView($third, $fourth); - } else { - return $this->theme->start(); - } - } else { - return $this->dash->login(); - } - break; - case 'tags': - case 'archives': - return $this->front->page($first, $second, $third); - break; - case 'backup': - return $this->downloadBackup($second); - break; - default: - return $this->front->index($first, $second, $third); - break; - } - } else { - return $this->front->index($first, $second, $third); - } - } - - private function downloadBackup($type) - { - if ($this->member::status()) { - $latest = ''; - $file = ''; - if ($type == 'content-download') { - $latest = $this->settings->getGlobal()['last_content_backup']; - $file = 'backup-content-' . $latest . '.zip'; - } else { - $latest = $this->settings->getGlobal()['last_files_backup']; - $file = 'backup-files-' . $latest . '.zip'; - } - - return response()->download( - '../content/backups/' . $file, - $file, - ['Content-Type: application/zip'] - ); - } - } -} diff --git a/app/Http/Controllers/RoutePostController.php b/app/Http/Controllers/RoutePostController.php deleted file mode 100644 index ffb6b99..0000000 --- a/app/Http/Controllers/RoutePostController.php +++ /dev/null @@ -1,122 +0,0 @@ -page = $pageRepo; - $this->gate = $authController; - $this->maintenance = $maintenanceService; - $this->upload = $fileUploadService; - $this->settings = $settingsService; - $this->member = $memberRepo; - $this->init = $initService; - $this->reset = $resetService; - } - - public function handleRequest(Request $request) - { - $path = explode('/', $request->path()); - switch ($path[0]) { - case 'init': - return $this->initTask($path[1], $request); - break; - case 'login': - return $this->gate->enter($request); - break; - case 'page': - $body = json_decode($request->getContent()); - $result = $this->page->create($body); - return response()->json($result)->header('Content-Type', 'application/json'); - break; - case 'settings': - if ($path[1] == 'mailer') { - return $this->sendNotify($request); - } - break; - case 'upload': - $result = $result = $this->upload->handleFile($request); - //update configs for specfic uploads - switch ($request['source']) { - case 'avatar-upload': - $member = []; - $member = session('member'); - $member['avatar'] = $result['filePath']; - $member = (object) $member; - $this->member->update($member); - break; - case 'background-upload': - $this->settings->updateGlobalData('background', $result['filePath']); - break; - } - return $result; - break; - } - } - - private function initTask($task, $request) - { - $result = []; - switch ($task) { - case 'fresh': - $result = $this->init->fresh(json_decode($request->getContent())); - break; - case 'restore': - $result = $this->init->restore($request); - break; - case 'reset': - $result = $this->reset->site($request); - break; - } - return response()->json($result)->header('Content-Type', 'application/json'); - } - - private function sendNotify($request) - { - $result = []; - try { - Mail::to(env('ADMIN_EMAIL'))->send(new SystemEmail($request->content)); - $result = [ - 'type' => 'mail_good', - 'message' => 'Mail Sent', - ]; - } catch (TransportException $e) { - $result = [ - 'type' => 'mail_not_good', - 'message' => 'Mail Not Sent. It\'s cool. Just check mail settings in the .env', - ]; - } - - return response()->json($result)->header('Content-Type', 'application/json'); - } -} diff --git a/app/Http/Controllers/RoutePutController.php b/app/Http/Controllers/SettingsController.php similarity index 54% rename from app/Http/Controllers/RoutePutController.php rename to app/Http/Controllers/SettingsController.php index fb3a078..45f1889 100644 --- a/app/Http/Controllers/RoutePutController.php +++ b/app/Http/Controllers/SettingsController.php @@ -2,75 +2,55 @@ namespace App\Http\Controllers; -use App\Interfaces\PageRepositoryInterface; -use App\Services\Assets\AssetService; -use App\Services\Assets\RenderService; use App\Interfaces\MemberRepositoryInterface; use App\Services\Data\SettingsService; +use App\Services\Data\SortingService; +use App\Services\Assets\AssetService; +use App\Services\Assets\RenderService; use App\Services\Upkeep\MaintenanceService; +use App\Services\Upkeep\ResetService; use Illuminate\Http\Request; -class RoutePutController extends Controller +class SettingsController extends Controller { - protected $page; + protected $theme; + protected $member; + protected $settings; + protected $sort; protected $assets; protected $render; - protected $settings; - protected $member; protected $maintenance; + protected $reset; public function __construct( - PageRepositoryInterface $pageRepo, - AssetService $assetService, - RenderService $renderService, - SettingsService $settingsService, + ThemeController $themeController, MemberRepositoryInterface $memberRepo, + SettingsService $settingsService, + SortingService $sortingService, + AssetService $assetsService, + RenderService $renderService, MaintenanceService $maintenanceService, + ResetService $resetService, ) { - $this->page = $pageRepo; - $this->assets = $assetService; - $this->render = $renderService; - $this->settings = $settingsService; + $this->theme = $themeController; $this->member = $memberRepo; + $this->settings = $settingsService; + $this->sort = $sortingService; + $this->assets = $assetsService; + $this->render = $renderService; $this->maintenance = $maintenanceService; + $this->reset = $resetService; } - public function handleRequest(Request $request) + public function start() { - $path = explode('/', $request->path()); - switch ($path[0]) { - case 'page': - $body = json_decode($request->getContent()); - $result = $this->page->update($body); - return response()->json($result)->header('Content-Type', 'application/json'); - break; - case 'settings': - return $this->settingsTasks($request, $path[1]); - break; - case 'backup': - return $this->createBackup($request); - break; - } + return view('back.settings', ['settings' => $this->sort->settings(), 'nav' => $this->sort->navigation()]); } - private function createBackup($request) - { - $body = json_decode($request->getContent()); - if ($body->task == 'content_backup') { - return response()->json( - $this->maintenance->createContentBackUp() - )->header('Content-Type', 'application/json'); - } else { - return response()->json( - $this->maintenance->createFileBackUp() - )->header('Content-Type', 'application/json'); - } - } - - private function settingsTasks($request, $task) + public function tasks(Request $request) { $result = []; - switch ($task) { + switch (explode("/", $request->getURI())[5]) { case 'publish': $this->assets->moveToTheme(true); $result = $this->render->publishAll(); @@ -89,4 +69,45 @@ class RoutePutController extends Controller } return response()->json($result)->header('Content-Type', 'application/json'); } + + public function createBackup(Request $request) + { + $body = json_decode($request->getContent()); + if ($body->task == 'content_backup') { + return response()->json( + $this->maintenance->createContentBackUp() + )->header('Content-Type', 'application/json'); + } else { + return response()->json( + $this->maintenance->createFileBackUp() + )->header('Content-Type', 'application/json'); + } + } + + public function downloadBackup($type) + { + if ($this->member::status()) { + $latest = ''; + $file = ''; + if ($type == 'content-download') { + $latest = $this->settings->getGlobal()['last_content_backup']; + $file = 'backup-content-' . $latest . '.zip'; + } else { + $latest = $this->settings->getGlobal()['last_files_backup']; + $file = 'backup-files-' . $latest . '.zip'; + } + + return response()->download( + '../content/backups/' . $file, + $file, + ['Content-Type: application/zip'] + ); + } + } + + public function reset(Request $request) + { + $result = $this->reset->site($request); + return response()->json($result)->header('Content-Type', 'application/json'); + } } diff --git a/app/Http/Controllers/SystemMailController.php b/app/Http/Controllers/SystemMailController.php index ccfaeed..2ee45e9 100644 --- a/app/Http/Controllers/SystemMailController.php +++ b/app/Http/Controllers/SystemMailController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers; use Illuminate\Support\Facades\Mail; +use App\Mail\SystemEmail; +use Illuminate\Http\Request; class SystemMailController extends Controller { @@ -14,4 +16,23 @@ class SystemMailController extends Controller $message = "This is something important. Probably"; Mail::to(env('ADMIN_EMAIL'))->send(new SystemEmail($message)); } + + public function sendNotify(Request $request) + { + $result = []; + try { + Mail::to(env('ADMIN_EMAIL'))->send(new SystemEmail($request->content)); + $result = [ + 'type' => 'mail_good', + 'message' => 'Mail Sent', + ]; + } catch (TransportException $e) { + $result = [ + 'type' => 'mail_not_good', + 'message' => 'Mail Not Sent. It\'s cool. Just check mail settings in the .env', + ]; + } + + return response()->json($result)->header('Content-Type', 'application/json'); + } } diff --git a/app/Http/Controllers/ThemeController.php b/app/Http/Controllers/ThemeController.php index e70d09a..4ecb97f 100644 --- a/app/Http/Controllers/ThemeController.php +++ b/app/Http/Controllers/ThemeController.php @@ -61,7 +61,7 @@ class ThemeController extends Controller $template = $currentTheme . '.page'; //if coming from theme page, grabs id of latest page if ($id == null) { - $uuid = $this->getPageUUID(); + $page = $this->pages->getByUuid($this->getPageUUID()); } else { //get page by uuid $page = $this->pages->getByUuid($id); diff --git a/app/Http/Middleware/MemberCheck.php b/app/Http/Middleware/MemberCheck.php index c68f1f2..e993cb4 100644 --- a/app/Http/Middleware/MemberCheck.php +++ b/app/Http/Middleware/MemberCheck.php @@ -4,16 +4,16 @@ namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; -use App\Services\AuthService; +use App\Interfaces\MemberRepositoryInterface; class MemberCheck { - protected $auth; + protected MemberRepositoryInterface $member; public function __construct( - AuthService $authService, + MemberRepositoryInterface $memberRepo, ) { - $this->auth = $authService; + $this->member = $memberRepo; } /** @@ -23,7 +23,7 @@ class MemberCheck */ public function handle(Request $request, Closure $next) { - if ($this->auth::status()) { + if ($this->member::status()) { return $next($request); } else { return redirect('dashboard'); diff --git a/public/assets/css/dash/navigation.css b/public/assets/css/dash/navigation.css index de426fc..4898dfd 100644 --- a/public/assets/css/dash/navigation.css +++ b/public/assets/css/dash/navigation.css @@ -1,10 +1,8 @@ -article.navigation { - width: 100%; - max-width: 900px; - margin: 100px auto; +main > article > section.settings-tabs > section#site-menu { + padding: 10px 0; } -article.navigation > section > div.nav-item { +main > article > section.settings-tabs > section#site-menu > div.nav-item { display: block; width: 98%; background: var(--secondary); @@ -15,7 +13,7 @@ article.navigation > section > div.nav-item { cursor: move; } -article.navigation > section > div.nav-item > label { +main > article > section.settings-tabs > section#site-menu > label { display: inline-block; padding: 5px; margin: 12px 0 0 10px; @@ -23,24 +21,30 @@ article.navigation > section > div.nav-item > label { cursor: move; } -article.navigation > section > div.nav-item > div#nav-btns { +main > article > section.settings-tabs > section#site-menu > div.nav-item > div#nav-btns { float: right; padding: 5px; position: relative; } -article.navigation > section > div.nav-item > div#nav-btns button { +main + > article + > section.settings-tabs + > section#site-menu + > div.nav-item + > div#nav-btns + button { margin-left: 5px; } @media only screen and (max-width: 500px) { - article.navigation > section > div.nav-item > label { + main > article > section.settings-tabs > section#site-menu > div.nav-item > label { width: 55%; margin: 0; font-size: 0.8em; } - article.navigation > section i { + main > article > section.settings-tabs > section#site-menu > section i { font-size: 1.5em; } } diff --git a/public/assets/css/dash/settings.css b/public/assets/css/dash/settings.css index 69dedc0..35ebc8b 100644 --- a/public/assets/css/dash/settings.css +++ b/public/assets/css/dash/settings.css @@ -17,7 +17,7 @@ article[class="settings"] label { } article.settings div.tab-toolbar button { - width: 180px; + width: 120px; height: 40px; color: var(--secondary); } diff --git a/public/assets/scripts/dash/app/actions/NavActions.js b/public/assets/scripts/dash/app/actions/NavActions.js index 638e35b..484bb3f 100644 --- a/public/assets/scripts/dash/app/actions/NavActions.js +++ b/public/assets/scripts/dash/app/actions/NavActions.js @@ -8,7 +8,7 @@ export default class NavActions { //-------------------------- syncMenu() { let navData = []; - let items = document.getElementById('nav-items').children; + let items = document.getElementById('site-menu').children; for (let index = 0; index < items.length; index++) { navData.push({ title: items[index].getElementsByTagName('label')[0].innerHTML, diff --git a/public/assets/scripts/dash/app/controllers/NavIndex.js b/public/assets/scripts/dash/app/controllers/NavIndex.js index b726c1b..2e05e39 100644 --- a/public/assets/scripts/dash/app/controllers/NavIndex.js +++ b/public/assets/scripts/dash/app/controllers/NavIndex.js @@ -20,7 +20,7 @@ export default class NavIndex { start() { //grabs elements and makes them sortables let self = this; - Sortable.create(document.getElementById('nav-items'), { + Sortable.create(document.getElementById('site-menu'), { onUpdate: () => { new NavActions().syncMenu().then(data => { notify.alert('Updating Menu', null); @@ -68,7 +68,7 @@ export default class NavIndex { case 'edit-item': self.processing = false; window.location = - '/dashboard/page/edit/' + e.target.getAttribute('data-uuid'); + '/dashboard/pages/edit/' + e.target.getAttribute('data-uuid'); break; } } diff --git a/public/assets/scripts/dash/app/controllers/PageEditor.js b/public/assets/scripts/dash/app/controllers/PageEditor.js index 3a0e2ce..d333d0e 100644 --- a/public/assets/scripts/dash/app/controllers/PageEditor.js +++ b/public/assets/scripts/dash/app/controllers/PageEditor.js @@ -212,7 +212,7 @@ export default class PostEditor { notify.alert(r.message, true); } else { notify.alert(r.message, true); - window.location = '/dashboard/page/edit/' + r.id; + window.location = '/dashboard/pages/edit/' + r.id; } } }) diff --git a/public/assets/scripts/dash/libraries/ContentRequest.js b/public/assets/scripts/dash/libraries/ContentRequest.js index dba8aa8..e219015 100644 --- a/public/assets/scripts/dash/libraries/ContentRequest.js +++ b/public/assets/scripts/dash/libraries/ContentRequest.js @@ -7,17 +7,17 @@ export const REQUEST_TYPE_DELETE = 'DELETE'; export const CONTENT_TYPE_JSON = 'json'; export const CONTENT_TYPE_FORM = 'x-www-form-urlencoded'; //** ACTIONS URLS **// -export const API_NEW_PAGE = '/page/create'; -export const API_EDIT_PAGE = '/page/write'; -export const API_DELETE_PAGE = '/page/delete'; -export const API_GET_SETTINGS = '/settings/site'; -export const API_SETTINGS_SYNC = '/settings/sync'; -export const API_PUBLISH_PAGES = '/settings/publish'; -export const API_NAV_SYNC = '/settings/nav-sync'; +export const API_NEW_PAGE = '/dashboard/pages/create'; +export const API_EDIT_PAGE = '/dashboard/pages/write'; +export const API_DELETE_PAGE = '/dashboard/pages/delete'; +export const API_GET_SETTINGS = '/dashboard/settings/site'; +export const API_SETTINGS_SYNC = '/dashboard/settings/sync'; +export const API_PUBLISH_PAGES = '/dashboard/settings/publish'; +export const API_NAV_SYNC = '/dashboard/settings/nav-sync'; export const API_GET_MEMBER_INFO = '/settings/member'; export const API_REINDEX_PAGES = '/settings/reindex'; -export const API_SEND_MAIL = '/settings/mailer'; +export const API_SEND_MAIL = '/dashboard/mailer'; export const API_LOGIN = '/login'; //** ACTIONS TASKS **// diff --git a/public/assets/scripts/dash/libraries/MaintenanceRequest.js b/public/assets/scripts/dash/libraries/MaintenanceRequest.js index 11932af..2e998d7 100644 --- a/public/assets/scripts/dash/libraries/MaintenanceRequest.js +++ b/public/assets/scripts/dash/libraries/MaintenanceRequest.js @@ -9,11 +9,11 @@ export const CONTENT_TYPE_FORM = 'x-www-form-urlencoded'; //** API URLS **// export const API_INIT = '/init/fresh'; export const API_RESTORE = '/init/restore'; -export const API_RESET = '/init/reset'; -export const API_CREATE_BACKUP = '/backup/create'; -export const API_DOWNLOAD_BACKUP = '/backup/download'; -export const API_RESTORE_BACKUP = '/backup/restore'; -export const API_FILES_UPLOAD = '/upload/files'; +export const API_RESET = '/dashboard/settings/reset'; +export const API_CREATE_BACKUP = '/dashboard/settings/backup/create'; +export const API_DOWNLOAD_BACKUP = '/dashboard/settings/backup/download'; +export const API_RESTORE_BACKUP = '/dashboard/settings/backup/restore'; +export const API_FILES_UPLOAD = '/dashboard/uploads'; //export const API_RESET_PASS = '/api/v1/reset-password'; @@ -23,7 +23,7 @@ export const TASK_BACKUP_RESTORE = 'restoreBackup'; export const TASK_BACKUP_CREATE = 'createBackup'; export const TASK_GET_SECRET = 'retrieveSecret'; export const TASK_RESET_PASS = 'resetPassword'; -export const TASK_UPLOAD_FILES = 'uploadFiles'; +export const TASK_UPLOAD_FILES = '/task/uploadFiles'; //** API STATUS **// export const API_ACCESS_GOOD = 'apiUseAuthorized'; export const API_ACCESS_BAD = 'apiUseNotAuthorized'; diff --git a/resources/views/back/navigation.blade.php b/resources/views/back/navigation.blade.php deleted file mode 100644 index c48e498..0000000 --- a/resources/views/back/navigation.blade.php +++ /dev/null @@ -1,33 +0,0 @@ -@extends('frame') - -@section('title', 'The Dash | Edit Navigation') - -@section('main-content') - -@endsection -@section('scripting') - - @endsection diff --git a/resources/views/back/settings.blade.php b/resources/views/back/settings.blade.php index f8fa25d..531bc01 100644 --- a/resources/views/back/settings.blade.php +++ b/resources/views/back/settings.blade.php @@ -1,169 +1,198 @@ -@extends('frame') +@extends('frame') + -@section('title', 'The Dash | '. $title) +@section('title', 'The Dash | '. $settings['title']) -@section('main-content') -
- -
-
-
-
- -
-
-
- -
-
- - - -
-
- - -
-
- -
-
-
- - {{ $member['key'] }} + @section('main-content') +
+ +
+
+
+
+ +
+
+
+
-
- {{ $ftoken }} + + +
- -
-
-
-
-
-
- set email settings in .env file + +
-
-
-
- - - - @if(isset($apiStatus) && $apiStatus == 'true') - - @else - - @endif +
+
-
- - - - @if(isset($dynamicRenderStatus) && $dynamicRenderStatus == 'true') - +
+
+ + {{$settings['member']['key']}} +
+
+
+ {{$settings['ftoken']}} +
- @else - - - @endif
-
-
-
- - - -
+
+
+ - - @if($lastContentBackup != '') - MOST RECENT: - {{ $lastContentBackup }}
+
+
+ set email settings in .env file +
+
+
+
+ + + + @if(isset($settings['apiStatus']) && $settings['apiStatus'] == 'true') + @else - span No back ups. Frowny face. + @endif - -
-
- - - - - - @if($lastFilesBackup != '') - MOST RECENT: - {{ $lastFilesBackup }}
+
+
+ + + + @if(isset($settings['dynamicRenderStatus']) && $settings['dynamicRenderStatus'] == 'true') + + @else - span No back ups. Frowny face. + + @endif - +
-
- - - - - Deletes all content and configs CANNOT UNDO +
+
+ + + + + + @if($settings['lastContentBackup'] != '') + MOST RECENT: + {{$settings['lastContentBackup']}}
+ @else + span No back ups. Frowny face. + @endif + +
+
+ + + + + + @if($settings['lastFilesBackup'] != '') + MOST RECENT: + {{$settings['lastFilesBackup']}}
+ @else + span No back ups. Frowny face. + @endif +
+
+
+ + + + + Deletes all content and configs CANNOT UNDO +
-
-
-
- @foreach($themes as $theme) - @if($theme['name'] == $currentTheme) - - + @else + + @endif + @endforeach +
+
- -
-@endsection - @section('scripting') - - @endsection + + @endsection + @section('scripting') + + + @endsection \ No newline at end of file diff --git a/resources/views/back/start.blade.php b/resources/views/back/start.blade.php index 26a929d..bd586f9 100644 --- a/resources/views/back/start.blade.php +++ b/resources/views/back/start.blade.php @@ -1,38 +1,38 @@ -@extends('frame') +@extends('frame') @section('title', 'The Dash | Start') - @section('main-content') -
-
-

Recent

-
-
-
-
- @if($result['entryCount'] != 0) - @foreach($result['pages'] as $page) - @php + @section('main-content') +
+
+

Recent

+
+
+
+
+ @if($result['entryCount'] != 0) + @foreach($result['pages'] as $page) + @php $type = ''; $file = ''; isset($page['media'][0]['type']) ? $type = $page['media'][0]['type'] : $type = ''; isset($page['media'][0]['file']) ? $file = $page['media'][0]['file'] : $file = ''; - @endphp - @if($type =='mp4') - - @include('includes.recent-meta') - - - @else - - @include('includes.recent-meta') - - @endif - @endforeach - @endif -
+ @endphp + @if($type =='mp4') + + @include('includes.recent-meta') + + + @else + + @include('includes.recent-meta') + + @endif + @endforeach + @endif +
- @endsection + @endsection \ No newline at end of file diff --git a/resources/views/includes/nav.blade.php b/resources/views/includes/nav.blade.php index f9a0b7d..3877dea 100644 --- a/resources/views/includes/nav.blade.php +++ b/resources/views/includes/nav.blade.php @@ -8,6 +8,7 @@ @include('includes.submenu-start') @break + @case("Add New") @case("Edit Page") @include('includes.submenu-edit-page') @break @@ -17,11 +18,6 @@ - - - - - @@ -55,11 +51,6 @@ - - - - - diff --git a/resources/views/includes/options.blade.php b/resources/views/includes/options.blade.php index 0aaeb43..2ded2c9 100644 --- a/resources/views/includes/options.blade.php +++ b/resources/views/includes/options.blade.php @@ -42,7 +42,7 @@ if(isset($page['uuid'])) - - {{ $page['updated'] }} + {{$page['updated']}} -
+
@php $title = urldecode($page['title']); @endphp - {{ $title }} + {{$title}} -
- - - - + \ No newline at end of file diff --git a/resources/views/includes/submenu-start.blade.php b/resources/views/includes/submenu-start.blade.php index 5e5985e..8a45e0a 100644 --- a/resources/views/includes/submenu-start.blade.php +++ b/resources/views/includes/submenu-start.blade.php @@ -4,7 +4,7 @@
- + diff --git a/resources/views/theme/start.blade.php b/resources/views/theme/start.blade.php index 48fb74c..7fb2443 100644 --- a/resources/views/theme/start.blade.php +++ b/resources/views/theme/start.blade.php @@ -1,23 +1,23 @@ -@extends('frame') +@extends('frame') @section('title', 'The Dash | Fipamo Theme Kit') - @section('main-content') -
-
-

Templates

-

Base

-
Index
- Page
- Tags
- Archive
-

Custom

- @foreach($pages as $view) - @if($view != 'page') - {{ $view }}
- @endif - @endforeach -
-
-
- @endsection + @section('main-content') +
+
+

Templates

+

Base

+ Index
+ Page
+ Tags
+ Archive
+

Custom

+ @foreach($pages as $view) + @if($view != 'page') + {{$view}}
+ @endif + @endforeach +
+
+
+ @endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 5b165d9..c6fa6fc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,28 +1,74 @@ controller(FrontController::class) + ->group(function () { + Route::get("/{one?}/{two?}/{three?}", 'start')->where('one', '^((?!dashboard).)*$'); + Route::post("/init/{task}", 'init'); + }); -//REFACTOR: Reorganize routes here intstead of controllers to reduce confusion -Route::get("/{first?}/{second?}/{third?}/{four?}", [RouteGetController::class, 'handleRequest']); -Route::post("/{first?}/{second?}/{third?}", [RoutePostController::class, 'handleRequest']) - ->middleware(VerifyCsrfToken::class); -Route::put("/{first?}/{second?}/{third?}", [RoutePutController::class, 'handleRequest']) - ->middleware(VerifyCsrfToken::class); -Route::delete("/{first?}/{second?}/{third?}", [RouteDeleteController::class, 'handleRequest']) - ->middleware(VerifyCsrfToken::class); +//login stuff +Route::post("/login", [AuthController::class, 'enter']); + +//Dashboard +Route::prefix('dashboard') + ->middleware('member.check') + ->controller(DashController::class) + ->group(function () { + Route::get("/", 'login')->withoutMiddleware('member.check'); + Route::get("/start", 'start'); + Route::get("/logout", 'logout'); + Route::post("/uploads", 'uploads'); + })->name('dashboard'); + +//Pages +Route::prefix('dashboard/pages') + ->middleware('member.check') + ->controller(PageController::class) + ->group(function () { + Route::get("/{pageFilter?}/{pageNum?}", 'start'); + Route::get("/{mode?}/{uuid?}", 'start'); + Route::put("/write", 'write'); + Route::post("/create", 'create'); + Route::delete("/delete", 'delete'); + }); + +//Settings +Route::prefix('dashboard/settings') + ->middleware('member.check') + ->controller(SettingsController::class) + ->group(function () { + Route::get("/", 'start'); + Route::put("/{task}", 'tasks'); + Route::put("/backup/create", 'createBackup'); + Route::get("/backup/get/{type}", 'downloadBackup'); + Route::post("/reset", 'reset'); + }); + +//mailer +Route::prefix('dashboard/mailer') + ->middleware('member.check') + ->controller(SystemMailController::class) + ->group(function () { + Route::post("/", 'sendNotify'); + }); + +//themekit +Route::prefix('dashboard/themekit') + ->middleware('member.check') + ->controller(ThemeController::class) + ->group(function () { + Route::get("/", 'start'); + Route::get("/view/{view?}/{id?}", 'getView'); + });