Merge branch 'dev' into module_profiler

This commit is contained in:
Michal Kváček
2017-09-23 00:45:51 +02:00
711 changed files with 14073 additions and 84301 deletions
@@ -7,6 +7,8 @@ use App\CMS\Interactions\Admin\Content\ChangeStatus;
use App\CMS\Interactions\Admin\Content\DeletePage;
use App\CMS\Interactions\Admin\Content\SetHomepage;
use App\Http\Controllers\Admin\Controller;
use App\Models\Content\Content;
use App\Models\Content\ContentHistory;
class ContentActions extends Controller
{
@@ -25,15 +27,13 @@ class ContentActions extends Controller
* This method is called in static page overview from quick actions. It checks if status is valid, if page exists
* and updates status.
*
* @param $id
* @param $status
* @param Content $page
* @param $status
*
* @return \Illuminate\Http\RedirectResponse
*/
public function changeStatus($id, $status)
public function changeStatus(Content $page, $status)
{
$page = $this->content->getOne($id);
Interaction::handle(ChangeStatus::class, ['status' => $status], $page);
// redirect back to overview with info for user
@@ -45,14 +45,12 @@ class ContentActions extends Controller
/**
* Delete page
*
* @param $id
* @param Content $page
*
* @return \Illuminate\Http\RedirectResponse
*/
public function delete($id)
public function delete(Content $page)
{
$page = $this->content->getOne($id);
Interaction::handle(DeletePage::class, [], $page);
// redirect back to overview with info for user
@@ -66,14 +64,12 @@ class ContentActions extends Controller
/**
* Sets page as homepage
*
* @param $id
* @param Content $page
*
* @return \Illuminate\Http\RedirectResponse
*/
public function setHomepage($id)
public function setHomepage(Content $page)
{
$page = $this->content->getOne($id);
Interaction::handle(SetHomepage::class, [], $page);
// redirect back to overview with info for user
@@ -5,6 +5,7 @@ use App\CMS\Contracts\Repositories\Content as IContent;
use App\CMS\Contracts\Repositories\Module as IModule;
use App\CMS\Enumerations\ContentStatuses;
use App\Http\Controllers\Admin\Controller;
use App\Models\Module;
class ContentOverview extends Controller
{
@@ -26,29 +27,32 @@ class ContentOverview extends Controller
/**
* Overview for all content pages.
*
* @param null|int $moduleId
* @param null $status
* @param Module|null $module
* @param null $status
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @internal param int|null $moduleId
*/
public function index($moduleId = null, $status = null)
public function index(Module $module, $status = null)
{
// get module settings
$module = $this->module->getOne($moduleId);
$pageHeading = $this->module->getOverviewTitle($module);
// get pages for overview
$handler = $module !== null ? $module->handler : null;
$handler = $module->exists ? $module->handler : null;
$pages = $this->content->getOverview($handler, [$status])
->paginate(setting('paginatedResults', 20));
// get homepage - for checking if homepage is set and available
$homepage = $this->content->getHomepage();
$contentModules = app(\App\CMS\Repositories\Module::class)->getContentModules();
return view('admin.content.overview', [
'pages' => $pages,
'homepage' => $homepage,
'pageHeading' => $pageHeading,
'contentModules' => $contentModules,
'statuses' => ContentStatuses::getWithTranslations(),
'module' => isset($module) ? $module : null
]);
@@ -1,4 +1,5 @@
<?php
namespace App\Http\Controllers\Admin\Contents;
use App\CMS\Contracts\Repositories\Content as IContent;
@@ -10,13 +11,13 @@ use App\Cms\Interactions\Admin\Content\NewContent;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\CreateNewContentRequest;
use App\Http\Requests\Request;
use App\Models\Module;
use Illuminate\Support\Collection;
use Modules\Categories\Contracts\Repositories\Category as ICategory;
/**
* Class CreateNewContent
*
* Controller for creating new content page.
*
* @package App\Http\Controllers\Admin\Contents
*/
class CreateNewContent extends Controller
@@ -29,10 +30,6 @@ class CreateNewContent extends Controller
* @var IModuleRepository
*/
private $module;
/**
* @var ICategory
*/
private $category;
/**
* @var ITemplate
*/
@@ -40,23 +37,20 @@ class CreateNewContent extends Controller
/**
* CreateNewContent constructor.
*
* Sets File and Content models into class variables
*
* @param IContent|Content $content
* @param IModuleRepository $module
* @param ICategory $category
*
* @param ITemplate $template
*
* @internal param File $file
*/
public function __construct(IContent $content, IModuleRepository $module, ICategory $category, ITemplate $template)
public function __construct(IContent $content, IModuleRepository $module, ITemplate $template)
{
parent::__construct();
$this->content = $content;
$this->module = $module;
$this->category = $category;
$this->template = $template;
}
@@ -67,13 +61,16 @@ class CreateNewContent extends Controller
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function create($module)
public function create(Module $module)
{
$module = $this->module->getOne($module);
$statuses = ContentStatuses::getWithTranslations();
$pageHeading = $this->module->getCreateContentTitle($module);
$templates = $this->template->getForModule($module);
$categories = $this->category->getForModule($module);
$categories = new Collection();
if (class_exists(ICategory::class)) {
$categories = app(ICategory::class)->getForModule($module);
}
$page = $this->content->getOne();
@@ -95,15 +92,14 @@ class CreateNewContent extends Controller
/**
* Save new content page
*
* @param CreateNewContentRequest $request
* @param $moduleId
* @param CreateNewContentRequest|Request $request
* @param Module $module
*
* @return \Illuminate\Http\RedirectResponse
* @internal param $moduleId
*/
public function store(Request $request, $moduleId)
public function store(Request $request, Module $module)
{
$module = $this->module->getOne($moduleId);
// create new page
Interaction::handle(NewContent::class, $request->all(), $module->handler);
@@ -1,4 +1,5 @@
<?php
namespace App\Http\Controllers\Admin\Contents;
use App\CMS\Contracts\Repositories\Content as IContent;
@@ -6,18 +7,15 @@ use App\CMS\Contracts\Repositories\Module as IModuleRepository;
use App\CMS\Contracts\Repositories\Template as ITemplate;
use App\CMS\Enumerations\ContentStatuses;
use App\Cms\Handlers\Interactions\Interaction;
use App\CMS\Helpers\CurrentTemplate;
use App\Cms\Interactions\Admin\Content\EditContent as EditContentInteraction;
use App\Events\AttemptToEditInvalidContent;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditContentRequest;
use App\Http\Requests\Request;
use App\Models\Content\Content;
use App\Models\Content\ContentHistory;
use App\Models\FileManager\File;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Collection;
use Modules\Categories\Contracts\Repositories\Category as ICategory;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class EditContent extends Controller
{
@@ -37,10 +35,6 @@ class EditContent extends Controller
* @var IModuleRepository
*/
private $module;
/**
* @var ICategory
*/
private $category;
/**
* @var ITemplate
*/
@@ -48,7 +42,6 @@ class EditContent extends Controller
/**
* EditContent constructor.
*
* Load ContentHistory and File into this controller
*
* @param ContentHistory $history
@@ -58,35 +51,37 @@ class EditContent extends Controller
* @param ICategory $category
* @param ITemplate $template
*/
public function __construct(ContentHistory $history, File $file, IContent $content, IModuleRepository $module, ICategory $category, ITemplate $template)
public function __construct(ContentHistory $history, File $file, IContent $content, IModuleRepository $module, ITemplate $template)
{
$this->history = $history;
$this->file = $file;
$this->content = $content;
$this->module = $module;
$this->category = $category;
$this->template = $template;
}
/**
* Display form for editing static page
*
* @param $id
* @param Content $page
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function edit($id)
public function edit(Content $page)
{
$statuses = ContentStatuses::getWithTranslations();
$page = $this->content->getOne($id);
// get module ID
$module = $this->module->getByHandler($page->moduleHandler);
$pageHeading = $this->module->getUpdateContentTitle($module, $page);
$templates = $this->template->getForModule($module);
$categories = $this->category->getForModule($module);
$history = $this->history->getStructuredHistoryOf($page);
$categories = new Collection();
if (class_exists(ICategory::class)) {
$categories = app(ICategory::class)->getForModule($module);
}
// render view
return view('admin.content.edit', [
'pageHeading' => $pageHeading,
@@ -94,7 +89,8 @@ class EditContent extends Controller
'page' => $page,
'module' => $module,
'categories' => $categories,
'rootPages' => $this->content->getOverview()->get(),
'rootPages' => $this->content->getOverview()
->get(),
'templates' => $templates,
'formSectionNames' => $this->module->call($module, 'getExtendedFormSections'),
'formSections' => $this->module->call($module, 'getExtendedFormInputsEdit'),
@@ -105,29 +101,14 @@ class EditContent extends Controller
/**
* Edit static page and save changes into history.
*
* @param EditContentRequest $request
* @param $id
* @param EditContentRequest|Request $request
* @param Content $page
*
* @return \Illuminate\Http\RedirectResponse
* @internal param $id
*/
public function update(Request $request, $id)
public function update(Request $request, Content $page)
{
try {
/**
* @var $page Content
*/
$page = $this->content->getOne($id);
} catch (NotFoundHttpException $e) {
// log attempt of invalid edit
Event::fire(new AttemptToEditInvalidContent($id));
// page for editing not found
return redirect()
->route('content.overview')
->with('error', trans('admin/contents.invalidPage'));
}
// edit page
Interaction::handle(EditContentInteraction::class, $request->all(), $page);
@@ -136,4 +117,24 @@ class EditContent extends Controller
->route('content.overview')
->with('success', trans('admin/contents.successfullyEdited'));
}
public function order() {
$pages = $this->content->getOverview()->get();
return view('admin.content.order', compact('pages'));
}
public function setOrder(Request $request) {
$data = $request->get('page');
foreach ($data as $id => $order) {
Content::where('id', $id)->update(['order' => $order]);
}
// something was changed, inform user
return redirect()
->route('content.overview')
->with('success', trans('admin/contents.orderSuccessfullySet'));
}
}
+12 -11
View File
@@ -19,30 +19,31 @@ class History extends Controller
}
/**
* @param $id
* @param Content $page
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getOverview($id)
public function getOverview(Content $page)
{
// test if given content id is static page and if exists
$content = Content::findOrFail($id);
$history = $this->history->getStructuredHistoryOf($content);
$history = $this->history->getStructuredHistoryOf($page);
return view('admin/history.overview', [
'history' => $history,
'page' => $content
'page' => $page
]);
}
public function getDiff($revision, $id)
/**
* @param ContentHistory $revision
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getDiff(ContentHistory $revision)
{
$change = $this->history->findOrFail($id);
$diff = $this->history->getDiff($change);
$diff = $this->history->getDiff($revision);
return view('admin/history.diff', [
'change' => $change,
'change' => $revision,
'diff' => $diff
]);
}
@@ -2,13 +2,22 @@
namespace App\Http\Controllers\Admin\Dashboard;
use App\CMS\Contracts\Repositories\Module;
use App\Http\Controllers\Admin\Controller;
use Illuminate\Http\Request;
use App\Models\Content\Content;
use Illuminate\Support\Facades\Auth;
class Dashboard extends Controller
{
public function index(Request $request)
public function index()
{
return redirect()->route('content.overview');
$contentModules = app(Module::class)->getContentModules();
if (\Auth::user()
->can('manage', Content::class) && !$contentModules->isEmpty()) {
return redirect()->route('content.overview');
} else {
return redirect()->route('users.detail', ['user' => Auth::user()]);
}
}
}
@@ -8,6 +8,7 @@ use App\CMS\Interactions\Admin\FileManager\CreateDirectory;
use App\CMS\Repositories\FileManager\Directory as DirectoryRepository;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests;
use App\Models\FileManager\Directory;
use Illuminate\Http\Request;
class CreateNewDirectory extends Controller
@@ -30,9 +31,10 @@ class CreateNewDirectory extends Controller
/**
* Create new directory
*
* @param Requests\CreateNewDirectoryRequest $request
* @param Requests\CreateNewDirectoryRequest|Request $request
*
* @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
* @internal param Directory $parentDirectory
*/
public function store(Request $request)
{
@@ -5,19 +5,20 @@ namespace App\Http\Controllers\Admin\FileManager;
use App\CMS\Repositories\FileManager\Directory as DirectoryRepository;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests;
use App\Http\Requests\EditDirectoryRequest;
use App\Models\FileManager\Directory;
class EditDirectory extends Controller
{
/**
* @param Requests\EditDirectoryRequest $request
* @param EditDirectoryRequest $request
* @param Directory $directory
*
* @return $this|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
* @internal param $directoryId
*
*/
public function update(Requests\EditDirectoryRequest $request, Directory $directory)
public function update(EditDirectoryRequest $request, Directory $directory)
{
$repository = app(DirectoryRepository::class);
if ($repository->checkIfNameExists($request->name, $directory->parent_id, $directory->id)) {
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Admin\FileManager;
use App\CMS\Helpers\FileManager;
use App\CMS\Helpers\RootDirectory;
use App\CMS\Repositories\FileManager\File as FileRepository;
use App\Events\EditFile;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditUploadedFileRequest;
@@ -14,14 +15,12 @@ class EditUploadedFile extends Controller
{
/**
* Edit form
*
* Render edit form for displaying details and updating given file
*
* @param File $file
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\View\View
* @internal param int $id file id
*
*/
public function show(File $file)
{
@@ -35,7 +34,6 @@ class EditUploadedFile extends Controller
/**
* Updates file
*
* User can change only keywords, original filename and description. Mime type, hash and other fields remain
* unchanged
*
@@ -44,16 +42,11 @@ class EditUploadedFile extends Controller
*
* @return \Illuminate\Http\RedirectResponse
* @internal param $id
*
*/
public function update(EditUploadedFileRequest $request, File $file)
{
// set values from form
$file->name = $request->name;
$file->keywords = $request->keywords;
$file->description = $request->description;
$file->directory_id = $request->directory_id;
$file->save();
$repository = app(FileRepository::class);
$repository->update($file, $request->all());
// fire action
Event::fire(new EditFile($file));
@@ -1,8 +1,8 @@
<?php
namespace App\Http\Controllers\Admin\FileManager;
use App\CMS\Helpers\Path;
use App\CMS\Helpers\Template;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\Request;
use App\Models\FileManager\File;
@@ -30,14 +30,12 @@ class UploadedFilesOverview extends Controller
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index(Directory $directory = null)
public function index(Directory $directory)
{
// include hidden directories?
$includeHidden = Input::get('hidden');
$subdirectories = $this->directoryRepository->getAllSubdirectories($directory);
if (!$includeHidden) {
if (!Input::get('hidden', true)) {
$subdirectories = $subdirectories->where('hidden', false);
}
-87
View File
@@ -1,87 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\LoginRequest;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
/**
* Class Login
*
* @package App\Http\Controllers\Admin
*
* @todo use trait ThrottlesLogins for disabling brutal-force password cracking
*/
class Login extends Controller
{
/**
* Display login form
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getLogin()
{
return view('admin.loginForm');
}
/**
* Login handler
*
* @param LoginRequest $request
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postLogin(LoginRequest $request)
{
$email = $request->email;
// try to find user
$user = User::where('email', $email)
->where('role', '!=', User::ROLE_VISITOR)
->where('status', User::STATE_ACTIVE)
->first();
if (!$user) {
return $this->loginFailed();
}
// try to log in user
if (Hash::check($request->password, $user->password)) {
Auth::login($user);
$redirect = $request->redirectTo ? $request->redirectTo : route('admin.dashboard');
return redirect()->intended($redirect);
}
// login invalid, redirect and inform the user
return $this->loginFailed();
}
/**
* Logs out user
*
* @return \Illuminate\Http\RedirectResponse
*/
public function logout()
{
// remove user information
\Auth::logout();
// redirect to login form with info about successfull logout
return redirect()
->route('login')
->with('success', trans('admin/common.logoutSuccessfull'));
}
private function loginFailed()
{
return redirect()
->route('login')
->with('error', trans('auth.failed'))
->withInput();
}
}
@@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Request;
use App\Models\Permissions\Permission;
class Permissions extends Controller
{
/**
* Display all permissions
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index()
{
$permissions = Permission::whereNull('parent_id')->get();
return view('admin/permissions.index', compact('permissions'));
}
/**
* Setup default permissions
*
* @param Request $request
*
* @return \Illuminate\Http\RedirectResponse
*/
public function setDefault(Request $request)
{
Permission::where('default', true)
->update(['default' => false]);
$permissions = $request->permissions;
Permission::whereIn('string_id', array_keys($permissions))
->update(['default' => true]);
return redirect()
->back()
->with('success', trans('admin/permissions.defaultSuccessfullySet'));
}
}
+7 -3
View File
@@ -13,7 +13,6 @@ class Search extends Controller
{
/**
* Create form for searching
*
* @return $this|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getSearch()
@@ -37,7 +36,6 @@ class Search extends Controller
/**
* Method used for performing search.
*
* This method iterates over all registered search engines and returns results for each engine apart.
*
* @param string $term search text
@@ -60,10 +58,16 @@ class Search extends Controller
// try to find given term
$results = $search->search($term);
$content = $presenter->render($results);
if (is_null($content)) {
continue;
}
// create result object
$resultsParts[$search->getId()] = [
'name' => $search->getName(),
'content' => $presenter->render($results),
'content' => $content,
'count' => count($results)
];
}
+4 -23
View File
@@ -2,15 +2,15 @@
namespace App\Http\Controllers\Admin;
use App\CMS\Repositories\Settings\Settings as SettingsRepository;
use App\Http\Requests;
use App\Models\Settings as SettingsModel;
use Illuminate\Support\Facades\App;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class Settings extends Controller
{
/**
* @var SettingsModel
* @var SettingsRepository
*/
protected $settings;
@@ -19,14 +19,13 @@ class Settings extends Controller
*
* @param SettingsModel $settings
*/
public function __construct(SettingsModel $settings)
public function __construct(SettingsRepository $settings)
{
$this->settings = $settings;
}
/**
* Get overview (with form) for editing settings
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getOverview()
@@ -45,7 +44,6 @@ class Settings extends Controller
/**
* Save all settings (ignore empty ones)
*
* When settings used to be non-empty string and user deletes it, key is also deleted from database
*
* @param Requests\SaveSettingsRequest $request
@@ -54,25 +52,8 @@ class Settings extends Controller
*/
public function saveSettings(Requests\SaveSettingsRequest $request)
{
$data = $request->all();
$commonSettings = isset($data['commonSettings']) ? $data['commonSettings'] : [];
// remove CSRF token field
unset($data['_token'], $data['commonSettings']);
foreach ($data as $key => $value) {
// select language for this setting key
$language = isset($commonSettings[$key]) ? null : LaravelLocalization::getCurrentLocale();
$setting = SettingsModel::firstOrNew(['language' => $language, 'key' => $key]);
if ($setting->value == $value) {
continue;
}
// set value and save or delete
$setting->value = $value;
$setting->save();
}
$this->settings->save($request->except(['_token']));
return redirect()
->route('settings.overview')
@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Admin\Templates;
use App\Cms\Repositories\Templates\Template as TemplateRepository;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\CopyTemplateRequest;
use App\Models\Templates\Template;
@@ -10,7 +11,6 @@ class CopyTemplate extends Controller
{
/**
* Method for copying given template.
*
* This method is supposed to be called by POST method.
*
* @param CopyTemplateRequest $request
@@ -32,15 +32,22 @@ class CopyTemplate extends Controller
$namespace .= '::';
}
$repository = app(TemplateRepository::class);
$repository->setModel($template);
// get template absolute paths
$realTemplatePath = $template->getPathToTemplate();
$customTemplatePath = $template->getPathToTemplate(Template::CUSTOM_EDIT_DIRECTORY);
$realTemplatePath = $repository->getPathToTemplate();
$customTemplatePath = $repository->getPathToTemplate(TemplateRepository::CUSTOM_EDIT_DIRECTORY);
$path = dirname($customTemplatePath);
// create file copy
$data = file_get_contents($realTemplatePath);
$written = file_put_contents($path . DIRECTORY_SEPARATOR . $newName . Template::TEMPLATE_SUFFIX, $data);
if (!is_dir($path)) {
mkdir($path, 0777, true);
}
$written = file_put_contents($path . DIRECTORY_SEPARATOR . $newName . TemplateRepository::TEMPLATE_SUFFIX, $data);
// were data written?
if ($written === false) {
return $this->copyFailed($request, $template);
@@ -67,7 +74,6 @@ class CopyTemplate extends Controller
* @param Template $template
*
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
*
*/
private function copyFailed(CopyTemplateRequest $request, Template $template)
{
@@ -34,13 +34,8 @@ class EditTemplate extends Controller
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getEdit($template)
public function getEdit(Template $template)
{
/**
* @var $template Template
*/
$template = Template::findOrFail($template);
$this->templateRepository->setModel($template);
// load template content
@@ -59,15 +54,13 @@ class EditTemplate extends Controller
* Save meta information about template and edited content
*
* @param EditTemplateRequest $request
* @param $templateId
* @param Template $template
*
* @return \Illuminate\Http\RedirectResponse
* @internal param $templateId
*/
public function postEdit(EditTemplateRequest $request, $templateId)
public function postEdit(EditTemplateRequest $request, Template $template)
{
// find template
$template = Template::findOrFail($templateId);
// setup meta information
$template->name = $request->name;
@@ -105,7 +98,7 @@ class EditTemplate extends Controller
// try to save content
if (!is_writable($customDir) && !is_writable($originalDir)) {
return redirect()
->route('templates.edit', ['id' => $request->id])
->route('templates.edit', ['id' => $template->id])
->withInput()
->with('warning', trans('admin/templates.cannotWriteContent'));
}
@@ -7,17 +7,28 @@ use App\Models\Templates\TemplatePath;
class TemplateOverview extends Controller
{
public function getPath($path)
public function index()
{
$path = TemplatePath::findOrFail($path);
$templatePaths = TemplatePath::with('subdirectories')
->whereNull('parent_id')
->get();
return view('admin.templates.index', compact('templatePaths'));
}
/**
* Display overview of all templates in given path
*
* @param TemplatePath $templatePath
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getPath(TemplatePath $templatePath)
{
return view('admin.templates.list', [
'directory' => $path,
'isWritable' => is_writable(base_path($path->path)),
'templates' => $path->templates()
->get(),
'subdirectories' => $path->subdirectories()
->get()
'directory' => $templatePath,
'isWritable' => is_writable(base_path($templatePath->path))
]);
}
}
@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Admin\Users;
use App\CMS\Enumerations\UserRoles;
use App\CMS\Repositories\Users\User as UserRepository;
use App\Events\CreateNewUser as CreateNewUserEvent;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\CreateNewUserRequest;
@@ -28,28 +29,21 @@ class CreateNewUser extends Controller
/**
* Create new user
*
* This method saves new user into database
*
* @param CreateNewUserRequest $request
* @param UserRepository $userRepository
*
* @return \Illuminate\Http\RedirectResponse
*/
protected function postRegistration(CreateNewUserRequest $request)
protected function postRegistration(CreateNewUserRequest $request, UserRepository $userRepository)
{
// when user did not provide any username, use his email
$username = isset($request->username) && !empty($request->username) ? $request->username : $request->email;
// create new user
$user = new User();
$user->name = $request->name;
$user->email = $request->email;
$user->username = $username;
$user->role = $request->role;
$user->password = Hash::make($request->password);
// store user into database
$user->save();
$data = $request->all();
$data['username'] = $username;
$user = $userRepository->create($data);
// fire event
Event::fire(new CreateNewUserEvent($user));
+66 -37
View File
@@ -4,26 +4,48 @@ namespace App\Http\Controllers\Admin\Users;
use App\CMS\Enumerations\UserRoles;
use App\CMS\Enumerations\UserStates;
use App\CMS\Repositories\Users\User as UserRepository;
use App\Events\EditUser as EditUserEvent;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditUserRequest;
use App\Http\Requests\Request;
use App\Models\Permissions\Permission;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Hash;
class EditUser extends Controller
{
public function getEditUser($id = null)
/**
* @var UserRepository
*/
private $userRepository;
/**
* EditUser constructor.
*
* @param UserRepository $userRepository
*/
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
/**
* Display form for editing user
*
* @param User|null $user
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getEditUser(User $user = null)
{
// when no user specified, lets assume we want to edit "me"
if (!$id) {
$id = Auth::user()->id;
if (!$user->exists) {
$user = Auth::user();
}
// try to find given user
$user = User::findOrFail($id);
$states = UserStates::getWithTranslations();
$roles = UserRoles::getWithTranslations();
@@ -35,49 +57,26 @@ class EditUser extends Controller
}
/**
* Edit user - store information
*
* @param EditUserRequest $request
* @param $id
* @param User $user
*
* @return \Illuminate\Http\RedirectResponse
* @internal param $id
*/
public function postEdit(EditUserRequest $request, $id)
public function postEdit(EditUserRequest $request, User $user)
{
$loggedUser = Auth::user();
$user = User::findOrFail($id);
// non-admin user is trying to edit someone else
if ($loggedUser->role != User::ROLE_ADMIN && $id != $loggedUser->id) {
if ($loggedUser->role != User::ROLE_ADMIN && $user->id != $loggedUser->id) {
return redirect()
->back()
->with('error', trans('auth.accessDenied'));
}
// update username if set
if (isset($request->username)) {
$user->username = $request->username;
}
// change name (if set)
if (isset($request->name)) {
$user->name = $request->name;
}
if (isset($request->role)) {
$user->role = $request->role;
}
if (isset($request->status)) {
$user->status = $request->status;
}
if (isset($request->password)) {
$user->password = Hash::make($request->password);
}
$user->email = $request->email;
$user->save();
$this->userRepository->update($user, $request->all());
// fire event about editing user
Event::fire(new EditUserEvent($user));
@@ -86,4 +85,34 @@ class EditUser extends Controller
->back()
->with('success', trans('admin/userManagement.userSuccessfullyEdited'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
*
* @return \Illuminate\Http\Response
*/
public function setPermissions(Request $request, User $user)
{
$permissionIds = $request->get('permissions', []);
$permissions = Permission::whereIn('string_id', array_keys($permissionIds))
->get();
DB::transaction(function () use ($user, $permissions) {
// remove all permissions
$user->permissions()
->detach();
foreach ($permissions as $permission) {
$user->permissions()
->attach($permission->id);
}
});
return redirect()
->back()
->with('success', trans('admin/permissions.successfullySet'));
}
}
+11 -12
View File
@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin\Users;
use App\CMS\Enumerations\UserRoles;
use App\CMS\Enumerations\UserStates;
use App\Cms\Repositories\ActionLog\Actions;
use App\CMS\Repositories\Permissions\Permission;
use App\Http\Controllers\Admin\Controller;
use App\Models\ActionLog\ActionLog;
use App\Models\User;
@@ -22,26 +23,24 @@ class UserDetail extends Controller
$this->log = $log;
}
public function getDetail($id = null)
public function getDetail(User $user = null)
{
// when no user specified, lets assume we want to edit "me"
if (!$id) {
$id = Auth::user()->id;
if (!$user->exists) {
$user = Auth::user();
}
// try to find given user
$user = User::findOrFail($id);
$actions = $this->log->getUserActions($id, 10);
$actions = $this->log->getUserActions($user->id, 10);
$roles = UserRoles::getWithTranslations();
$states = UserStates::getWithTranslations();
$permissions = app(Permission::class)->getRootPermissions();
return view('admin.userManagement.detail', [
'user' => $user,
'statuses' => $states,
'roles' => $roles,
'actions' => $actions
'user' => $user,
'statuses' => $states,
'roles' => $roles,
'actions' => $actions,
'permissions' => $permissions
]);
}
}
@@ -2,19 +2,34 @@
namespace App\Http\Controllers\Admin\Widgets\Areas;
use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\NewWidgetAreaRequest;
use App\Models\Widgets\WidgetArea;
use Illuminate\Support\Facades\Event;
class CreateNewWidgetArea extends Controller
{
/**
* @var WidgetAreaRepository
*/
private $widgetAreaRepository;
/**
* CreateNewWidgetArea constructor.
*
* @param WidgetAreaRepository $widgetAreaRepository
*/
public function __construct(WidgetAreaRepository $widgetAreaRepository)
{
$this->widgetAreaRepository = $widgetAreaRepository;
}
/**
* Form for new widget area
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getNew()
public function create()
{
return view('admin.widgets.area.new', ['area' => new WidgetArea()]);
}
@@ -24,18 +39,9 @@ class CreateNewWidgetArea extends Controller
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postNew(NewWidgetAreaRequest $request)
public function store(NewWidgetAreaRequest $request)
{
$parameters = [
'code' => $request->code,
'name' => $request->name,
'description' => $request->description
];
$area = WidgetArea::create($parameters);
// fire event with new widget area
Event::fire(new \App\Events\CreateNewWidgetArea($area));
$this->widgetAreaRepository->create($request);
// redirect with success notification
return redirect()
@@ -2,6 +2,8 @@
namespace App\Http\Controllers\Admin\Widgets\Areas;
use App\CMS\Repositories\Widgets\WidgetArea as WidgetAreaRepository;
use App\Events\DeleteWidgetArea;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditWidgetAreaRequest;
use App\Models\Widgets\Widget;
@@ -13,22 +15,37 @@ use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class EditWidgetArea extends Controller
{
/**
* @var WidgetAreaRepository
*/
private $widgetAreaRepository;
/**
* EditWidgetArea constructor.
*
* @param WidgetAreaRepository $widgetAreaRepository
*/
public function __construct(WidgetAreaRepository $widgetAreaRepository)
{
$this->widgetAreaRepository = $widgetAreaRepository;
}
/**
* Display form for editing given widget area
*
* @param $id
* @param WidgetArea $widgetArea
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*
*/
public function getEdit($id)
public function edit(WidgetArea $widgetArea)
{
$area = WidgetArea::findOrFail($id);
$associatedWidgetIds = WidgetInWidgetArea::getWidgetIdsFromArea($area->id);
$associatedWidgetIds = WidgetInWidgetArea::getWidgetIdsFromArea($widgetArea->id);
$widgets = Widget::where('language', LaravelLocalization::getCurrentLocale())
->paginate(25);
return view('admin.widgets.area.edit', [
'area' => $area,
'area' => $widgetArea,
'widgets' => $widgets,
'associatedWidgetIds' => $associatedWidgetIds
]);
@@ -36,26 +53,14 @@ class EditWidgetArea extends Controller
/**
* @param EditWidgetAreaRequest $request
* @param $id
* @param WidgetArea $widgetArea
*
* @return \Illuminate\Http\RedirectResponse
*
*/
public function postEdit(EditWidgetAreaRequest $request, $id)
public function update(EditWidgetAreaRequest $request, WidgetArea $widgetArea)
{
try {
$area = WidgetArea::findOrFail($id);
} catch (ModelNotFoundException $e) {
return $this->invalidArea();
}
$area->name = $request->name;
$area->description = $request->description;
$area->timestamps = true;
$area->save();
// fire event with new widget area
Event::fire(new \App\Events\EditWidgetArea($area));
$this->widgetAreaRepository->update($widgetArea, $request);
return redirect()
->route('widgetareas.overview')
@@ -65,47 +70,28 @@ class EditWidgetArea extends Controller
/**
* Hard deletes widget area
*
* @param $id
* @param WidgetArea $widgetArea
*
* @return \Illuminate\Http\RedirectResponse
*/
public function deleteArea($id)
public function delete(WidgetArea $widgetArea)
{
// try to find area
try {
$area = WidgetArea::findOrFail($id);
} catch (ModelNotFoundException $e) {
return $this->invalidArea();
}
// check if widget area is deletable
if (!$area->deletable) {
if (!$widgetArea->deletable) {
return redirect()
->back()
->with('error', trans('admin/widgetAreas.notDeletableArea'));
}
// delete area
$area->delete();
$widgetArea->delete();
// fire event with new widget area
Event::fire(new \App\Events\DeleteWidgetArea($area));
Event::fire(new DeleteWidgetArea($widgetArea));
// redirect and inform user
return redirect()
->route('widgetareas.overview')
->with('success', trans('admin/widgetAreas.successfullyDeleted'));
}
/**
* Redirect user to overview with message about invalid widget area
*
* @return \Illuminate\Http\RedirectResponse
*/
private function invalidArea()
{
return redirect()
->route('widgetareas.overview')
->with('error', trans('admin/widgetAreas.invalidArea'));
}
}
@@ -23,14 +23,13 @@ class CreateNewWidget extends Controller
/**
* Form for new widget area
*
* @param $type
* @param WidgetType $widgetType
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*
*/
public function getNew($type)
public function getNew(WidgetType $widgetType)
{
$widgetType = WidgetType::findOrFail($type);
$presenter = call_user_func([$widgetType->handler, 'getPresenter']);
return call_user_func([$presenter, 'renderAddForm'], $widgetType);
@@ -40,23 +39,22 @@ class CreateNewWidget extends Controller
* Create new instance of given widget type
*
* @param NewWidgetRequest $request
* @param $type
*
* @param WidgetType $widgetType
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postNew(NewWidgetRequest $request, $type)
public function postNew(NewWidgetRequest $request, WidgetType $widgetType)
{
$widgetType = WidgetType::findOrFail($type);
// try to save this widget
try {
$this->widget->createNew($widgetType, $request);
} catch (MissingParameterException $e) {
// user omitted some value
return $this->invalidWidget($type, $e->getMessage());
// } catch (\Exception $e) {
// // something went wrong
// return $this->invalidWidget($type, trans('admin/widgets.cannotSave', ['exception' => $e->getMessage()]));
return redirect()
->back()
->withInput()
->with('error', $e->getMessage());
}
// redirect with success notification
@@ -64,12 +62,4 @@ class CreateNewWidget extends Controller
->route('widgets.overview')
->with('success', trans('admin/widgets.successfullyCreated'));
}
private function invalidWidget($widgetType, $error)
{
return redirect()
->route('widgets.new', ['type' => $widgetType])
->withInput()
->with('error', $error);
}
}
@@ -1,26 +1,39 @@
<?php
namespace App\Http\Controllers\Admin\Widgets;
use App\CMS\Repositories\Widgets\Widget as WidgetRepository;
use App\CMS\Widgets\Exceptions\MissingParameterException;
use App\Http\Controllers\Admin\Controller;
use App\Http\Requests\EditWidgetRequest;
use App\Models\Widgets\Widget;
use Illuminate\Support\Facades\Event;
class EditWidget extends Controller
{
/**
* @var WidgetRepository
*/
private $widgetRepository;
/**
* EditWidget constructor.
*
* @param WidgetRepository $widgetRepository
*/
public function __construct(WidgetRepository $widgetRepository)
{
$this->widgetRepository = $widgetRepository;
}
/**
* Render edit form
*
* @param $id
* @param Widget $widget
*
* @return mixed
*/
public function getEdit($id)
public function getEdit(Widget $widget)
{
$widget = Widget::findOrFail($id);
$widget->settings = json_decode($widget->settings);
$presenter = call_user_func([$widget->widget_type_handler, 'getPresenter']);
return call_user_func([$presenter, 'renderEditForm'], $widget);
@@ -30,24 +43,14 @@ class EditWidget extends Controller
* Save changes into database
*
* @param EditWidgetRequest $request
* @param $widget
* @param Widget $widget
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postEdit(EditWidgetRequest $request, $widget)
public function postEdit(EditWidgetRequest $request, Widget $widget)
{
// create new widget
$widget = Widget::findOrFail($widget);
// update name
$widget->name = $request->name;
$widget->container_class = $request->containerClass;
$widget->container_id = empty($request->containerId) ? null : $request->containerId;
$widget->description = $request->description;
// try to save this widget
try {
$widget->settings = json_encode(call_user_func([$widget->widget_type_handler, 'save'], $request));
$this->widgetRepository->edit($widget, $request);
} catch (MissingParameterException $e) {
// user omitted some value
return $this->invalidWidget($e->getMessage());
@@ -56,12 +59,6 @@ class EditWidget extends Controller
return $this->invalidWidget(trans('admin/widgets.cannotSave', ['exception' => $e->getMessage()]));
}
// save into database
$widget->save();
// fire event with editing widget
Event::fire(new \App\Events\EditWidget($widget));
// redirect with success notification
return redirect()
->back()
@@ -71,15 +68,12 @@ class EditWidget extends Controller
/**
* Deletes widget
*
* @param $id
* @param Widget $widget
*
* @return \Illuminate\Http\RedirectResponse
*/
public function deleteWidget($id)
public function deleteWidget(Widget $widget)
{
// create new widget
$widget = Widget::findOrFail($id);
// check if widget area is deletable
if (!$widget->deletable) {
return redirect()
@@ -1,17 +1,25 @@
<?php
namespace App\Http\Controllers\Admin\Widgets;
use App\Http\Controllers\Admin\Controller;
use App\Models\Widgets\Widget;
use App\Models\Widgets\WidgetType;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class WidgetsOverview extends Controller
{
public function getOverview()
/**
* Display list of all widgets
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index()
{
$widgets = Widget::where('language', LaravelLocalization::getCurrentLocale())
->paginate(25);
return view('admin.widgets.overview', ['widgets' => $widgets]);
$widgetTypes = WidgetType::all();
return view('admin.widgets.overview', compact('widgetTypes', 'widgets'));
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset emails and
| includes a trait which assists in sending these notifications from
| your application to your users. Feel free to explore this trait.
|
*/
use SendsPasswordResetEmails;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
}
@@ -0,0 +1,46 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/admin';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
public function logout() {
Auth::logout();
return redirect()->route('login');
}
}
@@ -0,0 +1,73 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Validator;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Where to redirect users after registration.
* @var string
*/
protected $redirectTo = '/';
/**
* Create a new controller instance.
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
*
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
'g-recaptcha-response' => 'required|recaptcha',
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
*
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'role' => User::ROLE_VISITOR,
'state' => User::STATE_ACTIVE,
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
class ResetPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset requests
| and uses a simple trait to include this behavior. You're free to
| explore this trait and override any methods you wish to tweak.
|
*/
use ResetsPasswords;
/**
* Where to redirect users after resetting their password.
*
* @var string
*/
protected $redirectTo = '/admin';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
}
+18 -4
View File
@@ -14,7 +14,6 @@ class Controller extends BaseController
/**
* Custom wrapper for generating view.
*
* This method will be used for switching among templates.
*
* @param $template
@@ -23,10 +22,25 @@ class Controller extends BaseController
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public static function VisitorsView($template, $data = [], $mergeData = [])
public static function visitorsView($template, $data = [], $mergeData = [])
{
$view = self::getView($template, $data, $mergeData);
return response($view)->header('X-Powered-By', strrev('zc.ytiranib.www//:sptth | .o.r.s ytiranib | SMCiniM'));
}
/**
* Get instance of view for passing into response
*
* @param $template
* @param $data
* @param $mergeData
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public static function getView($template, $data = [], $mergeData = [])
{
$view = Template::name($template);
return response(view($view, $data, $mergeData))->header('X-Powered-By', strrev('zc.ytiranib.www//:sptth | .o.r.s ytiranib | SMCiniM'));
return view($view, $data, $mergeData);
}
}
+1 -1
View File
@@ -65,7 +65,7 @@ class ContentPage extends Controller
$displayPipeline = app('displayPipeline');
$page = $displayPipeline->run($page);
return Controller::VisitorsView($page->template, ['page' => $page]);
return Controller::visitorsView($page->template, ['page' => $page]);
}
}
+1 -1
View File
@@ -10,7 +10,7 @@ class Homepage extends ContentPage
{
// try to find some homepage
$contentModel = $this->content;
$page = Cache::remember('hp', setting('homepageCacheLifetime', 5), function () use ($contentModel) {
$page = Cache::remember('homepage', setting('homepageCacheLifetime', 5), function () use ($contentModel) {
return $contentModel->getHomepage();
});
@@ -1,9 +1,9 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Visitor;
use App\CMS\Contracts\Repositories\Content;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class Sitemap extends Controller
{
@@ -24,7 +24,6 @@ class Sitemap extends Controller
/**
* Get sitemap for all content pages
*
* @return mixed
*/
public function getMap()