86 lines
2.2 KiB
PHP
86 lines
2.2 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Services;
|
||
|
|
|
||
|
|
use App\Models\Page;
|
||
|
|
use App\Support\PageRenderer;
|
||
|
|
use Illuminate\Support\Facades\DB;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Service to handle Page-related operations.
|
||
|
|
*/
|
||
|
|
class PageService
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* @var NavigationService
|
||
|
|
*/
|
||
|
|
protected NavigationService $navigationService;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* PageService constructor.
|
||
|
|
*
|
||
|
|
* @param NavigationService $navigationService
|
||
|
|
*/
|
||
|
|
public function __construct(NavigationService $navigationService)
|
||
|
|
{
|
||
|
|
$this->navigationService = $navigationService;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Store a new page.
|
||
|
|
*
|
||
|
|
* @param array $data Data to create the page.
|
||
|
|
* @return Page The created page.
|
||
|
|
*/
|
||
|
|
public function store(array $data): Page
|
||
|
|
{
|
||
|
|
return DB::transaction(function () use ($data) {
|
||
|
|
$renderer = new PageRenderer();
|
||
|
|
$data['cached_html'] = $renderer->render($data['content']);
|
||
|
|
$data['user_id'] = auth()->id();
|
||
|
|
|
||
|
|
$page = Page::create(collect($data)->except('include_in_navigation')->toArray());
|
||
|
|
|
||
|
|
if (isset($data['include_in_navigation']) && $data['include_in_navigation']) {
|
||
|
|
$this->navigationService->syncPageNavigation($page, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
return $page;
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Update an existing page.
|
||
|
|
*
|
||
|
|
* @param Page $page The page to update.
|
||
|
|
* @param array $data Data to update the page.
|
||
|
|
* @return bool True if successful.
|
||
|
|
*/
|
||
|
|
public function update(Page $page, array $data): bool
|
||
|
|
{
|
||
|
|
return DB::transaction(function () use ($page, $data) {
|
||
|
|
$renderer = new PageRenderer();
|
||
|
|
$data['cached_html'] = $renderer->render($data['content']);
|
||
|
|
|
||
|
|
$success = $page->update(collect($data)->except('include_in_navigation')->toArray());
|
||
|
|
|
||
|
|
if (isset($data['include_in_navigation'])) {
|
||
|
|
$this->navigationService->syncPageNavigation($page, (bool)$data['include_in_navigation']);
|
||
|
|
}
|
||
|
|
|
||
|
|
return $success;
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Delete a page.
|
||
|
|
*
|
||
|
|
* @param Page $page The page to delete.
|
||
|
|
* @return bool True if successful.
|
||
|
|
*/
|
||
|
|
public function delete(Page $page): bool
|
||
|
|
{
|
||
|
|
return $page->delete();
|
||
|
|
}
|
||
|
|
}
|