From 4c9fbc3dedc1e87c19ec656e8bfb0759b7338cf0 Mon Sep 17 00:00:00 2001 From: ro Date: Tue, 20 May 2025 17:10:57 -0600 Subject: [PATCH] Added RSS plugged in a simple rss component so fipamo sites can be subscribed to through feed reeders. routing needed a bit of updating to make it work, so it's been edited to accomodate any new url that deviate from created pages. long live RSS --- app/Http/Controllers/FrontController.php | 159 +++++++++++++---------- app/Http/Controllers/RSSController.php | 88 +++++++++++++ routes/web.php | 31 +++-- 3 files changed, 198 insertions(+), 80 deletions(-) create mode 100644 app/Http/Controllers/RSSController.php diff --git a/app/Http/Controllers/FrontController.php b/app/Http/Controllers/FrontController.php index d17de85..a20d7fd 100644 --- a/app/Http/Controllers/FrontController.php +++ b/app/Http/Controllers/FrontController.php @@ -20,6 +20,7 @@ class FrontController extends Controller protected SortingService $sort; protected $init; protected $dash; + protected $words; public function __construct( PageRepositoryInterface $pageRepository, @@ -35,91 +36,107 @@ class FrontController extends Controller $this->sort = $sortService; $this->init = $initService; $this->dash = $dashController; + $this->words = ['words']; } - public function start($one = 00, $two = 00, $three = 00) + public function start() { - $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 ($this->configCheck()) { + $pages = $this->pages->getAll(); + $global = $this->settings->getGlobal(); + $currentTheme = $this->assets->getCurrentTheme(); if ($global['dynamicRender'] == 'true') { - 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($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']; - } - } - } + $page = $pages->where('id', 0)->first(); + $pageData = $this->sort->page($page, false); + $template = $currentTheme . '.index'; return view($template, $pageData); } else { - if (is_file('../public/index.html')) { - return response()->file('../public/index.html'); - } else { - return redirect()->intended('dashboard/start'); - } + return response()->file('../public/index.html'); } + } + } + + public function page($year, $month, $slug) + { + $template; + $pageData = []; + if ($this->configCheck()) { + $pages = $this->pages->getAll(); + $currentTheme = $this->assets->getCurrentTheme(); + $page = $this->pages->getBySlug($slug); + $pageData = $this->sort->page($page, false); + $template = $currentTheme . '.' . $page['layout']; + return view($template, $pageData); + } + } + + public function menu($slug, $option = null) + { + $template; + $pageData = []; + if ($this->configCheck()) { + $currentTheme = $this->assets->getCurrentTheme(); + switch ($slug) { + 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' => $option]); + $pageData = [ + 'theme' => $currentTheme, // for theme kit + 'title' => 'Pages Tagged as ' . $option, + 'dynamicRender' => $tags['dynamicRender'], + 'info' => $tags['info'], + 'menu' => $tags['menu'], + 'pages' => $tagData['pages'], + 'media' => $tags['media'], + ]; + break; + default: + $pages = $this->pages->getAll(); + $currentTheme = $this->assets->getCurrentTheme(); + $page = $this->pages->getBySlug($slug); + $pageData = $this->sort->page($page, false); + $template = $currentTheme . '.' . $page['layout']; + break; + } + + return view($template, $pageData); + } + } + + private function configCheck() + { + if (file_exists(env('FOLKS_PATH')) && file_exists(env('SETTINGS_PATH'))) { + return true; } else { return view('back.init', ["status" => false, "title" => "Set Up"]); } } + public function things() + { + return $items = ['archive', 'archives', 'tags']; + } + + public static function items() + { + //set permanent links + $items = ['archive', 'archives', 'tags']; + //grab menu items and set to array so router knows to look for them + $settings = json_decode(file_get_contents(env('SETTINGS_PATH')), true); + foreach ($settings['menu'] as $item) { + array_push($items, $item['slug']); + } + return $items; + } + //setup up a new site or restore from back up public function init($task, Request $request) { diff --git a/app/Http/Controllers/RSSController.php b/app/Http/Controllers/RSSController.php new file mode 100644 index 0000000..4b4b1e7 --- /dev/null +++ b/app/Http/Controllers/RSSController.php @@ -0,0 +1,88 @@ +settings = $settingsService; + $this->pages = $pageRepo; + } + + public function getFeed(Request $request) + { + $pages = $this->pages->getAll(); + $global = $this->settings->getGlobal(); + $feedContent = " + + + {$global['title']} + + {$global['base_url']} + Feed @ {$global['title']} + en-us"; + + // Loop over the content and add it to the feed + foreach ($pages as $item) { + $title = urldecode($item['title']); + $html = urldecode($item['html']); + $updatedAt = Carbon::parse($item['rawUpdated']); + $date = $updatedAt->format('D, d M Y H:i:s O'); + $feedContent .= " + + {$title} + {$global['base_url']}/rss/feed/item/{$item['uuid']} + {$global['base_url']}/rss/feed/item/{$item['uuid']} + {$date} + + "; + } + + $feedContent .= " + + "; + + return response($feedContent, 200)->header('Content-Type', 'application/rss+xml'); + /** + //set up feed info + header("Content-Type: text/xml"); + echo(""); + echo(""); + echo(""); + echo("" . $global['title'] . ""); + echo("" . $global['base_url'] . ""); + echo("The Feed for " . $global['title'] . ""); + + //item loop start + + foreach ($pages as $item) { + echo(""); + echo("" . urldecode($item['title']) . ""); + echo("" . $global['base_url'] . "/rss/feed/item/" . $item['uuid'] . ""); + echo("" . $global['base_url'] . "/rss/feed/item/" . $item['uuid'] . ""); + echo("" . $item['updated'] . ""); + echo("" . $item['created'] . ""); + echo(" "); + echo("" . $item['author'] . ""); + echo(""); + } + + //item loop end + + //close it up + echo(""); + echo(""); + **/ + } +} diff --git a/routes/web.php b/routes/web.php index 4326e4b..cd602b7 100644 --- a/routes/web.php +++ b/routes/web.php @@ -8,12 +8,17 @@ use App\Http\Controllers\DashController; use App\Http\Controllers\SettingsController; use App\Http\Controllers\ThemeController; use App\Http\Controllers\SystemMailController; +use App\Http\Controllers\RSSController; //Frontend Route::prefix('/') ->controller(FrontController::class) ->group(function () { - Route::get("/{one?}/{two?}/{three?}", 'start')->where('one', '^((?!dashboard).)*$'); + Route::get("/", 'start'); + Route::get("/{year}/{month}/{slug}", 'page') + ->where(['year' => '[0-9]+', 'month' => '[0-9]+', 'slug' => '[A-Za-z0-9-]+']); + Route::get("/{slug}/{option?}", 'menu') + ->whereIn('slug', FrontController::items()); Route::post("/init/{task}", 'init'); }); @@ -52,14 +57,6 @@ Route::prefix('dashboard/settings') 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') @@ -68,3 +65,19 @@ Route::prefix('dashboard/themekit') Route::get("/", 'start'); Route::get("/view/{view?}/{id?}", 'getView'); }); + +//mailer +Route::prefix('dashboard/mailer') + ->middleware('member.check') + ->controller(SystemMailController::class) + ->group(function () { + Route::post("/", 'sendNotify'); + }); + +//RSS + +Route::prefix('rss/feed') + ->controller(RSSController::class) + ->group(function () { + Route::get("/", 'getFeed'); + });