REFACTORING: move part of content business logic into repository

This commit is contained in:
Michal Kváček
2016-10-18 15:36:26 +02:00
parent eabbf48ee0
commit 662700b4f2
19 changed files with 504 additions and 383 deletions
@@ -0,0 +1,7 @@
<?php
namespace App\CMS\Contracts\Repositories;
interface BaseRepository {
public function getOne($id = null);
public function all();
}
@@ -0,0 +1,15 @@
<?php
namespace App\CMS\Contracts\Repositories;
interface Content extends BaseRepository
{
const STATUS_DRAFT = 'draft';
const STATUS_PROTECTED = 'protected';
const STATUS_PUBLIC = 'public';
public function getOverview($handler = null, $statuses = null);
public function getHomepage();
public function getByURL($url);
}
+13
View File
@@ -0,0 +1,13 @@
<?php
namespace App\CMS\Contracts\Repositories;
interface Module extends BaseRepository {
public function supportsCategories();
public function getCreateContentTitle();
public function getUpdateContentTitle();
public function getOverviewTitle(\App\Models\Module $module);
}
+2 -1
View File
@@ -1,7 +1,8 @@
<?php
namespace App\CMS\Enumerations;
use App\Models\Content\Content;
use App\CMS\Contracts\Repositories\Content;
class ContentStatuses extends BaseEnumeration
{
+3 -3
View File
@@ -12,21 +12,21 @@ class Interaction {
*
* @param Request $request
* @param InteractionContract $interaction
*
* @param array $parameters
*
* @return mixed
* @throws ValidationFailedException
*/
public static function handle(Request $request, InteractionContract $interaction, ...$parameters) {
$validationRules = $interaction->getValidationRules($parameters);
$validator = Validator::make($request->all(), $validationRules);
// validate interaction
$validator = Validator::make($request->all(), $interaction->getValidationRules($parameters));
if ($validator->fails()) {
throw new ValidationFailedException($validator);
}
// handle it
return $interaction->handle($request, $parameters);
}
}
@@ -3,15 +3,33 @@ namespace App\Cms\Interactions\Admin\Content;
use App\CMS\Contracts\Interaction;
use App\CMS\Helpers\CurrentTemplate;
use App\Events\CreateNewContent;
use App\Http\Requests\Request;
use App\Models\Content\Content;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Str;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class NewContent implements Interaction
{
protected $content;
public function __construct()
{
$this->content = App::make(\App\CMS\Contracts\Repositories\Content::class);
}
/**
* @param Request $request
* @param $parameters
*
* @return Content
*/
public function handle(Request $request, $parameters)
{
list($moduleHandler) = $parameters;
// create new page
$page = new Content();
$page->template = $request->template;
@@ -27,7 +45,7 @@ class NewContent implements Interaction
$page->meta_description = $request->metaDescription;
$page->content = $request->pageContent;
$page->status = $request->status;
$page->module_handler = $request->handler;
$page->module_handler = $moduleHandler;
$page->category_id = (int)$request->category > 0 ? $request->category : null;
$page->parent_id = $request->parentPage ? $request->parentPage : null;
@@ -48,6 +66,9 @@ class NewContent implements Interaction
// upload files assigned to content page
$page->uploadRelatedFiles($request);
Event::fire(new CreateNewContent($this));
return $page;
}
+124
View File
@@ -0,0 +1,124 @@
<?php
namespace App\CMS\Repositories\Content;
use App\CMS\Contracts\Repositories\Content as IContent;
use App\CMS\Enumerations\ContentStatuses;
use App\CMS\Repositories\Repository;
use App\Models\Content\Content as ContentModel;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class Content extends Repository implements IContent
{
/**
* @var ContentModel
*/
private $model;
public function __construct(ContentModel $model)
{
$this->model = $model;
}
/**
* Getter for query with setup filter for non-deleted and non-draft pages
*/
protected function getPageQuery()
{
return ContentModel::where('status', '!=', IContent::STATUS_DRAFT)
->select('contents.*')
->with('author')
->join('modules', 'modules.handler', '=', 'contents.module_handler')
->where(function ($query) {
$query->where('published_from', '<', Carbon::now())
->orWhereNull('published_from');
})
->where(function ($query) {
$query->where('published_to', '>', Carbon::now())
->orWhereNull('published_to');
})
->where('language', LaravelLocalization::getCurrentLocale())
->where('modules.enabled', true);
}
public function all()
{
return $this->getPageQuery()
->get();
}
public function getOne($id = null)
{
if (is_null($id)) {
$page = new ContentModel();
$page->user_id = \Auth::user()->id;
$page->language = LaravelLocalization::getCurrentLocale();
$page->module_settings = [];
} else {
$page = $this->model->find($id);
$page->module_settings = json_decode($page->module_settings);
}
return $page;
}
/**
* Getter for homepage content page
* @return Content
*/
public function getHomepage()
{
return $this->getPageQuery()
->where('is_homepage', 1)
->first();
}
/**
* Getter for any page specified by its url.
*
* @param $url
*
* @return Content
*/
public function getByURL($url)
{
return $this->getPageQuery()
->where('url', $url)
->first();
}
/**
* Getter for overview of all content pages.
* These content pages may be filtered by using some handler
*
* @param bool $handler
* @param null $statuses
*
* @return
*/
public function getOverview($handler = null, $statuses = null)
{
$query = ContentModel::select('contents.*', 'modules.name AS module_name', 'modules.id AS module_id')
->join('modules', 'modules.handler', '=', 'contents.module_handler')
->join('users', 'users.id', '=', 'contents.user_id')
->addSelect(DB::raw('COALESCE(users.name, users.email) AS author_name'))
->addSelect('users.email AS author_email')
->whereNull('contents.deleted_at')
->where('contents.language', LaravelLocalization::getCurrentLocale())
->where('modules.enabled', 1)
->orderBy('contents.created_at', 'DESC');
// filter results using handler
if (!is_null($handler)) {
$query = $query->where('contents.module_handler', $handler);
}
// add filtering by status
if (is_array($statuses) && in_array($statuses, ContentStatuses::getSimple())) {
$query = $query->whereIn('contents.status', $statuses);
}
return $query->paginate(20);
}
}
+48
View File
@@ -0,0 +1,48 @@
<?php
namespace App\CMS\Repositories;
use App\CMS\Contracts\Repositories\Module as IModule;
use App\Models\Module as ModuleModel;
class Module extends Repository implements IModule
{
public function getOne($id = null) {
if (!is_null($id)) {
return ModuleModel::find($id);
} else {
return new ModuleModel();
}
}
public function supportsCategories()
{
// TODO: Implement supportsCategories() method.
}
public function getCreateContentTitle()
{
// TODO: Implement getCreateContentTitle() method.
}
public function getUpdateContentTitle()
{
// TODO: Implement getUpdateContentTitle() method.
}
public function getOverviewTitle(ModuleModel $module)
{
$pageHeading = 'admin/contents.overview';
// does user want to filter results using module?
if (!is_null($module) && is_callable([$module->handler, 'getOverviewTitle'])) {
$pageHeading = call_user_func([$module->handler, 'getOverviewTitle']);
}
return $pageHeading;
}
public function all()
{
// TODO: Implement all() method.
}
}
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace App\CMS\Repositories;
abstract class Repository
{
protected $model;
public function __call($method, $args)
{
return call_user_func_array([$this->model, $method], $args);
}
}