fipamo/app/Services/Data/SortingService.php
ro 36d04c8f68
reorganized services
service classes are beginning to swell as there functionality is being
fleshed out, so a new organizational structure was needed to make sure
class sizes don't become too large and to increase site managability and
legibilty as more features get added and the code base grows.

data is for retrieving, managing site information, assets interact with external files
and upkeep is for maintenance.

some additional tweaks were also made to the options menu template to
prep it for it's transition to a toolbar component
2024-05-12 22:14:53 -06:00

290 lines
10 KiB
PHP

<?php
namespace App\Services\Data;
use Carbon\Carbon;
use function _\find;
use function _\filter;
class SortingService
{
private $p_tags = [];
private $p_archive = [];
private $settings;
private $contents;
private $themes;
private $info = [];
public function __construct(
SettingsService $settingsService,
ContentService $contentService,
ThemeService $themeService,
) {
$this->settings = $settingsService;
$this->contents = $contentService;
$this->themes = $themeService;
$global = $this->settings->getGlobal();
$this->info = [
'keywords' => isset($global['keywords'])
? $global['keywords']
: 'fipamo, blog, jamstack, php, markdown, js',
'menu' => $this->settings->getMenu(),
'tags' => $this->settings->getTags(),
'description' => $global['descriptions'],
'image' => $global['base_url'] . $global['background'],
'baseURL' => $global['base_url'],
'dynamicRender' => $global['dynamicRender'],
'theme' => $global['theme'],
];
}
public function tags($debug = true)
{
$pages = $this->contents->loadAllPages();
foreach ($pages as $page) {
$temp = [];
if (isset($page['tags'])) {
$temp = explode(',', $page['tags']);
foreach ($temp as $tag) {
$label = trim($tag);
if (!find($this->p_tags, ['tag_name' => $label])) {
array_push($this->p_tags, [
'tag_name' => $label,
'slug' => safeString($label),
'pages' => $this->tagPages($label, $pages),
]);
}
}
}
}
$tagData = [];
//dd($this->settings->getTags()['pages']);
$tagData = [
'debug' => $debug, // for theme kit
'tags' => $this->p_tags,
'theme' => $this->info['theme'], // for theme kit
'title' => 'Pages Tagged as Tag',
'dynamicRender' => $this->info['dynamicRender'],
'pages' => $this->settings->getTags()['pages'],
'info' => $this->info,
'menu' => $this->settings->getMenu(),
'media' => [
['file' => $this->info['image'],
'type' => trim(pathinfo($this->info['image'], PATHINFO_EXTENSION))]
]
];
return $tagData;
}
private function tagPages($tag, $pages)
{
$tagged = [];
foreach ($pages as $page) {
if (isset($page['tags'])) {
if (strpos($page['tags'], $tag) !== false) {
array_push($tagged, [
'title' => $page['title'],
'slug' => $page['slug'],
'path' => $page['path'],
'feature' => $page['feature'],
]);
}
}
}
return $tagged;
}
public function archive($debug = true)
{
$pages = $this->contents->loadAllPages();
$years = [];
$archive = [];
foreach ($pages as $page) {
$date = explode('/', $page['path']);
if (!find($years, ['year' => trim($date[0])])) {
$findPages = filter($pages, ['createdYear' => trim($date[0])]);
array_push(
$years,
[
'year' => trim($date[0]),
'count' => count($findPages),
]
);
}
}
foreach ($years as $year) {
$sorted = [];
$filtered = filter($pages, ['createdYear' => $year['year']]);
foreach ($filtered as $obj) {
$month = date('m', date($obj['rawCreated']));
if (!find($sorted, ['month' => $month])) {
$perMonth = filter(
$pages,
[
'path' => $year['year'] . '/' . $month,
'deleted' => false,
'published' => true,
'layout' => 'page',
]
);
array_push($sorted, [
'month' => $month,
'full_month' => date('F', date($obj['rawCreated'])),
'count' => count($perMonth),
'pages' => $perMonth,
]);
}
}
array_push($this->p_archive, [
'year' => $year['year'],
'year_data' => $sorted,
]);
}
$archive_data = [];
$archiveData = [
'debug' => $debug, // for theme kit
'theme' => $this->info['theme'], // for theme kit
'title' => 'Archives',
'dynamicRender' => $this->info['dynamicRender'],
'archive' => $this->p_archive,
'info' => $this->info,
'menu' => $this->settings->getMenu(),
'media' => [
['file' => $this->info['image'],
'type' => trim(pathinfo($this->info['image'], PATHINFO_EXTENSION))]
],
];
return $archiveData;
}
public function page($page, $debug = true)
{
$pageOptions = [];
$tags = [];
if (isset($page['tags'])) {
$taglist = explode(',', $page['tags']);
foreach ($taglist as $tag) {
$label = trim($tag);
array_push($tags, [
'label' => $label . ' ',
'slug' => safeString($label),
]);
}
}
$meta = [
'who' => $page['author'],
'when' => $page['created'],
'tags' => $tags,
];
// if page feature isn't empty, find image from list and set it as background image
// if it is empty, just use global background
if ($page['feature'] != '' || $page['feature'] != null) {
$media = explode(',', $page['feature']);
$set = false;
foreach ($media as $file) {
$item = trim($file);
$ext = pathinfo($item, PATHINFO_EXTENSION);
if ($ext != 'mp4' && !$set) {
$this->info['image'] = $this->info['baseURL'] . $item;
$set = true;
}
}
}
$recent = [];
$featured = [];
$limit = 4;
$pages = $this->contents->loadAllPages();
foreach ($pages as $item) {
if (
!$item['deleted'] &&
$item['published'] &&
$item['menu'] != 'true'
) {
if (count($recent) < $limit) {
array_push($recent, [
'path' => $item['path'],
'slug' => $item['slug'],
'title' => $item['title'],
'feature' => $item['feature'],
]);
}
if ($item['featured'] == true) {
if (count($featured) < $limit) {
array_push($featured, [
'path' => $item['path'],
'slug' => $item['slug'],
'title' => $item['title'],
'feature' => $item['feature'],
]);
}
}
}
}
$pageData = [
"debug" => $debug,
"theme" => $this->info['theme'],
"status" => session('member') != null ? true : false,
"title" => $page['title'],
"meta" => $meta,
"menu" => $this->settings->getMenu(),
"info" => $this->info,
"media" => $page['media'],
"files" => $page['docs'],
"content" => $page['html'],
"recent" => $recent,
"feature" => $featured,
"tags" => $meta['tags'],
"dynamicRender" => $this->info['dynamicRender'],
];
return $pageData;
}
public function navigation()
{
$pageOptions = [
'title' => 'Edit Navigation',
'status' => session('member') != '' ? true : false,
'menu' => $this->settings->getMenu(),
];
return $pageOptions;
}
public function settings()
{
$global = $this->settings->getGlobal();
$email = $this->settings->getEmail();
$updated = new Carbon($global['last_backup']);
$status = session('member') != '' ? true : false;
$pageOptions = [
'title' => 'Settings',
'private' => $global['private'],
'renderOnSave' => $global['renderOnSave'],
'background' => $global['background'],
'member' => session('member'),
'ftoken' => session('form_token'),
'siteTitle' => $global['title'],
'baseUrl' => $global['base_url'],
'desc' => $global['descriptions'],
'lastBackup' => $updated->format('Y F d H i s'),
'currentTheme' => $global['theme'],
'themes' => $this->themes->getThemes(),
'apiStatus' => isset($global['externalAPI']) ? $global['externalAPI'] : 'false',
'dynamicRenderStatus' => isset($global['dynamicRender']) ? $global['dynamicRender'] : 'false',
'mailOption' => $email['active'],
'mailConfig' => $email,
'status' => $status,
];
return $pageOptions;
}
}