cleaned up the code to get a massive boost to publishing and page rendering speeds the issue was related to pages being collected and transformed into objects the system could use multiple times, resulting in sluggish rendering due to available memory getting drained to accomodate a long script running more than it was needed. edited the rendering process so the script is only called one and the data is passed to the respective functions that require that data. also plugged in some minor manual garbage collection that speed up the process a bit more there was also a bug with rendering the tags file that was resulting in the `tags.json` file being unusually large. the issue was tags were getting replicated in the process resulting in adding duplicates to the tag file everytime it was run. go rid of the unnecessary function that was calling the replicate tags array and now the tags file is it's appropriate size whew, this turned out to be a big one that wasn't meant to be, but the peformance boost was worth it
186 lines
6.3 KiB
PHP
186 lines
6.3 KiB
PHP
<?php
|
|
|
|
namespace App\Repositories;
|
|
|
|
use App\Interfaces\PageRepositoryInterface;
|
|
//Asset Services
|
|
use App\Services\Assets\DocService;
|
|
use App\Services\Assets\RenderService;
|
|
//Data Services
|
|
use App\Services\Data\SettingsService;
|
|
use App\Services\Data\ContentService;
|
|
use App\Services\Data\PaginateService;
|
|
use App\Services\Data\SortingService;
|
|
use Carbon\Carbon;
|
|
|
|
class PageRepository implements PageRepositoryInterface
|
|
{
|
|
protected $content;
|
|
protected $settings;
|
|
protected $paginate;
|
|
protected $pages;
|
|
protected $docs;
|
|
protected $sort;
|
|
protected $render;
|
|
|
|
public function __construct(
|
|
ContentService $contentService,
|
|
SettingsService $settingsService,
|
|
PaginateService $paginateService,
|
|
DocService $docService,
|
|
SortingService $sortingService,
|
|
RenderService $renderService
|
|
) {
|
|
$this->content = $contentService;
|
|
$this->settings = $settingsService;
|
|
$this->paginate = $paginateService;
|
|
$this->docs = $docService;
|
|
$this->sort = $sortingService;
|
|
$this->render = $renderService;
|
|
//change this because every time the class is created, it loads all pages, which kills
|
|
//performance site wide since it's being called by a service provider
|
|
//$this->pages = $this->content->loadAllPages();
|
|
}
|
|
|
|
public function getAll()
|
|
{
|
|
return $this->content->loadAllPages();
|
|
}
|
|
|
|
public function getById($id)
|
|
{
|
|
$page = $this->content->loadAllPages()->where('id', $id)->first();
|
|
//quick check to see if layout is set
|
|
$page['layout'] == '' ? $page['layout'] = 'page' : $page['layout'] = $page['layout'];
|
|
return $page;
|
|
}
|
|
|
|
public function getByUuid($uuid)
|
|
{
|
|
$page = $this->content->loadAllPages()->where('uuid', $uuid)->first();
|
|
//quick check to see if layout is set
|
|
$page['layout'] == '' ? $page['layout'] = 'page' : $page['layout'] = $page['layout'];
|
|
return $page;
|
|
}
|
|
|
|
public function getBySlug($slug)
|
|
{
|
|
$page = $this->content->loadAllPages()->where('slug', $slug)->first();
|
|
//quick check to see if layout is set
|
|
$page['layout'] == '' ? $page['layout'] = 'page' : $page['layout'] = $page['layout'];
|
|
return $page;
|
|
}
|
|
|
|
public function delete($page)
|
|
{
|
|
return $this->editPage($page, $this->content->loadAllPages()->where('uuid', $page->uuid)->first(), 'delete');
|
|
}
|
|
|
|
public function create($page)
|
|
{
|
|
return $this->editPage($page, null, 'create');
|
|
}
|
|
|
|
public function update($page)
|
|
{
|
|
return $this->editPage($page, $this->content->loadAllPages()->where('uuid', $page->uuid)->first(), 'update');
|
|
}
|
|
|
|
public function getGroup($num, $limit, $sort = "all")
|
|
{
|
|
return $this->paginate->getPage($num, $limit, $sort);
|
|
}
|
|
|
|
private function editPage($body, $page, $task)
|
|
{
|
|
$path;
|
|
$file;
|
|
$writePath;
|
|
$message;
|
|
$deleted;
|
|
if ($task != 'create') {
|
|
$path = date('Y', date($page['rawCreated'])) .
|
|
'/' .
|
|
date('m', date($page['rawCreated']));
|
|
} else {
|
|
$path = date('Y') . '/' . date('m');
|
|
}
|
|
|
|
if ($task == 'delete') {
|
|
$deleted = 'true';
|
|
$body->menu = 'false';
|
|
$body->published = 'false';
|
|
$body->featured = 'false';
|
|
//set body object with prexisting data
|
|
$body->id = $page['id'];
|
|
$body->layout = $page['layout'];
|
|
$body->slug = $page['slug'];
|
|
$body->title = $page['title'];
|
|
$body->imageList = $page['feature'];
|
|
$body->fileList = $page['files'];
|
|
$body->tags = $page['tags'];
|
|
$body->content = $page['content'];
|
|
} else {
|
|
$deleted = isset($page['deleted']) ? $page['deleted'] : 'false';
|
|
}
|
|
|
|
$created = $task != 'create' ? new Carbon($page['rawCreated']) : Carbon::now();
|
|
$updated = Carbon::now();
|
|
|
|
// grab current index from settings and update
|
|
$id = $task != 'create' ? $body->id : $this->settings->getSettings()['library_stats']['current_index'];
|
|
$uuid = $task != 'create' ? $body->uuid : createUUID();
|
|
//set variables post body for saving
|
|
$body->title = urlencode($body->title);
|
|
$body->id = $id;
|
|
$body->uuid = $uuid;
|
|
$body->path = $path;
|
|
$body->author = session('member')['handle'];
|
|
$body->created = $created->format("Y-m-d\TH:i:sP");
|
|
$body->updated = $updated->format("Y-m-d\TH:i:sP");
|
|
$body->deleted = $deleted;
|
|
//set path to save file
|
|
if ($body->layout == 'index') {
|
|
$writePath = '../content/pages/start/index.md';
|
|
} else {
|
|
$writePath = '../content/pages/' . $path . '/' . $body->slug . '.md';
|
|
}
|
|
//write file to path
|
|
$saved = $this->docs::writePages($task, $path, $writePath, $this->docs::objectToMD($body));
|
|
//handle post save result
|
|
if ($saved) {
|
|
if (
|
|
$this->settings->getGlobal()['renderOnSave'] == 'true' &&
|
|
$this->settings->getGlobal()['dynamicRender'] == 'false'
|
|
) {
|
|
//REFACTOR: Don't need to render entire site on a page edit, just render edited page
|
|
$this->render->publishAll();
|
|
$message = 'Filed edited and rendered. NOICE.';
|
|
} else {
|
|
$message = 'File edited. Nice work';
|
|
}
|
|
|
|
//upadte settings if needed
|
|
$body->path = $path;
|
|
$this->settings->updateMenu($body);
|
|
$tags = $this->sort->tags($this->content->loadAllPages());
|
|
$this->settings->updateTags($tags, false);
|
|
// if new page added, update current index in Settings file
|
|
if ($task == 'create') {
|
|
$this->settings->updatePageIndex();
|
|
}
|
|
|
|
return [
|
|
'message' => $message,
|
|
'type' => $task == 'update' ? 'postUpdated' : 'postAdded',
|
|
'id' => $uuid,
|
|
];
|
|
} else {
|
|
return $response = [
|
|
'message' => "Uh oh. File save problem. Don't panic",
|
|
'type' => 'postError',
|
|
'id' => $uuid,
|
|
];
|
|
}
|
|
}
|
|
}
|