From 0ab6e39be804ebab1597c22efdc402597727a664 Mon Sep 17 00:00:00 2001 From: Mark Hester Date: Fri, 6 Jul 2018 14:24:24 +0100 Subject: [PATCH 1/8] Unify plugins into Module --- app/Classes/Repositories/PageRepository.php | 4 +- app/Console/Commands/JuneUpdateOne.php | 3 - app/Model/Page.php | 31 ++- .../Articles/BackendController.php | 12 +- .../Articles/Blade/categories.blade.php | 0 .../Articles/Blade/edit.blade.php | 0 .../Articles/Blade/form.blade.php | 0 .../Articles/Blade/index.blade.php | 0 .../Articles/FrontendController.php | 11 +- .../Articles/Routes/backend.php | 4 +- .../Articles/Routes/frontend.php | 10 +- app/Modules/Configs/Blade/index.blade.php | 192 ++++++++++++++++++ app/Modules/Configs/Controller.php | 55 +++++ .../Configs}/Routes/backend.php | 10 +- .../Configs}/Routes/frontend.php | 0 app/Modules/ModuleManager.php | 97 +++++++++ app/Modules/ModuleNotFoundException.php | 10 + app/Modules/ModuleRepository.php | 54 +++++ app/Modules/ModuleServiceProvider.php | 64 ++++++ .../Navigation}/BackendController.php | 12 +- .../Navigation}/Blade/create.blade.php | 4 +- .../Navigation}/Blade/edit.blade.php | 4 +- .../Navigation}/Blade/index.blade.php | 8 +- app/Modules/Navigation/FrontendController.php | 13 ++ .../Navigation}/Routes/backend.php | 6 +- .../Navigation}/Routes/frontend.php | 0 .../Newsletters/BackendController.php | 12 +- .../Newsletters/Blade/create.blade.php | 0 .../Newsletters/Blade/edit.blade.php | 0 .../Newsletters/Blade/index.blade.php | 0 .../Newsletters/FrontendController.php | 11 +- .../Newsletters/Model/Newsletter.php | 0 .../Model/NewsletterRepository.php | 0 .../Newsletters/Model/NewsletterTemplate.php | 0 .../Newsletters/Model/NewsletterUser.php | 0 .../Newsletters/Routes/backend.php | 0 .../Newsletters/Routes/frontend.php | 6 +- .../Pages/BackendController.php | 11 +- .../Pages/Blade/create.blade.php | 0 .../Pages/Blade/edit.blade.php | 0 .../Pages/Blade/index.blade.php | 0 app/Modules/Pages/FrontendController.php | 81 ++++++++ .../Pages/Model/PageOptions.php | 9 +- .../Pages/Model/PageTypes.php | 2 +- .../Pages/Routes/backend.php | 0 .../Pages/Routes/frontend.php | 4 +- app/Modules/Products/BackendController.php | 42 ++++ app/Modules/Products/Blade/index.blade.php | 56 +++++ app/Modules/Products/Routes/backend.php | 19 ++ .../Redirects/BackendController.php | 13 +- .../Redirects/Blade/create.blade.php | 0 .../Redirects/Blade/edit.blade.php | 0 .../Redirects/Blade/index.blade.php | 0 app/Modules/Redirects/FrontendController.php | 11 + .../Redirects/Routes/backend.php | 0 .../Redirects/Routes/frontend.php | 0 app/Modules/Sitemap/Controller.php | 6 - app/Modules/Sitemap/Routes/frontend.php | 2 +- app/Plugins/Articles/ArticlesController.php | 76 ------- app/Plugins/Menus/FrontendController.php | 19 -- app/Plugins/Menus/MenusController.php | 33 --- .../Newsletters/NewslettersController.php | 56 ----- app/Plugins/Pages/FrontendController.php | 41 ---- app/Plugins/Pages/PagesController.php | 33 --- app/Plugins/PluginEngine.php | 69 ------- app/Plugins/PluginHandler.php | 29 --- app/Plugins/Products/BackendController.php | 85 -------- app/Plugins/Products/Blade/index.blade.php | 68 ------- .../PluginNotInstanceOfInstallable.php | 10 - app/Plugins/Products/FrontendController.php | 16 -- app/Plugins/Products/ProductsController.php | 33 --- app/Plugins/Redirects/FrontendController.php | 19 -- app/Plugins/Redirects/RedirectsController.php | 33 --- app/Providers/AppServiceProvider.php | 14 -- app/Providers/RouteServiceProvider.php | 104 +--------- composer.json | 1 + composer.lock | 37 +++- config/app.php | 9 +- config/modules.php | 84 ++++++-- config/sentry.php | 2 +- ...2016_12_14_225300_create_plugins_table.php | 56 ----- ...12_21_154441_edit_facebook_plugin_data.php | 10 +- ...17_01_07_225206_create_carousels_table.php | 10 - .../2018_01_03_150616_cleanup_plugins.php | 15 -- .../2018_02_25_004151_february_update_one.php | 22 -- .../2018_03_01_232041_march_update_one.php | 10 - .../2018_06_03_001436_june_update_one.php | 2 - ...2018_07_04_210841_create_modules_table.php | 41 ++++ .../admin/views/structure/navbar.blade.php | 2 +- .../admin/views/structure/sidebar.blade.php | 17 +- routes/web.php | 10 +- tests/Article/ArticleViewingTest.php | 17 +- tests/Module/ModuleManagerTest.php | 182 +++++++++++++++++ tests/Products/ProductDashboardTest.php | 33 +++ tests/Products/ProductInstallationTest.php | 36 ++++ 95 files changed, 1201 insertions(+), 1022 deletions(-) rename app/{Plugins => Modules}/Articles/BackendController.php (96%) rename app/{Plugins => Modules}/Articles/Blade/categories.blade.php (100%) rename app/{Plugins => Modules}/Articles/Blade/edit.blade.php (100%) rename app/{Plugins => Modules}/Articles/Blade/form.blade.php (100%) rename app/{Plugins => Modules}/Articles/Blade/index.blade.php (100%) rename app/{Plugins => Modules}/Articles/FrontendController.php (94%) rename app/{Plugins => Modules}/Articles/Routes/backend.php (97%) rename app/{Plugins => Modules}/Articles/Routes/frontend.php (52%) create mode 100644 app/Modules/Configs/Blade/index.blade.php create mode 100644 app/Modules/Configs/Controller.php rename app/{Plugins/Products => Modules/Configs}/Routes/backend.php (59%) rename app/{Plugins/Menus => Modules/Configs}/Routes/frontend.php (100%) create mode 100644 app/Modules/ModuleManager.php create mode 100644 app/Modules/ModuleNotFoundException.php create mode 100644 app/Modules/ModuleRepository.php create mode 100644 app/Modules/ModuleServiceProvider.php rename app/{Plugins/Menus => Modules/Navigation}/BackendController.php (96%) rename app/{Plugins/Menus => Modules/Navigation}/Blade/create.blade.php (96%) rename app/{Plugins/Menus => Modules/Navigation}/Blade/edit.blade.php (96%) rename app/{Plugins/Menus => Modules/Navigation}/Blade/index.blade.php (83%) create mode 100644 app/Modules/Navigation/FrontendController.php rename app/{Plugins/Menus => Modules/Navigation}/Routes/backend.php (82%) rename app/{Plugins/Products => Modules/Navigation}/Routes/frontend.php (100%) rename app/{Plugins => Modules}/Newsletters/BackendController.php (89%) rename app/{Plugins => Modules}/Newsletters/Blade/create.blade.php (100%) rename app/{Plugins => Modules}/Newsletters/Blade/edit.blade.php (100%) rename app/{Plugins => Modules}/Newsletters/Blade/index.blade.php (100%) rename app/{Plugins => Modules}/Newsletters/FrontendController.php (89%) rename app/{Plugins => Modules}/Newsletters/Model/Newsletter.php (100%) rename app/{Plugins => Modules}/Newsletters/Model/NewsletterRepository.php (100%) rename app/{Plugins => Modules}/Newsletters/Model/NewsletterTemplate.php (100%) rename app/{Plugins => Modules}/Newsletters/Model/NewsletterUser.php (100%) rename app/{Plugins => Modules}/Newsletters/Routes/backend.php (100%) rename app/{Plugins => Modules}/Newsletters/Routes/frontend.php (51%) rename app/{Plugins => Modules}/Pages/BackendController.php (95%) rename app/{Plugins => Modules}/Pages/Blade/create.blade.php (100%) rename app/{Plugins => Modules}/Pages/Blade/edit.blade.php (100%) rename app/{Plugins => Modules}/Pages/Blade/index.blade.php (100%) create mode 100644 app/Modules/Pages/FrontendController.php rename app/{Plugins => Modules}/Pages/Model/PageOptions.php (88%) rename app/{Plugins => Modules}/Pages/Model/PageTypes.php (98%) rename app/{Plugins => Modules}/Pages/Routes/backend.php (100%) rename app/{Plugins => Modules}/Pages/Routes/frontend.php (87%) create mode 100644 app/Modules/Products/BackendController.php create mode 100644 app/Modules/Products/Blade/index.blade.php create mode 100644 app/Modules/Products/Routes/backend.php rename app/{Plugins => Modules}/Redirects/BackendController.php (95%) rename app/{Plugins => Modules}/Redirects/Blade/create.blade.php (100%) rename app/{Plugins => Modules}/Redirects/Blade/edit.blade.php (100%) rename app/{Plugins => Modules}/Redirects/Blade/index.blade.php (100%) create mode 100644 app/Modules/Redirects/FrontendController.php rename app/{Plugins => Modules}/Redirects/Routes/backend.php (100%) rename app/{Plugins => Modules}/Redirects/Routes/frontend.php (100%) delete mode 100644 app/Plugins/Articles/ArticlesController.php delete mode 100644 app/Plugins/Menus/FrontendController.php delete mode 100644 app/Plugins/Menus/MenusController.php delete mode 100644 app/Plugins/Newsletters/NewslettersController.php delete mode 100644 app/Plugins/Pages/FrontendController.php delete mode 100644 app/Plugins/Pages/PagesController.php delete mode 100644 app/Plugins/PluginEngine.php delete mode 100644 app/Plugins/PluginHandler.php delete mode 100644 app/Plugins/Products/BackendController.php delete mode 100644 app/Plugins/Products/Blade/index.blade.php delete mode 100644 app/Plugins/Products/Exceptions/PluginNotInstanceOfInstallable.php delete mode 100644 app/Plugins/Products/FrontendController.php delete mode 100644 app/Plugins/Products/ProductsController.php delete mode 100644 app/Plugins/Redirects/FrontendController.php delete mode 100644 app/Plugins/Redirects/RedirectsController.php create mode 100644 database/migrations/2018_07_04_210841_create_modules_table.php create mode 100644 tests/Module/ModuleManagerTest.php create mode 100644 tests/Products/ProductDashboardTest.php create mode 100644 tests/Products/ProductInstallationTest.php diff --git a/app/Classes/Repositories/PageRepository.php b/app/Classes/Repositories/PageRepository.php index eeb4aa48..27e0329d 100644 --- a/app/Classes/Repositories/PageRepository.php +++ b/app/Classes/Repositories/PageRepository.php @@ -10,8 +10,8 @@ use App\Model\Page; use Illuminate\Support\Collection; -use App\Plugins\Pages\Model\PageTypes; -use App\Plugins\Pages\Model\PageOptions; +use App\Modules\Pages\Model\PageTypes; +use App\Modules\Pages\Model\PageOptions; use Illuminate\Database\Eloquent\Builder; /** diff --git a/app/Console/Commands/JuneUpdateOne.php b/app/Console/Commands/JuneUpdateOne.php index a90dfd4a..b7a7d0d5 100644 --- a/app/Console/Commands/JuneUpdateOne.php +++ b/app/Console/Commands/JuneUpdateOne.php @@ -59,9 +59,6 @@ public function handle() if (! $page->editable && ! $page->special) { $page->type = (PageTypes::TYPE_FRAMEWORK | PageTypes::TYPE_STANDARD); $page->option = PageOptions::OPTION_PUBLIC | PageOptions::OPTION_SITEMAP; - } elseif ($page->plugin) { - $page->type = PageTypes::TYPE_PLUGIN; - $page->option = PageOptions::OPTION_DEFAULT; } elseif ($page->identifier == 'newsletter.success') { $page->type = PageTypes::TYPE_PLUGIN; $page->option = PageOptions::OPTION_PUBLIC; diff --git a/app/Model/Page.php b/app/Model/Page.php index 253e5512..5515676d 100644 --- a/app/Model/Page.php +++ b/app/Model/Page.php @@ -3,6 +3,7 @@ namespace App\Model; use Carbon\Carbon; +use Illuminate\Support\Facades\DB; use Laravel\Scout\Searchable; use App\Model\Concerns\Publishers; use Illuminate\Support\Collection; @@ -31,6 +32,7 @@ * @property string $heading * @property string $description * @property string $keywords + * @property string $module * @property int $views * @property int $type * @property int $option @@ -266,7 +268,7 @@ public function getKeywordsAttribute() /** * Return the status if the page has the options specified. * - * @param PageOptions $options Values of the required options + * @param string $options Values of the required options * * @return bool the returned condition */ @@ -278,7 +280,7 @@ public function hasOption($options) $constant = constant(sprintf('%s::OPTION_%s', PageOptions::class, strtoupper($option))); if ($this->option & $constant) { - return $constant; + return true; } } @@ -298,4 +300,29 @@ public function isType(string $type) return $this->type & $constant; } + + /** + * Toggle the disability of all the module pages. + * (Enable, Disable); + * + * If one page fails, do not toggle. + * + * @param string $module + * + * @return mixed + */ + public static function toggleModuleDisability(string $module, bool $active) + { + DB::transaction(function() use ($module, $active){ + if ($active == true) { + foreach (self::whereModule($module)->get() as $page) { + $page->update(['option' => $page->option & ~PageOptions::OPTION_DISABLED]); + } + } else { + foreach (self::whereModule($module)->get() as $page) { + $page->update(['option' => $page->option | PageOptions::OPTION_DISABLED]); + } + } + }); + } } diff --git a/app/Plugins/Articles/BackendController.php b/app/Modules/Articles/BackendController.php similarity index 96% rename from app/Plugins/Articles/BackendController.php rename to app/Modules/Articles/BackendController.php index e442d49f..b894085d 100644 --- a/app/Plugins/Articles/BackendController.php +++ b/app/Modules/Articles/BackendController.php @@ -1,25 +1,19 @@ uses('BackendController@categories')->name('admin.articles.categories.index'); Route::post('admin/articles/categories')->uses('BackendController@categories_store')->name('admin.articles.categories.store'); - - Route::resource('admin/articles', 'BackendController', ['as' => 'admin']); + Route::resource('admin/articles', 'BackendController', ['as' => 'admin']); \ No newline at end of file diff --git a/app/Plugins/Articles/Routes/frontend.php b/app/Modules/Articles/Routes/frontend.php similarity index 52% rename from app/Plugins/Articles/Routes/frontend.php rename to app/Modules/Articles/Routes/frontend.php index 52717cd3..0a932698 100644 --- a/app/Plugins/Articles/Routes/frontend.php +++ b/app/Modules/Articles/Routes/frontend.php @@ -22,8 +22,8 @@ | (Page Path = Articles Page '/articles') |-------------------------------------------------------------------------- */ - Route::get($page->path())->uses('App\Plugins\Articles\FrontendController@allArticles')->name('articles.all'); - Route::get($page->path().'/search')->uses('App\Plugins\Articles\FrontendController@searchArticles')->name('search.articles'); - Route::get($page->path().'/{category}')->uses('App\Plugins\Articles\FrontendController@categoryArticles')->name('category.articles'); - Route::get($page->path().'/creator/{account}')->uses('App\Plugins\Articles\FrontendController@allCreatorsArticles')->name('creator.articles'); - Route::get($page->path().'/{category}/{article}')->uses('App\Plugins\Articles\FrontendController@viewArticle')->name('article.view'); + Route::get($page->path())->uses('FrontendController@allArticles')->name('articles.all'); + Route::get($page->path().'/search')->uses('FrontendController@searchArticles')->name('search.articles'); + Route::get($page->path().'/{category}')->uses('FrontendController@categoryArticles')->name('category.articles'); + Route::get($page->path().'/creator/{account}')->uses('FrontendController@allCreatorsArticles')->name('creator.articles'); + Route::get($page->path().'/{category}/{article}')->uses('FrontendController@viewArticle')->name('article.view'); diff --git a/app/Modules/Configs/Blade/index.blade.php b/app/Modules/Configs/Blade/index.blade.php new file mode 100644 index 00000000..32ce310d --- /dev/null +++ b/app/Modules/Configs/Blade/index.blade.php @@ -0,0 +1,192 @@ +@extends('dashboard::frame') + +@section('title') + Settings +@endsection + +@section('information') + Your application can be modified with straight forward, powerful options that you can change to match your needs. +@endsection + +@section('content') + + + + + +
+ + {{ csrf_field() }} + +
+ +
+
+
+

Application Settings

+

Modify the settings of your CMS Application..

+
+
+ +
+
+ +
+
+ + + {{ App\Model\Configuration::describe('app.name') }} +
+
+ + + {{ App\Model\Configuration::describe('app.mode') }} +
+
+ +
+
+ + + + +
+
+ {{ App\Model\Configuration::describe('app.logo') }} +
+
+ +
+ +
+ +
+
+
+

HTML Tag Settings

+

Control the settings that make up the html tag of your website.

+
+
+ +
+
+ +
+
+ + + {{ App\Model\Configuration::describe('website.tag.title.text') }} +
+ +
+ + + {{ App\Model\Configuration::describe('website.tag.keywords.default') }} +
+ +
+ + + {{ App\Model\Configuration::describe('website.tag.description.default') }} +
+ +
+ + + {{ App\Model\Configuration::describe('website.tag.title.position') }} +
+ +
+ + + {{ App\Model\Configuration::describe('website.tag.title.separator') }} +
+
+
+ +
+ +
+
+
+

Website Contact Details

+

Define the details on your website that allows visitors to get in touch.

+
+
+ +
+
+ +
+
+ + + {{ App\Model\Configuration::describe('website.contact.address') }} +
+ +
+ + + {{ App\Model\Configuration::describe('website.contact.phone') }} +
+ +
+ + + {{ App\Model\Configuration::describe('website.contact.fax') }} +
+ +
+ + + {{ App\Model\Configuration::describe('website.contact.email') }} +
+
+
+ +
+ +
+
+
+

Third Party Services

+

Integrate interaction from third party services such as google, facebook etc.

+
+
+ +
+
+ +
+
+ + + {{ App\Model\Configuration::describe('website.webmaster.google.tracking') }} +
+
+
+ +
+ +
+ + + +
+ + Cancel +
+
+ +
+@endsection diff --git a/app/Modules/Configs/Controller.php b/app/Modules/Configs/Controller.php new file mode 100644 index 00000000..c8645f60 --- /dev/null +++ b/app/Modules/Configs/Controller.php @@ -0,0 +1,55 @@ +middleware(['role:administrator']); + } + + /** + * Settings are already loaded within the application + * best to use the loaded settings from that instead. + * + * Helper function (Settings()) + * + * @return mixed + */ + public function index() + { + return $this->make('index'); + } + + /** + * Save the changes for settings. + * + * @param Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request) + { + foreach ($request['setting'] as $key => $value) { + Configuration::set($key, $value); + } + + return redirect()->intended(route('admin.settings.index')); + } +} diff --git a/app/Plugins/Products/Routes/backend.php b/app/Modules/Configs/Routes/backend.php similarity index 59% rename from app/Plugins/Products/Routes/backend.php rename to app/Modules/Configs/Routes/backend.php index e95d6a45..33979e66 100644 --- a/app/Plugins/Products/Routes/backend.php +++ b/app/Modules/Configs/Routes/backend.php @@ -15,10 +15,8 @@ // Get Requests. // ================================================================================== - Route::get('/admin/products/index', 'BackendController@index')->name('admin.products.index'); + Route::get('/admin/settings')->uses('Controller@index')->name('admin.settings.index'); - /* - * Login for plugins. - */ - Route::get('/admin/products/install/{plugin}')->uses('BackendController@install')->name('products.install'); - Route::get('/admin/products/uninstall/{plugin}')->uses('BackendController@uninstall')->name('products.uninstall'); + // Post Requests. + // ================================================================================== + Route::post('/admin/settings/update')->uses('Controller@update')->name('admin.settings.update'); diff --git a/app/Plugins/Menus/Routes/frontend.php b/app/Modules/Configs/Routes/frontend.php similarity index 100% rename from app/Plugins/Menus/Routes/frontend.php rename to app/Modules/Configs/Routes/frontend.php diff --git a/app/Modules/ModuleManager.php b/app/Modules/ModuleManager.php new file mode 100644 index 00000000..41e38bc8 --- /dev/null +++ b/app/Modules/ModuleManager.php @@ -0,0 +1,97 @@ +repository = $repository; + } + + /** + * Enable a module using the modules.php configuration. + * + * @param string $module + * + * @return $this + * + * @throws ModuleNotFoundException + */ + public function enable(string $module) + { + $this->repository->set("{$module}.enabled", true)->save(); + + $this->updatePageBelongingTo($module, $this->repository->get("{$module}.enabled")); + } + + /** + * @param string $module + * @return $this + * @throws ModuleNotFoundException + */ + public function disable(string $module) + { + $this->repository->set("{$module}.enabled", false)->save(); + + $this->updatePageBelongingTo($module, $this->repository->get("{$module}.enabled")); + } + + /** + * Toggle the status of a module in the configuration. + * + * @param string $module + * + * @return $this + * @throws \App\Modules\ModuleNotFoundException + */ + public function toggle(string $module) + { + $this->repository->set("{$module}.enabled", !$this->repository->get("{$module}.enabled"))->save(); + + $this->updatePageBelongingTo($module, $this->repository->get("{$module}.enabled")); + } + + /** + * Get the status of a module from the module repository, including the new values if it was set. + * + * @param string $module + * + * @return mixed + */ + public function status(string $module) + { + return $this->repository->get("{$module}.enabled"); + } + + /** + * Sync the module pages to load with the condig status. + * + * @param $module + * @param bool $status + * + * @return void + */ + private function updatePageBelongingTo($module, bool $status) + { + Page::toggleModuleDisability($module, $status); + } +} \ No newline at end of file diff --git a/app/Modules/ModuleNotFoundException.php b/app/Modules/ModuleNotFoundException.php new file mode 100644 index 00000000..eda19389 --- /dev/null +++ b/app/Modules/ModuleNotFoundException.php @@ -0,0 +1,10 @@ +app->singleton(ModuleManager::class, function() { + return new ModuleManager(app(ModuleRepository::class)); + }); + } + + /** + * Register the route mapping of the modules. + * + * @return void. + */ + public static function map() + { + foreach (config('modules') as $module) + { + $namespace = sprintf('App\Modules\%s', $module['title']); + + if (config("modules.{$module['title']}.enabled")) { + $backendRoute = base_path(sprintf('app/Modules/%s/Routes/backend.php', $module['title'])); + if (file_exists($backendRoute)) { + Route::middleware(['web', 'auth', 'gateway'])->namespace($namespace)->group($backendRoute); + } + + $frontendRoute = base_path(sprintf('app/Modules/%s/Routes/frontend.php', $module['title'])); + if (file_exists($frontendRoute)) { + Route::middleware(['web'])->namespace($namespace)->group($frontendRoute); + } + } + } + } +} diff --git a/app/Plugins/Menus/BackendController.php b/app/Modules/Navigation/BackendController.php similarity index 96% rename from app/Plugins/Menus/BackendController.php rename to app/Modules/Navigation/BackendController.php index 0879d518..626effe0 100644 --- a/app/Plugins/Menus/BackendController.php +++ b/app/Modules/Navigation/BackendController.php @@ -6,13 +6,13 @@ * Time: 14:55. */ -namespace App\Plugins\Menus; +namespace App\Modules\Navigation; use DB; use App\Model\Link; use App\Model\Menu; use Illuminate\Http\Request; -use App\Plugins\PluginEngine; +use App\Modules\ModuleEngine; use Illuminate\Validation\Rule; use App\Classes\Repositories\LinkRepository; use App\Classes\Repositories\MenuRepository; @@ -21,7 +21,7 @@ /** * Class Controller. */ -class BackendController extends PluginEngine +class BackendController extends ModuleEngine { /** * @var MenuRepository @@ -89,7 +89,7 @@ public function store(Request $request, Menu $menu) $this->save($request, $menu); - return redirect()->route('admin.menus.index'); + return redirect()->route('admin.navigation.index'); } /** @@ -131,7 +131,7 @@ public function update(Request $request, $id) $this->save($request, $menu); - return redirect(route('admin.menus.index')); + return redirect(route('admin.navigation.index')); } /** @@ -156,7 +156,7 @@ public function destroy($id) $menu->delete(); - return redirect(route('admin.menus.index')); + return redirect(route('admin.navigation.index')); } /** diff --git a/app/Plugins/Menus/Blade/create.blade.php b/app/Modules/Navigation/Blade/create.blade.php similarity index 96% rename from app/Plugins/Menus/Blade/create.blade.php rename to app/Modules/Navigation/Blade/create.blade.php index bf990fe6..207f82b0 100644 --- a/app/Plugins/Menus/Blade/create.blade.php +++ b/app/Modules/Navigation/Blade/create.blade.php @@ -12,7 +12,7 @@ @include('dashboard::structure.validation') -
+ {{ csrf_field() }} @@ -100,7 +100,7 @@
- Cancel + Cancel
diff --git a/app/Plugins/Menus/Blade/edit.blade.php b/app/Modules/Navigation/Blade/edit.blade.php similarity index 96% rename from app/Plugins/Menus/Blade/edit.blade.php rename to app/Modules/Navigation/Blade/edit.blade.php index c734f6a1..b8c2819b 100644 --- a/app/Plugins/Menus/Blade/edit.blade.php +++ b/app/Modules/Navigation/Blade/edit.blade.php @@ -14,7 +14,7 @@ - + @@ -106,7 +106,7 @@
- Cancel + Cancel
diff --git a/app/Plugins/Menus/Blade/index.blade.php b/app/Modules/Navigation/Blade/index.blade.php similarity index 83% rename from app/Plugins/Menus/Blade/index.blade.php rename to app/Modules/Navigation/Blade/index.blade.php index c9a05817..3de303a9 100644 --- a/app/Plugins/Menus/Blade/index.blade.php +++ b/app/Modules/Navigation/Blade/index.blade.php @@ -19,7 +19,7 @@
  • - $menu->id]) }}" class="{{ Request::segment(4) == $menu->id ? 'active' : null }}"> + $menu->id]) }}" class="{{ Request::segment(4) == $menu->id ? 'active' : null }}"> {{ $menu->title }} {{ count($menu->children->toArray()) }} @@ -43,7 +43,7 @@
  • @@ -70,8 +70,8 @@
    diff --git a/app/Modules/Navigation/FrontendController.php b/app/Modules/Navigation/FrontendController.php new file mode 100644 index 00000000..23530c63 --- /dev/null +++ b/app/Modules/Navigation/FrontendController.php @@ -0,0 +1,13 @@ + 'admin']); + Route::resource('admin/navigation', 'BackendController', ['as' => 'admin']); // Ajax reorder. - Route::post('/admin/menus/reorder/')->uses('BackendController@reorder')->name('admin.menus.reorder'); + Route::post('/admin/menus/reorder/')->uses('BackendController@reorder')->name('admin.navigation.reorder'); // Allows groupings on the index. - Route::get('/admin/menus/group/{group_id}')->uses('BackendController@index')->name('admin.menus.group'); + Route::get('/admin/menus/group/{group_id}')->uses('BackendController@index')->name('admin.navigation.group'); // Post Requests. // ================================================================================== diff --git a/app/Plugins/Products/Routes/frontend.php b/app/Modules/Navigation/Routes/frontend.php similarity index 100% rename from app/Plugins/Products/Routes/frontend.php rename to app/Modules/Navigation/Routes/frontend.php diff --git a/app/Plugins/Newsletters/BackendController.php b/app/Modules/Newsletters/BackendController.php similarity index 89% rename from app/Plugins/Newsletters/BackendController.php rename to app/Modules/Newsletters/BackendController.php index 0c1389c8..4c90c137 100644 --- a/app/Plugins/Newsletters/BackendController.php +++ b/app/Modules/Newsletters/BackendController.php @@ -1,21 +1,15 @@ uses('App\Plugins\Newsletters\FrontendController@joinNewsletter')->name('newsletter.join'); + Route::post('/newsletter/join')->uses('FrontendController@joinNewsletter')->name('newsletter.join'); - Route::get('/newsletter/complete')->uses('App\Plugins\Newsletters\FrontendController@completedNewsletter')->name('newsletter.complete'); - Route::get('/newsletter/failure')->uses('App\Plugins\Newsletters\FrontendController@completedNewsletter')->name('newsletter.failure'); + Route::get('/newsletter/complete')->uses('FrontendController@completedNewsletter')->name('newsletter.complete'); + Route::get('/newsletter/failure')->uses('FrontendController@completedNewsletter')->name('newsletter.failure'); diff --git a/app/Plugins/Pages/BackendController.php b/app/Modules/Pages/BackendController.php similarity index 95% rename from app/Plugins/Pages/BackendController.php rename to app/Modules/Pages/BackendController.php index 86343ee3..2cedd3a1 100644 --- a/app/Plugins/Pages/BackendController.php +++ b/app/Modules/Pages/BackendController.php @@ -6,21 +6,20 @@ * Time: 20:30. */ -namespace App\Plugins\Pages; +namespace App\Modules\Pages; -use App\Model\Link; use App\Model\Page; use Illuminate\Http\Request; -use App\Plugins\PluginEngine; +use App\Modules\ModuleEngine; use Illuminate\Validation\Rule; -use App\Plugins\Pages\Model\PageTypes; -use App\Plugins\Pages\Model\PageOptions; +use App\Modules\Pages\Model\PageTypes; +use App\Modules\Pages\Model\PageOptions; use App\Classes\Repositories\PageRepository; /** * Class Controller. */ -class BackendController extends PluginEngine +class BackendController extends ModuleEngine { /** * @var PageRepository diff --git a/app/Plugins/Pages/Blade/create.blade.php b/app/Modules/Pages/Blade/create.blade.php similarity index 100% rename from app/Plugins/Pages/Blade/create.blade.php rename to app/Modules/Pages/Blade/create.blade.php diff --git a/app/Plugins/Pages/Blade/edit.blade.php b/app/Modules/Pages/Blade/edit.blade.php similarity index 100% rename from app/Plugins/Pages/Blade/edit.blade.php rename to app/Modules/Pages/Blade/edit.blade.php diff --git a/app/Plugins/Pages/Blade/index.blade.php b/app/Modules/Pages/Blade/index.blade.php similarity index 100% rename from app/Plugins/Pages/Blade/index.blade.php rename to app/Modules/Pages/Blade/index.blade.php diff --git a/app/Modules/Pages/FrontendController.php b/app/Modules/Pages/FrontendController.php new file mode 100644 index 00000000..3fe17471 --- /dev/null +++ b/app/Modules/Pages/FrontendController.php @@ -0,0 +1,81 @@ +currentPage = $pages->whereName(currentURI()); + } + + /** + * Redirects must use a controller to handle the parameter, as they require a specified target. + * @return mixed + */ + public function redirect() + { + return redirect($this->currentPage->redirect->to(), 302); + } + + /** + * Standard page views are once that use the URL as the designated target. + * + * @return mixed + * @throws \Exception + * @internal param FrontPageLoader $pageLoader + */ + public function index() + { + IncrementViews::dispatch($this->currentPage); + + return Frontpage::build($this->currentPage); + } + + /** + * The sitemap function allows plugins to quickly and effectively + * create and store new content for the SEO Sitemap Controller. + * + * @param SitemapGenerator $sitemap + * @return SitemapGenerator + */ + public function sitemap(SitemapGenerator $sitemap) + { + /** @var PageRepository $repository */ + $repository = app(PageRepository::class); + + /** @var Page $page */ + foreach ($repository->whereSitemap() as $page) { + $sitemap->store(url($page->route()), $page->updated_at, 'bi-weekly', '1.0'); + } + + return $sitemap; + } +} diff --git a/app/Plugins/Pages/Model/PageOptions.php b/app/Modules/Pages/Model/PageOptions.php similarity index 88% rename from app/Plugins/Pages/Model/PageOptions.php rename to app/Modules/Pages/Model/PageOptions.php index 159953ea..9a7609fe 100644 --- a/app/Plugins/Pages/Model/PageOptions.php +++ b/app/Modules/Pages/Model/PageOptions.php @@ -1,6 +1,6 @@ frontendPageCollection() as $page) { - if (! $page->redirect && ! $page->plugin) { - Route::get($page->route())->uses('App\Http\Controllers\PageController@index'); + if (! $page->redirect && ! $page->module) { + Route::get($page->route())->uses('FrontendController@index'); } } diff --git a/app/Modules/Products/BackendController.php b/app/Modules/Products/BackendController.php new file mode 100644 index 00000000..8fb67e7b --- /dev/null +++ b/app/Modules/Products/BackendController.php @@ -0,0 +1,42 @@ +middleware(['role:developer']); + } + + /** + * Display a list of products available and disable, enable option for super admins. + */ + public function index() + { + return $this->make('index'); + } + + /** + * Toggle the enable or disable of a module. + * + * @param string $module + * @param ModuleManager $modules + */ + public function toggle(string $module, ModuleManager $modules) + { + // + } +} diff --git a/app/Modules/Products/Blade/index.blade.php b/app/Modules/Products/Blade/index.blade.php new file mode 100644 index 00000000..c728bd20 --- /dev/null +++ b/app/Modules/Products/Blade/index.blade.php @@ -0,0 +1,56 @@ +@extends('dashboard::frame') + +@section('title') + Product Overview +@endsection + +@section('information') + Products are interfaces which can be switched on and off, allowing complete control of your system. +@endsection + +@section('content') + +
    + + @foreach(config('modules') as $module) +
    + +
    +
    + {{ ucwords($module['title']) }} +
    +
    + Version {{ $module['version'] }} +
    +
    + +
    +
      + + @if (account()->hasRole($module['role'])) + @if ($module['enabled'] == true) +
    • Uninstall
    • + @else +
    • Install
    • + @endif + @else + @if ($module['enabled']) +
    • Currently Active
    • + @else +
    • Disabled
    • + @endif + @endif +
    +
    + +
    +
    + {!! css()->status->check($module['enabled']) !!} +
    +
    +
    + @endforeach + +
    + +@endsection \ No newline at end of file diff --git a/app/Modules/Products/Routes/backend.php b/app/Modules/Products/Routes/backend.php new file mode 100644 index 00000000..f3f790a4 --- /dev/null +++ b/app/Modules/Products/Routes/backend.php @@ -0,0 +1,19 @@ +name('admin.products.index'); + Route::get('/admin/products/{module}/toggle', 'BackendController@toggle')->name('admin.products.toggle'); diff --git a/app/Plugins/Redirects/BackendController.php b/app/Modules/Redirects/BackendController.php similarity index 95% rename from app/Plugins/Redirects/BackendController.php rename to app/Modules/Redirects/BackendController.php index b3ed8ddc..c98ed4ec 100644 --- a/app/Plugins/Redirects/BackendController.php +++ b/app/Modules/Redirects/BackendController.php @@ -1,24 +1,17 @@ uses('App\Modules\Sitemap\Controller@all')->name('sitemap'); + Route::get('/sitemap.xml')->uses('Controller@all')->name('sitemap'); // Post Requests. // ================================================================================== diff --git a/app/Plugins/Articles/ArticlesController.php b/app/Plugins/Articles/ArticlesController.php deleted file mode 100644 index 4de5d925..00000000 --- a/app/Plugins/Articles/ArticlesController.php +++ /dev/null @@ -1,76 +0,0 @@ - 'Articles', - 'identifier' => 'articles', - 'slug' => 'articles', - 'type' => PageTypes::TYPE_PLUGIN, - 'option' => PageOptions::OPTION_PUBLIC, - ]); - - return $page; - } - - /** - * The steps required for this plugin product to fully - * remove itself from the webservice. - * - * @return bool - * @throws \Exception - */ - public function uninstall() - { - /** @var PageRepository $repository */ - $pages = app(PageRepository::class); - - /** @var Page $page */ - $page = $pages->whereIdentifier('articles'); - - // status of the operation. - return $page->forceDelete(); - } -} diff --git a/app/Plugins/Menus/FrontendController.php b/app/Plugins/Menus/FrontendController.php deleted file mode 100644 index 9623c6cf..00000000 --- a/app/Plugins/Menus/FrontendController.php +++ /dev/null @@ -1,19 +0,0 @@ -whereSitemap() as $page) { - $sitemap->store(url($page->route()), $page->updated_at, 'bi-weekly', '1.0'); - } - - return $sitemap; - } -} diff --git a/app/Plugins/Pages/PagesController.php b/app/Plugins/Pages/PagesController.php deleted file mode 100644 index 5d650211..00000000 --- a/app/Plugins/Pages/PagesController.php +++ /dev/null @@ -1,33 +0,0 @@ -make(sprintf('plugins::%s.Blade.%s', $this->pluginName(), $blade_template)); - } - - /** - * Get the module name by checking the class name location. - * - * @todo class_basname() ? - * - * @return mixed - */ - protected function pluginName() - { - if ($this->pluginName) { - return $this->pluginName; - } - - return $this->pluginName = explode('\\', get_class($this))[2]; - } - - /** - * Redirect to a plugin view location. - * For ajax return calls. - * - * @param $blade_template - * @return \Illuminate\Http\RedirectResponse - */ - protected function redirect($blade_template) - { - return redirect()->intended($this->pluginName().'::'.$blade_template); - } - - /** - * @todo what does this do and document it. - * - * @return Plugin|array|\stdClass - */ - protected function pluginData() - { - return (new PluginRepository(new Plugin))->whereName($this->pluginName()); - } -} diff --git a/app/Plugins/PluginHandler.php b/app/Plugins/PluginHandler.php deleted file mode 100644 index dc9018f7..00000000 --- a/app/Plugins/PluginHandler.php +++ /dev/null @@ -1,29 +0,0 @@ -plugins = $plugins; - - $this->middleware(['role:developer']); - } - - /** - * Display a list of products available and disable, enable option for super admins. - */ - public function index() - { - return $this->make('index')->with('products', $this->plugins->all()); - } - - /** - * Steps required for the application install. - * Usually defined for logging & new sql entries. - * - * @param string $plugin_name - * @return mixed - */ - public function install(Plugin $plugin) - { - if ($plugin->controller instanceof Installable) { - $plugin->controller->install(); - - $plugin->toggle(); - - return response()->redirectToRoute('admin.products.index'); - } - - throw new PluginNotInstanceOfInstallable; - } - - /** - * Steps required for the application uninstall. - * Usually defined for logging & new sql entries. - * - * @param string $plugin_name - * @return mixed - */ - public function uninstall(Plugin $plugin) - { - if ($plugin->controller instanceof Installable) { - $plugin->controller->uninstall(); - - $plugin->toggle(); - - return response()->redirectToRoute('admin.products.index'); - } - - throw new PluginNotInstanceOfInstallable; - } -} diff --git a/app/Plugins/Products/Blade/index.blade.php b/app/Plugins/Products/Blade/index.blade.php deleted file mode 100644 index d0c93cef..00000000 --- a/app/Plugins/Products/Blade/index.blade.php +++ /dev/null @@ -1,68 +0,0 @@ -@extends('dashboard::frame') - -@section('title') - Product Overview -@endsection - -@section('information') - Products are interfaces which can be switched on and off, allowing complete control of your system. -@endsection - -@section('content') - -
    - - - - @foreach($products as $product) -
    - -
    -
    - {{ ucfirst($product->name()) }} -
    -
    - Version {{ $product->version() }} -
    -
    - -
    -
      - - @role('developer') - @if($product->required == false) - @if ($product->enabled) -
    • Uninstall
    • - @else -
    • Install
    • - @endif - @else -
    • Framework Requirement
    • - @endif - @else - @if ($product->enabled) -
    • Currently Active
    • - @else -
    • Disabled
    • - @endif - @endrole - - {{--
    • {!! css()->status->installed($product->isEnabled()) !!}
    • --}} - {{--
    • {!! css()->link->edit(route('admin.pages.edit', ["name"=>$page->slug])) !!}
    • --}} - {{--
    • {!! css()->status->sitemap($page->sitemap) !!}
    • --}} - {{--
    • {!! css()->status->status($page->enabled) !!}
    • --}} - {{--
    • {!! css()->link->view(makeUrl($page)) !!}
    • --}} -
    -
    - -
    -
    - {!! css()->status->check($product->enabled) !!} -
    -
    -
    - @endforeach - -
    - -@endsection \ No newline at end of file diff --git a/app/Plugins/Products/Exceptions/PluginNotInstanceOfInstallable.php b/app/Plugins/Products/Exceptions/PluginNotInstanceOfInstallable.php deleted file mode 100644 index 99638d22..00000000 --- a/app/Plugins/Products/Exceptions/PluginNotInstanceOfInstallable.php +++ /dev/null @@ -1,10 +0,0 @@ -bootBladeDirectives(); - Schema::defaultStringLength(191); } @@ -29,16 +27,4 @@ public function register() { // } - - /** - * Boot blade directives. - * - * @return void - */ - private function bootBladeDirectives() - { - Blade::if('role', function ($role) { - return account()->hasRole($role); - }); - } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 2c948711..5a792efb 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use App\Model\Plugin; +use App\Modules\ModuleServiceProvider; use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; @@ -20,16 +21,6 @@ class RouteServiceProvider extends ServiceProvider */ protected $namespace = 'App\Http\Controllers'; - /** - * Define your route model bindings, pattern filters, etc. - * - * @return void - */ - public function boot() - { - parent::boot(); - } - /** * Define the routes for the application. * @@ -37,99 +28,10 @@ public function boot() */ public function map() { - $this->mapApiRoutes(); - - $this->mapWebRoutes(); - - $this->mapPluginRoutes(); - - $this->mapModulesRoutes(); - - $this->mapVendorRoutes(); - } - - /** - * Define the "web" routes for the application. - * - * These routes all receive session state, CSRF protection, etc. - * - * @return void - */ - protected function mapWebRoutes() - { - $tom = []; - - Route::middleware('web')->namespace($this->namespace)->group(base_path('routes/web.php')); - } + ModuleServiceProvider::map(); - /** - * Define the "api" routes for the application. - * - * These routes are typically stateless. - * - * @return void - */ - protected function mapApiRoutes() - { - Route::prefix('api')->middleware('api')->namespace($this->namespace)->group(base_path('routes/api.php')); - } + Route::middleware('web')->group(base_path('routes/web.php')); - /** - * Define the backend routes for the application. - * - * Plugins have dynamic creation of web vs admin. - * - * " - * @return void - */ - protected function mapPluginRoutes() - { - /** @var Plugin $plugin */ - foreach (plugins()->enabled() as $plugin) { - $plugin_name = ucfirst($plugin->name()); - - $namespace = sprintf('App\Plugins\%s', $plugin_name); - - $frontendRoute = base_path(sprintf('app/Plugins/%s/Routes/frontend.php', $plugin_name)); - Route::middleware(['web'])->group($frontendRoute); - - $backendRoute = base_path(sprintf('app/Plugins/%s/Routes/backend.php', $plugin_name)); - Route::middleware(['web', 'auth', 'gateway'])->namespace($namespace)->group($backendRoute); - } - } - - /** - * Define the backend routes for the application.0. - * - * Modules are loaded as modularity. - * - * @return void - */ - protected function mapModulesRoutes() - { - foreach (config('modules') as $module) { - $module_name = ucfirst($module['title']); - - $namespace = sprintf('App\Modules\%s', $module['title']); - - $backendRoute = base_path(sprintf('app/Modules/%s/Routes/backend.php', $module_name)); - - $frontendRoute = base_path(sprintf('app/Modules/%s/Routes/frontend.php', $module_name)); - - // Frontend are routes that can be accessed by visitors. - Route::middleware(['web'])->group($frontendRoute); - - // Backend are routes that can only be accessed to those with access. - Route::middleware(['web', 'auth', 'gateway'])->namespace($namespace)->group($backendRoute); - } - } - - /** - * Third party routes sometimes require auth, and sometimes not, but since we dont - * define a namespace, its best have it in its seperate folder for simplicity. - */ - protected function mapVendorRoutes() - { Route::middleware('web')->group(base_path('routes/vendor.php')); } } diff --git a/composer.json b/composer.json index 18014b4c..bfa16a3d 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "barryvdh/laravel-elfinder": "0.3.12", "doctrine/dbal": "2.7.1", "fideloper/proxy": "^4.0", + "larapack/config-writer": "1.*", "laravel/framework": "5.6.*", "laravel/scout": "^4.0", "laravel/tinker": "^1.0", diff --git a/composer.lock b/composer.lock index 52ea9c07..e4d51ef5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "fd8abe0eec4a907e7ac2a50b67ec43da", + "content-hash": "7c022288640d73a9f4e3d3b06b707d22", "packages": [ { "name": "anahkiasen/underscore-php", @@ -1108,6 +1108,41 @@ ], "time": "2015-04-20T18:58:01+00:00" }, + { + "name": "larapack/config-writer", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/larapack/config-writer.git", + "reference": "b36a716833240fe9e8b4b4d007b68ef9e91a1124" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/larapack/config-writer/zipball/b36a716833240fe9e8b4b4d007b68ef9e91a1124", + "reference": "b36a716833240fe9e8b4b4d007b68ef9e91a1124", + "shasum": "" + }, + "type": "package", + "autoload": { + "psr-4": { + "": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Save changes to the configuration file in script.", + "keywords": [ + "config", + "larapack", + "laravel", + "package", + "save", + "writer" + ], + "time": "2016-04-28T12:45:27+00:00" + }, { "name": "laravel/framework", "version": "v5.6.26", diff --git a/config/app.php b/config/app.php index 353fd7bd..c3b9acc1 100644 --- a/config/app.php +++ b/config/app.php @@ -176,14 +176,11 @@ /* * Application Service Providers... */ + App\Modules\ModuleServiceProvider::class, App\Providers\AppServiceProvider::class, App\Providers\AuthServiceProvider::class, - // App\Providers\BroadcastServiceProvider::class, + App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, - - /* - * Webshelf Service Providers... - */ App\Providers\ConfigurationServiceProvider::class, App\Providers\ComposerServiceProvider::class, App\Providers\InstanceServiceProvider::class, @@ -212,7 +209,7 @@ 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, 'Bus' => Illuminate\Support\Facades\Bus::class, 'Cache' => Illuminate\Support\Facades\Cache::class, - 'Config' => Illuminate\Support\Facades\Config::class, + 'Config' => Larapack\ConfigWriter\Facade::class, 'Cookie' => Illuminate\Support\Facades\Cookie::class, 'Crypt' => Illuminate\Support\Facades\Crypt::class, 'DB' => Illuminate\Support\Facades\DB::class, diff --git a/config/modules.php b/config/modules.php index b703c169..b6dd0b16 100644 --- a/config/modules.php +++ b/config/modules.php @@ -2,47 +2,103 @@ return [ - /* - |-------------------------------------------------------------------------- - | Core application menus that are used on the dashboard menu. - |-------------------------------------------------------------------------- - | - | From here you can enable or disable a menu and edit the configuration - | this will allow the changes to be worked all throughout the dashboard. - */ - - [ + 'products' => [ + 'title' => 'Products', + 'enabled' => true, + 'icon' => 'fas fa-box', + 'version' => '1.3', + 'url' => 'admin/products', + 'role' => 'publisher', + ], + + 'navigation' => [ + 'title' => 'Navigation', + 'enabled' => true, + 'icon' => 'fas fa-compass', + 'version' => '2.6', + 'url' => 'admin/navigation', + 'role' => 'publisher', + ], + + 'pages' => [ + 'title' => 'Pages', + 'enabled' => true, + 'icon' => 'fab fa-readme', + 'version' => '2.1', + 'url' => 'admin/pages', + 'role' => 'publisher' + ], + + 'redirects' => [ + 'title' => 'Redirects', + 'enabled' => false, + 'icon' => 'fas fa-exchange-alt', + 'version' => '1.9', + 'url' => 'admin/redirects', + 'role' => 'publisher', + ], + + 'articles' => [ + 'title' => 'Articles', + 'enabled' => false, + 'icon' => 'fas fa-glasses', + 'version' => '1.6', + 'url' => 'admin/articles', + 'role' => 'publisher', + ], + + 'newsletters' => [ + 'title' => 'Newsletters', + 'enabled' => false, + 'icon' => 'fa-book', + 'version' => '1.0', + 'url' => 'admin/newsletter', + 'role' => 'publisher', + ], + + 'settings' => [ 'title' => 'Settings', + 'enabled' => true, 'icon' => 'fas fa-wrench', + 'version' => '1.0', 'url' => 'admin/settings', 'role' => 'administrator', ], - [ + 'accounts' => [ 'title' => 'Accounts', + 'enabled' => true, 'icon' => 'fa fa-users', + 'version' => '1.0', 'url' => 'admin/accounts', 'role' => 'administrator', ], - [ + 'filemanager' => [ 'title' => 'Filemanager', + 'enabled' => true, 'icon' => 'fas fa-toolbox', + 'version' => '1.0', 'url' => 'admin/filemanager', 'role' => 'publisher', ], - [ + 'updates' => [ 'title' => 'Updates', + 'enabled' => true, 'icon' => 'fas fa-code', + 'version' => '1.0', 'url' => 'admin/updates', 'role' => 'developer', ], - [ + 'sitemap' => [ 'title' => 'Sitemap', + 'enabled' => true, 'icon' => 'fas fa-globe', + 'version' => '1.0', 'url' => 'admin/sitemap', 'role' => 'developer', ], + ]; diff --git a/config/sentry.php b/config/sentry.php index 63e8c378..779b9801 100644 --- a/config/sentry.php +++ b/config/sentry.php @@ -4,7 +4,7 @@ 'dsn' => env('SENTRY_LARAVEL_DSN', 'https://b8aa8a46e793436885598609749d6876:803fa5f399be4309926bafb0b9bc9a2f@sentry.io/1221084'), // capture release as git sha - 'release' => trim(exec('git log --pretty="%h" -n1 HEAD')), + 'release' => '', //trim(exec('git log --pretty="%h" -n1 HEAD')), // Capture bindings on SQL queries 'breadcrumbs.sql_bindings' => true, diff --git a/database/migrations/2016_12_14_225300_create_plugins_table.php b/database/migrations/2016_12_14_225300_create_plugins_table.php index 8185f37e..8897cc81 100644 --- a/database/migrations/2016_12_14_225300_create_plugins_table.php +++ b/database/migrations/2016_12_14_225300_create_plugins_table.php @@ -26,62 +26,6 @@ public function up() $table->tinyInteger('is_backend')->nullable(); $table->timestamps(); }); - - /* - * DATA REQUIRED FOR APPLICATION CORE LOADING. - */ - $plugin = new Plugin; - $plugin->setName('products'); - $plugin->setVersion('1.0'); - $plugin->setIcon('fa-book'); - $plugin->setEnabled(true); - $plugin->setRequired(true); - $plugin->setFrontEnd(false); - $plugin->setBackEnd(true); - $plugin->save(); - - $plugin = new Plugin; - $plugin->setName('menus'); - $plugin->setVersion('1.0'); - $plugin->setIcon('fa-bars'); - $plugin->setEnabled(true); - $plugin->setFrontEnd(false); - $plugin->setBackEnd(true); - $plugin->save(); - - $plugin = new Plugin; - $plugin->setName('pages'); - $plugin->setVersion('1.0'); - $plugin->setIcon('fa-paperclip'); - $plugin->setEnabled(true); - $plugin->setFrontEnd(true); - $plugin->setBackEnd(true); - $plugin->save(); - - $plugin = new Plugin; - $plugin->setName('news'); - $plugin->setVersion('1.0'); - $plugin->setIcon('fa-newspaper-o'); - $plugin->setFrontEnd(true); - $plugin->setBackEnd(true); - $plugin->save(); - - $plugin = new Plugin; - $plugin->setName('redirects'); - $plugin->setVersion('1.0'); - $plugin->setIcon('fa-magic'); - $plugin->setFrontEnd(true); - $plugin->setBackEnd(true); - $plugin->save(); - - $plugin = new Plugin; - $plugin->setName('facebook'); - $plugin->setVersion('2.8'); - $plugin->setIcon('fa-facebook-official'); - $plugin->setHide(true); - $plugin->setFrontEnd(true); - $plugin->setBackEnd(true); - $plugin->save(); } /** diff --git a/database/migrations/2016_12_21_154441_edit_facebook_plugin_data.php b/database/migrations/2016_12_21_154441_edit_facebook_plugin_data.php index dd63c9b9..69d35f72 100644 --- a/database/migrations/2016_12_21_154441_edit_facebook_plugin_data.php +++ b/database/migrations/2016_12_21_154441_edit_facebook_plugin_data.php @@ -13,10 +13,7 @@ class EditFacebookPluginData extends Migration */ public function up() { - /** @var Plugin $plugin */ - $plugin = app(PluginRepository::class)->whereName('facebook'); - - $plugin->setHide(false)->save(); + // } /** @@ -26,9 +23,6 @@ public function up() */ public function down() { - /** @var Plugin $plugin */ - $plugin = app(PluginRepository::class)->whereName('facebook'); - - $plugin->setHide(true)->save(); + // } } diff --git a/database/migrations/2017_01_07_225206_create_carousels_table.php b/database/migrations/2017_01_07_225206_create_carousels_table.php index ed64bc73..0bbdebfa 100644 --- a/database/migrations/2017_01_07_225206_create_carousels_table.php +++ b/database/migrations/2017_01_07_225206_create_carousels_table.php @@ -38,14 +38,6 @@ public function up() $table->softDeletes(); $table->timestamps(); }); - - /** @var Plugin $plugin */ - $plugin = new Plugin(); - $plugin->setName('carousels'); - $plugin->setVersion('1.0'); - $plugin->setIcon('fa-fast-forward'); - $plugin->setBackEnd(true); - $plugin->save(); } /** @@ -58,7 +50,5 @@ public function down() \Schema::drop('carousels'); \Schema::drop('carousel_slides'); - - app(PluginRepository::class)->whereName('carousels')->delete(); } } diff --git a/database/migrations/2018_01_03_150616_cleanup_plugins.php b/database/migrations/2018_01_03_150616_cleanup_plugins.php index 96dec62f..e7750b06 100644 --- a/database/migrations/2018_01_03_150616_cleanup_plugins.php +++ b/database/migrations/2018_01_03_150616_cleanup_plugins.php @@ -19,21 +19,6 @@ public function up() Schema::drop('articles'); Schema::drop('plugin_feeds'); Schema::drop('plugin_options'); - - $plugin = app(\App\Classes\Repositories\PluginRepository::class); - - $plugin->whereName('carousels')->delete(); - $plugin->whereName('news')->delete(); - $plugin->whereName('facebook')->delete(); - - $item = $plugin->whereName('menus'); - $item->setVersion('2.6')->setRequired(false)->save(); - $item = $plugin->whereName('pages'); - $item->setVersion('2.1')->setRequired(false)->save(); - $item = $plugin->whereName('redirects'); - $item->setVersion('1.9')->setEnabled(true)->setRequired(false)->save(); - $item = $plugin->whereName('products'); - $item->setVersion('1.3')->save(); } /** diff --git a/database/migrations/2018_02_25_004151_february_update_one.php b/database/migrations/2018_02_25_004151_february_update_one.php index dc3ea9bc..cf125312 100644 --- a/database/migrations/2018_02_25_004151_february_update_one.php +++ b/database/migrations/2018_02_25_004151_february_update_one.php @@ -15,23 +15,6 @@ class FebruaryUpdateOne extends Migration */ public function up() { - $plugin = new Plugin; - - $plugin->setAttribute('name', 'articles'); - $plugin->setAttribute('version', '1.0'); - $plugin->setAttribute('icon', 'fa-book'); - $plugin->setAttribute('enabled', false); - $plugin->setAttribute('is_frontend', true); - $plugin->setAttribute('is_backend', true); - $plugin->setAttribute('required', false); - $plugin->save(); - - /** @var \App\Classes\Repositories\PluginRepository $pluginRepository */ - $pluginRepository = app(\App\Classes\Repositories\PluginRepository::class); - - $pluginRepository->whereName('menus')->setAttribute('required', true)->save(); - $pluginRepository->whereName('pages')->setAttribute('required', true)->save(); - Schema::table('plugins', function (Blueprint $table) { $table->dropColumn('version'); $table->dropColumn('icon'); @@ -62,11 +45,6 @@ public function up() $table->softDeletes(); $table->timestamps(); }); - - /* - * INDEX ALL NEW MATERIAL FOR SEARCHING. - */ - // Artisan::call('scout:mysql-index'); } /** diff --git a/database/migrations/2018_03_01_232041_march_update_one.php b/database/migrations/2018_03_01_232041_march_update_one.php index cf22105f..d8fbbdd8 100644 --- a/database/migrations/2018_03_01_232041_march_update_one.php +++ b/database/migrations/2018_03_01_232041_march_update_one.php @@ -3,7 +3,6 @@ use App\Model\Page; use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; -use App\Plugins\Newsletters\Model\Newsletter; use Illuminate\Database\Migrations\Migration; class MarchUpdateOne extends Migration @@ -15,15 +14,6 @@ class MarchUpdateOne extends Migration */ public function up() { - $plugin = new \App\Model\Plugin(); - - $plugin->setAttribute('name', 'newsletters'); - $plugin->setAttribute('enabled', false); - $plugin->setAttribute('is_frontend', true); - $plugin->setAttribute('is_backend', true); - $plugin->setAttribute('required', false); - $plugin->save(); - Schema::create('newsletters', function (Blueprint $table) { $table->increments('id'); $table->string('title'); diff --git a/database/migrations/2018_06_03_001436_june_update_one.php b/database/migrations/2018_06_03_001436_june_update_one.php index 94f416d5..38ae73cb 100644 --- a/database/migrations/2018_06_03_001436_june_update_one.php +++ b/database/migrations/2018_06_03_001436_june_update_one.php @@ -1,9 +1,7 @@ 'Articles', + 'identifier' => 'articles', + 'slug' => 'articles', + 'type' => PageTypes::TYPE_MODULE, + 'option' => PageOptions::OPTION_DISABLED, + ]); + + Schema::table('pages', function(Blueprint $table) { + $table->string('module')->after('option')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('modules'); + } +} diff --git a/resources/admin/views/structure/navbar.blade.php b/resources/admin/views/structure/navbar.blade.php index e4d4e3fb..7db22470 100644 --- a/resources/admin/views/structure/navbar.blade.php +++ b/resources/admin/views/structure/navbar.blade.php @@ -19,7 +19,7 @@ diff --git a/resources/admin/views/structure/sidebar.blade.php b/resources/admin/views/structure/sidebar.blade.php index d7d2d14f..8eaffa76 100644 --- a/resources/admin/views/structure/sidebar.blade.php +++ b/resources/admin/views/structure/sidebar.blade.php @@ -22,23 +22,10 @@ - @foreach(plugins()->viewable() as $plugin) - -
  • - - - - - {{ ucfirst($plugin->name()) }} - - -
  • - - @endforeach - @foreach(config('modules') as $module) - @role($module['role']) + @if(account()->hasRole($module['role'])) +
  • diff --git a/routes/web.php b/routes/web.php index 200190f4..2c85d8c8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -14,7 +14,7 @@ | contains the "web" middleware group. Now create something great! | */ - Route::get('/')->uses('PageController@index')->name('index'); + Route::get('/')->uses('App\Modules\Pages\FrontendController@index')->name('index'); /* |-------------------------------------------------------------------------- @@ -26,7 +26,7 @@ | contains the "web" middleware group. Now create something great! | */ - Route::get('/admin')->uses('DashboardController@index')->name('dashboard')->middleware(['web', 'auth', 'gateway']); + Route::get('/admin')->uses('App\Http\Controllers\DashboardController@index')->name('dashboard')->middleware(['web', 'auth', 'gateway']); /* |-------------------------------------------------------------------------- @@ -38,7 +38,7 @@ | contains the "web" middleware group. Now create something great! | */ - Route::get('/admin/login')->uses('AuthController@form')->name('login'); + Route::get('/admin/login')->uses('App\Http\Controllers\AuthController@form')->name('login'); /* |-------------------------------------------------------------------------- @@ -50,7 +50,7 @@ | contains the "web" middleware group. Now create something great! | */ - Route::post('/admin/login')->uses('AuthController@login')->name('AuthLogin'); + Route::post('/admin/login')->uses('App\Http\Controllers\AuthController@login')->name('AuthLogin'); /* |-------------------------------------------------------------------------- @@ -62,4 +62,4 @@ | contains the "web" middleware group. Now create something great! | */ - Route::get('/admin/logout')->uses('AuthController@logout')->name('AuthLogout'); + Route::get('/admin/logout')->uses('App\Http\Controllers\AuthController@logout')->name('AuthLogout'); diff --git a/tests/Article/ArticleViewingTest.php b/tests/Article/ArticleViewingTest.php index 8d26141b..18708ee6 100644 --- a/tests/Article/ArticleViewingTest.php +++ b/tests/Article/ArticleViewingTest.php @@ -2,8 +2,8 @@ namespace Tests\Article; +use Illuminate\Support\Facades\App; use Tests\TestCase; -use App\Model\Plugin; use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; @@ -19,13 +19,6 @@ class ArticleViewingTest extends TestCase */ use RefreshDatabase; - /** - * The plugin model for articles. - * - * @var Article - */ - private $plugin; - /** * The Faker instance. * @@ -40,13 +33,9 @@ public function setUp() { parent::setUp(); - $this->plugin = Plugin::install('articles'); - - Route::middleware('web', 'auth', 'gateway')->group(base_path(sprintf('app/Plugins/%s/Routes/backend.php', 'Articles'))); - - Route::middleware('web')->group(base_path(sprintf('app/Plugins/%s/Routes/frontend.php', 'Articles'))); + Route::middleware('web', 'auth', 'gateway')->group(base_path(sprintf('app/Modules/%s/Routes/backend.php', 'Articles'))); - // $this->app['router']->getRoutes()->refreshNameLookups(); + Route::middleware('web')->group(base_path(sprintf('app/Modules/%s/Routes/frontend.php', 'Articles'))); } /** diff --git a/tests/Module/ModuleManagerTest.php b/tests/Module/ModuleManagerTest.php new file mode 100644 index 00000000..806044e4 --- /dev/null +++ b/tests/Module/ModuleManagerTest.php @@ -0,0 +1,182 @@ +expectException(Exception::class); + + app(ModuleManager::class)->enable('unknown'); + } + + /** + * @test + */ + public function a_module_can_be_disabled_using_configuration_file() + { + Config::set('modules.config', ['enabled' => true]); + + $this->willSaveToConfigurationFile(); + + app(ModuleManager::class)->disable('config'); + + $this->assertFalse(app(ModuleManager::class)->status('config')); + } + + /** + * @test + */ + public function a_module_can_be_enabled_using_configuration_file() + { + Config::set('modules.config', ['enabled' => false]); + + $this->willSaveToConfigurationFile(); + + app(ModuleManager::class)->enable('config'); + + $this->assertTrue(app(ModuleManager::class)->status('config')); + } + + /** + * @test + */ + public function a_module_can_be_toggled_using_configuration_file() + { + Config::set('modules.config', ['enabled' => false]); + + $this->willSaveToConfigurationFile(); + + app(ModuleManager::class)->toggle('config'); + + $this->assertTrue(app(ModuleManager::class)->status('config')); + + app(ModuleManager::class)->toggle('config'); + + $this->assertFalse(app(ModuleManager::class)->status('config')); + } + + /** + * @test + */ + public function a_module_will_enable_pages_attached_to_module() + { + /** @var Page $page */ + $page = factory('App\Model\Page')->create(['module' => 'pictures', 'option' => PageOptions::OPTION_DISABLED]); + + Config::set('modules.pictures', ['title' => 'Pictures', 'enabled' => false]); + + $this->willSaveToConfigurationFile(); + + app(ModuleManager::class)->enable('pictures'); + + $this->assertDatabaseHas('pages', ['id' => $page->id, 'option' => PageOptions::OPTION_DEFAULT]); + + $this->assertTrue(app(ModuleManager::class)->status('pictures')); + } + + /** + * @test + */ + public function a_module_will_disable_pages_attached_to_module() + { + /** @var Page $page */ + $page = factory('App\Model\Page')->create(['module' => 'pictures', 'option' => PageOptions::OPTION_PUBLIC]); + + Config::set('modules.pictures', ['title' => 'Pictures', 'enabled' => true]); + + $this->willSaveToConfigurationFile(); + + app(ModuleManager::class)->disable('pictures'); + + $this->assertDatabaseHas('pages', ['id' => $page->id, 'option' => PageOptions::OPTION_PUBLIC | PageOptions::OPTION_DISABLED]); + + $this->assertFalse(app(ModuleManager::class)->status('pictures')); + } + + /** + * @test + */ + public function a_module_will_enable_multiple_pages_attached_to_module(){ + /** @var Page $page */ + $pages = factory('App\Model\Page', 4)->create(['module' => 'unit-testing', 'option' => PageOptions::OPTION_DISABLED]); + + Config::set('modules.unit-testing', ['title' => 'Unit Testing', 'enabled' => false]); + + $this->willSaveToConfigurationFile(); + + app(ModuleManager::class)->enable('unit-testing'); + + foreach($pages as $page) { + $this->assertDatabaseHas('pages', ['id' => $page->id, 'option' => PageOptions::OPTION_DEFAULT]); + } + + $this->assertTrue(app(ModuleManager::class)->status('unit-testing')); + } + + /** + * @test + */ + public function a_module_will_disable_multiple_pages_attached_to_module(){ + /** @var Page $page */ + $pages = factory('App\Model\Page', 4)->create(['module' => 'unit-testing', 'option' => PageOptions::OPTION_DEFAULT]); + + Config::set('modules.unit-testing', ['title' => 'Unit Testing', 'enabled' => true]); + + $this->willSaveToConfigurationFile(); + + app(ModuleManager::class)->disable('unit-testing'); + + foreach($pages as $page) { + $this->assertDatabaseHas('pages', ['id' => $page->id, 'option' => PageOptions::OPTION_DISABLED]); + } + + $this->assertFalse(app(ModuleManager::class)->status('unit-testing')); + } + + + /** + * Mock the instance of saving to a configuration file. + */ + private function willSaveToConfigurationFile(): void + { + $mock = $this->getMockBuilder(ModuleRepository::class) + ->enableOriginalConstructor() + ->setMethodsExcept(['set', 'get']) + ->getMock(); + + $mock->method('save')->willReturn(true); + + $this->app->instance(ModuleRepository::class, $mock); + } +} diff --git a/tests/Products/ProductDashboardTest.php b/tests/Products/ProductDashboardTest.php new file mode 100644 index 00000000..b04c00d7 --- /dev/null +++ b/tests/Products/ProductDashboardTest.php @@ -0,0 +1,33 @@ +signIn(); + + $response = $this->get('admin/products'); + + foreach (config('modules') as $module) { + $response->assertSee($module['title']); + } + + $response->assertOk(); + } + +} diff --git a/tests/Products/ProductInstallationTest.php b/tests/Products/ProductInstallationTest.php new file mode 100644 index 00000000..d5e8d5f5 --- /dev/null +++ b/tests/Products/ProductInstallationTest.php @@ -0,0 +1,36 @@ +shouldReceive('enable')->andReturn(true); + + Config::set('modules.test', ['enabled' => false]); + + $response = $this->get('/admin/products/test/toggle'); + + $response->assertRedirect('/admin/products')->assertSee('test'); + } + +} From 249e00f4d7a91507aae0e1fd9953ba073e25fc55 Mon Sep 17 00:00:00 2001 From: Mark Hester Date: Fri, 6 Jul 2018 13:24:33 +0000 Subject: [PATCH 2/8] Apply fixes from StyleCI [ci skip] [skip ci] --- app/Model/Page.php | 6 ++-- app/Modules/Articles/Routes/backend.php | 2 +- app/Modules/ModuleManager.php | 11 +++---- app/Modules/ModuleRepository.php | 8 ++--- app/Modules/ModuleServiceProvider.php | 13 +++----- app/Modules/Navigation/FrontendController.php | 4 +-- app/Modules/Pages/FrontendController.php | 5 ++-- app/Modules/Products/BackendController.php | 5 +--- app/Modules/Redirects/BackendController.php | 2 +- app/Providers/AppServiceProvider.php | 1 - app/Providers/RouteServiceProvider.php | 3 +- config/modules.php | 2 +- ...2016_12_14_225300_create_plugins_table.php | 1 - ...12_21_154441_edit_facebook_plugin_data.php | 2 -- ...17_01_07_225206_create_carousels_table.php | 2 -- .../2018_02_25_004151_february_update_one.php | 2 -- ...2018_07_04_210841_create_modules_table.php | 4 +-- tests/Article/ArticleViewingTest.php | 2 +- tests/Module/ModuleManagerTest.php | 30 +++++++++---------- tests/Products/ProductDashboardTest.php | 6 ++-- tests/Products/ProductInstallationTest.php | 12 +++----- 21 files changed, 44 insertions(+), 79 deletions(-) diff --git a/app/Model/Page.php b/app/Model/Page.php index 5515676d..a82c86e3 100644 --- a/app/Model/Page.php +++ b/app/Model/Page.php @@ -3,10 +3,10 @@ namespace App\Model; use Carbon\Carbon; -use Illuminate\Support\Facades\DB; use Laravel\Scout\Searchable; use App\Model\Concerns\Publishers; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\DB; use App\Classes\Interfaces\Linkable; use App\Model\Concerns\ActivityFeed; use App\Plugins\Pages\Model\PageTypes; @@ -303,7 +303,7 @@ public function isType(string $type) /** * Toggle the disability of all the module pages. - * (Enable, Disable); + * (Enable, Disable);. * * If one page fails, do not toggle. * @@ -313,7 +313,7 @@ public function isType(string $type) */ public static function toggleModuleDisability(string $module, bool $active) { - DB::transaction(function() use ($module, $active){ + DB::transaction(function () use ($module, $active) { if ($active == true) { foreach (self::whereModule($module)->get() as $page) { $page->update(['option' => $page->option & ~PageOptions::OPTION_DISABLED]); diff --git a/app/Modules/Articles/Routes/backend.php b/app/Modules/Articles/Routes/backend.php index 23024749..a4b7625a 100644 --- a/app/Modules/Articles/Routes/backend.php +++ b/app/Modules/Articles/Routes/backend.php @@ -14,4 +14,4 @@ */ Route::get('admin/articles/categories')->uses('BackendController@categories')->name('admin.articles.categories.index'); Route::post('admin/articles/categories')->uses('BackendController@categories_store')->name('admin.articles.categories.store'); - Route::resource('admin/articles', 'BackendController', ['as' => 'admin']); \ No newline at end of file + Route::resource('admin/articles', 'BackendController', ['as' => 'admin']); diff --git a/app/Modules/ModuleManager.php b/app/Modules/ModuleManager.php index 41e38bc8..3edff650 100644 --- a/app/Modules/ModuleManager.php +++ b/app/Modules/ModuleManager.php @@ -1,17 +1,14 @@ repository->set("{$module}.enabled", !$this->repository->get("{$module}.enabled"))->save(); + $this->repository->set("{$module}.enabled", ! $this->repository->get("{$module}.enabled"))->save(); $this->updatePageBelongingTo($module, $this->repository->get("{$module}.enabled")); } @@ -94,4 +91,4 @@ private function updatePageBelongingTo($module, bool $status) { Page::toggleModuleDisability($module, $status); } -} \ No newline at end of file +} diff --git a/app/Modules/ModuleRepository.php b/app/Modules/ModuleRepository.php index 837c3896..bda13160 100644 --- a/app/Modules/ModuleRepository.php +++ b/app/Modules/ModuleRepository.php @@ -5,13 +5,10 @@ use Larapack\ConfigWriter\Repository; /** - * Class ConfigRepository - * - * @package App\Modules\Configs + * Class ConfigRepository. */ class ModuleRepository extends Repository { - /** * ConfigRepository constructor. */ @@ -43,7 +40,6 @@ public function set($key, $value = null) * @param null $to * @param bool $validate * @return bool - * */ public function save($from = null, $to = null, $validate = true) { @@ -51,4 +47,4 @@ public function save($from = null, $to = null, $validate = true) return true; } -} \ No newline at end of file +} diff --git a/app/Modules/ModuleServiceProvider.php b/app/Modules/ModuleServiceProvider.php index 8a081b76..af17586b 100644 --- a/app/Modules/ModuleServiceProvider.php +++ b/app/Modules/ModuleServiceProvider.php @@ -2,16 +2,12 @@ namespace App\Modules; -use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Route; +use Illuminate\Support\Facades\Config; use Illuminate\Support\ServiceProvider; -use Larapack\ConfigWriter\Repository as WriteConfigTo; -use Larapack\ConfigWriter\Repository; /** - * Class ModuleServiceProvider - * - * @package App\Modules + * Class ModuleServiceProvider. */ class ModuleServiceProvider extends ServiceProvider { @@ -32,7 +28,7 @@ public function boot() */ public function register() { - $this->app->singleton(ModuleManager::class, function() { + $this->app->singleton(ModuleManager::class, function () { return new ModuleManager(app(ModuleRepository::class)); }); } @@ -44,8 +40,7 @@ public function register() */ public static function map() { - foreach (config('modules') as $module) - { + foreach (config('modules') as $module) { $namespace = sprintf('App\Modules\%s', $module['title']); if (config("modules.{$module['title']}.enabled")) { diff --git a/app/Modules/Navigation/FrontendController.php b/app/Modules/Navigation/FrontendController.php index 23530c63..c601d0e6 100644 --- a/app/Modules/Navigation/FrontendController.php +++ b/app/Modules/Navigation/FrontendController.php @@ -3,9 +3,7 @@ namespace App\Plugins\Menus; /** - * Class FrontendController - * - * @package App\Plugins\Menus + * Class FrontendController. */ class FrontendController { diff --git a/app/Modules/Pages/FrontendController.php b/app/Modules/Pages/FrontendController.php index 3fe17471..e6a74c27 100644 --- a/app/Modules/Pages/FrontendController.php +++ b/app/Modules/Pages/FrontendController.php @@ -8,20 +8,19 @@ namespace App\Modules\Pages; -use App\Classes\Library\PageLoader\Frontpage; -use App\Jobs\IncrementViews; use App\Model\Page; +use App\Jobs\IncrementViews; use App\Modules\ModuleEngine; use App\Classes\SitemapGenerator; use App\Classes\Interfaces\Sitemap; use App\Classes\Repositories\PageRepository; +use App\Classes\Library\PageLoader\Frontpage; /** * Class UserController. */ class FrontendController extends ModuleEngine implements Sitemap { - /** * @var Page */ diff --git a/app/Modules/Products/BackendController.php b/app/Modules/Products/BackendController.php index 8fb67e7b..e6b0736a 100644 --- a/app/Modules/Products/BackendController.php +++ b/app/Modules/Products/BackendController.php @@ -4,12 +4,9 @@ use App\Modules\ModuleEngine; use App\Modules\ModuleManager; -use Illuminate\Http\Request; /** - * Class BackendController - * - * @package App\Modules\Products + * Class BackendController. */ class BackendController extends ModuleEngine { diff --git a/app/Modules/Redirects/BackendController.php b/app/Modules/Redirects/BackendController.php index c98ed4ec..8f755dc0 100644 --- a/app/Modules/Redirects/BackendController.php +++ b/app/Modules/Redirects/BackendController.php @@ -3,8 +3,8 @@ namespace App\Modules\Redirects; use App\Model\Redirect; -use App\Modules\ModuleEngine; use Illuminate\Http\Request; +use App\Modules\ModuleEngine; use App\Classes\Repositories\PageRepository; use App\Classes\Repositories\RedirectRepository; diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 176bb5de..70219816 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,7 +2,6 @@ namespace App\Providers; -use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 5a792efb..9a0847d9 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -2,9 +2,8 @@ namespace App\Providers; -use App\Model\Plugin; -use App\Modules\ModuleServiceProvider; use Illuminate\Support\Facades\Route; +use App\Modules\ModuleServiceProvider; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; /** diff --git a/config/modules.php b/config/modules.php index b6dd0b16..541dc97d 100644 --- a/config/modules.php +++ b/config/modules.php @@ -26,7 +26,7 @@ 'icon' => 'fab fa-readme', 'version' => '2.1', 'url' => 'admin/pages', - 'role' => 'publisher' + 'role' => 'publisher', ], 'redirects' => [ diff --git a/database/migrations/2016_12_14_225300_create_plugins_table.php b/database/migrations/2016_12_14_225300_create_plugins_table.php index 8897cc81..baf2095b 100644 --- a/database/migrations/2016_12_14_225300_create_plugins_table.php +++ b/database/migrations/2016_12_14_225300_create_plugins_table.php @@ -1,6 +1,5 @@ PageOptions::OPTION_DISABLED, ]); - Schema::table('pages', function(Blueprint $table) { + Schema::table('pages', function (Blueprint $table) { $table->string('module')->after('option')->nullable(); }); } diff --git a/tests/Article/ArticleViewingTest.php b/tests/Article/ArticleViewingTest.php index 18708ee6..e1210c9a 100644 --- a/tests/Article/ArticleViewingTest.php +++ b/tests/Article/ArticleViewingTest.php @@ -2,8 +2,8 @@ namespace Tests\Article; -use Illuminate\Support\Facades\App; use Tests\TestCase; +use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; diff --git a/tests/Module/ModuleManagerTest.php b/tests/Module/ModuleManagerTest.php index 806044e4..1939f12b 100644 --- a/tests/Module/ModuleManagerTest.php +++ b/tests/Module/ModuleManagerTest.php @@ -2,30 +2,27 @@ namespace Tests\Module; -use App\Model\Page; -use App\Plugins\Pages\Model\PageOptions; use Exception; +use App\Model\Page; +use Tests\TestCase; +use App\Modules\ModuleManager; use App\Modules\ModuleRepository; -use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Config; -use App\Modules\ModuleManager; +use App\Plugins\Pages\Model\PageOptions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithoutMiddleware; use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration; -use Tests\TestCase; /** - * Class ModuleManagerTest - * - * @package Tests\Module + * Class ModuleManagerTest. */ class ModuleManagerTest extends TestCase { - /** + /* * Test traits. */ use WithoutMiddleware, RefreshDatabase; - - /** + /* * Mockery */ use MockeryPHPUnitIntegration; @@ -127,7 +124,8 @@ public function a_module_will_disable_pages_attached_to_module() /** * @test */ - public function a_module_will_enable_multiple_pages_attached_to_module(){ + public function a_module_will_enable_multiple_pages_attached_to_module() + { /** @var Page $page */ $pages = factory('App\Model\Page', 4)->create(['module' => 'unit-testing', 'option' => PageOptions::OPTION_DISABLED]); @@ -137,7 +135,7 @@ public function a_module_will_enable_multiple_pages_attached_to_module(){ app(ModuleManager::class)->enable('unit-testing'); - foreach($pages as $page) { + foreach ($pages as $page) { $this->assertDatabaseHas('pages', ['id' => $page->id, 'option' => PageOptions::OPTION_DEFAULT]); } @@ -147,7 +145,8 @@ public function a_module_will_enable_multiple_pages_attached_to_module(){ /** * @test */ - public function a_module_will_disable_multiple_pages_attached_to_module(){ + public function a_module_will_disable_multiple_pages_attached_to_module() + { /** @var Page $page */ $pages = factory('App\Model\Page', 4)->create(['module' => 'unit-testing', 'option' => PageOptions::OPTION_DEFAULT]); @@ -157,14 +156,13 @@ public function a_module_will_disable_multiple_pages_attached_to_module(){ app(ModuleManager::class)->disable('unit-testing'); - foreach($pages as $page) { + foreach ($pages as $page) { $this->assertDatabaseHas('pages', ['id' => $page->id, 'option' => PageOptions::OPTION_DISABLED]); } $this->assertFalse(app(ModuleManager::class)->status('unit-testing')); } - /** * Mock the instance of saving to a configuration file. */ diff --git a/tests/Products/ProductDashboardTest.php b/tests/Products/ProductDashboardTest.php index b04c00d7..2c11230d 100644 --- a/tests/Products/ProductDashboardTest.php +++ b/tests/Products/ProductDashboardTest.php @@ -2,14 +2,13 @@ namespace Tests\Products; -use Illuminate\Foundation\Testing\WithoutMiddleware; use Tests\TestCase; -use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; +use Illuminate\Foundation\Testing\WithoutMiddleware; class ProductDashboardTest extends TestCase { - /** + /* * Database traits. */ use RefreshDatabase, WithoutMiddleware; @@ -29,5 +28,4 @@ public function the_modules_are_viewable_on_the_products_index() $response->assertOk(); } - } diff --git a/tests/Products/ProductInstallationTest.php b/tests/Products/ProductInstallationTest.php index d5e8d5f5..8abd8e7a 100644 --- a/tests/Products/ProductInstallationTest.php +++ b/tests/Products/ProductInstallationTest.php @@ -2,19 +2,16 @@ namespace Tests\Products; +use Mockery; +use Tests\TestCase; use App\Modules\ModuleManager; use Illuminate\Support\Facades\Config; -use \Mockery; -use Illuminate\Foundation\Testing\WithoutMiddleware; -use Illuminate\Support\Facades\Event; -use Larapack\ConfigWriter\Repository; -use Tests\TestCase; -use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; +use Illuminate\Foundation\Testing\WithoutMiddleware; class ProductInstallationTest extends TestCase { - /** + /* * Database traits. */ use RefreshDatabase, WithoutMiddleware; @@ -32,5 +29,4 @@ public function modules_can_be_enabled() $response->assertRedirect('/admin/products')->assertSee('test'); } - } From 7cdd1b525f3781b63f65881644a5ec0f5e5fa7e8 Mon Sep 17 00:00:00 2001 From: Mark Hester Date: Fri, 6 Jul 2018 17:42:42 +0100 Subject: [PATCH 3/8] More conversions of plugins to modules. --- app/Classes/Repositories/PageRepository.php | 4 +- app/Console/Commands/JuneUpdateOne.php | 4 +- app/Model/Page.php | 6 +- app/Model/Plugin.php | 299 ------------------ app/Modules/ModuleServiceProvider.php | 4 +- app/Modules/Navigation/FrontendController.php | 2 +- app/Modules/Newsletters/BackendController.php | 2 +- .../Newsletters/FrontendController.php | 6 +- app/Modules/Newsletters/Model/Newsletter.php | 2 +- .../Model/NewsletterRepository.php | 2 +- .../Newsletters/Model/NewsletterTemplate.php | 2 +- .../Newsletters/Model/NewsletterUser.php | 2 +- app/Modules/Pages/BackendController.php | 2 +- app/Modules/Pages/Blade/index.blade.php | 2 - app/Modules/Products/BackendController.php | 8 +- app/Modules/Redirects/FrontendController.php | 2 +- app/Modules/Sitemap/Controller.php | 67 +--- app/Modules/Sitemap/Routes/frontend.php | 2 +- database/factories/UserFactory.php | 6 +- .../2018_03_01_232041_march_update_one.php | 1 + .../2018_06_03_001436_june_update_one.php | 2 + ...2018_07_04_210841_create_modules_table.php | 34 +- .../admin/views/structure/sidebar.blade.php | 2 +- tests/Article/ArticleInstallationTest.php | 87 ----- tests/Article/ArticleViewingTest.php | 5 +- tests/Module/ModuleManagerTest.php | 2 +- tests/Products/ProductInstallationTest.php | 6 +- 27 files changed, 71 insertions(+), 492 deletions(-) delete mode 100644 app/Model/Plugin.php delete mode 100644 tests/Article/ArticleInstallationTest.php diff --git a/app/Classes/Repositories/PageRepository.php b/app/Classes/Repositories/PageRepository.php index 27e0329d..ff419984 100644 --- a/app/Classes/Repositories/PageRepository.php +++ b/app/Classes/Repositories/PageRepository.php @@ -53,9 +53,9 @@ public function allNormalPages() * * @return $collection */ - public function allPluginPages() + public function allModulePages() { - $bitmask = PageTypes::TYPE_PLUGIN; + $bitmask = PageTypes::TYPE_MODULE; return $this->model->whereRaw('`type` & '.$bitmask.'='.$bitmask)->get(); } diff --git a/app/Console/Commands/JuneUpdateOne.php b/app/Console/Commands/JuneUpdateOne.php index b7a7d0d5..2d7760fa 100644 --- a/app/Console/Commands/JuneUpdateOne.php +++ b/app/Console/Commands/JuneUpdateOne.php @@ -4,8 +4,8 @@ use App\Model\Page; use Illuminate\Console\Command; -use App\Plugins\Pages\Model\PageTypes; -use App\Plugins\Pages\Model\PageOptions; +use App\Modules\Pages\Model\PageTypes; +use App\Modules\Pages\Model\PageOptions; use App\Classes\Repositories\PageRepository; class JuneUpdateOne extends Command diff --git a/app/Model/Page.php b/app/Model/Page.php index a82c86e3..f6b28053 100644 --- a/app/Model/Page.php +++ b/app/Model/Page.php @@ -9,8 +9,8 @@ use Illuminate\Support\Facades\DB; use App\Classes\Interfaces\Linkable; use App\Model\Concerns\ActivityFeed; -use App\Plugins\Pages\Model\PageTypes; -use App\Plugins\Pages\Model\PageOptions; +use App\Modules\Pages\Model\PageTypes; +use App\Modules\Pages\Model\PageOptions; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -290,7 +290,7 @@ public function hasOption($options) /** * Return if the current page type matches the condition giving. * - * @param PageTypes $type The type required for the condition + * @param string $type The type required for the condition * * @return bool The condition of the function. */ diff --git a/app/Model/Plugin.php b/app/Model/Plugin.php deleted file mode 100644 index 172a40e5..00000000 --- a/app/Model/Plugin.php +++ /dev/null @@ -1,299 +0,0 @@ - 'boolean', 'required' => 'boolean']; - - /** - * Undocumented function. - * - * @return void - */ - public function getRouteKeyName() - { - return 'name'; - } - - /** - * Toggle the enabled status of the plugin. - * - * @return bool - */ - public function toggle() - { - return $this->update(['enabled' => ! $this->enabled]); - } - - /** - * Return the namespace path to the controller of the plugin. - * - * @return string - */ - public function getControllerAttribute() - { - return app()->make(sprintf("App\Plugins\%s\%sController", $this->name, $this->name)); - } - - /** - * Call the install method on the plugins controller. - * - * @param string $plugin_name The plugin name to install - * @return Plugin The model instance of the installed plugin - */ - public static function install(string $plugin_name) - { - $plugin = self::whereName($plugin_name)->first(); - - $plugin->update(['enabled' => true]); - - $plugin->controller->install(); - - return $plugin; - } - - /** - * @deprecated - * @return PluginHandler - */ - protected function getHandlerAttribute() - { - return app(sprintf("%s\%sController", $this->dirNamespace(), ucfirst($this->name))); - } - - /** - * ==========================================================. - * - * GET THE ATTRIBUTES OF THE MODEL - * - * ========================================================== - */ - public function icon() - { - return $this->controller->icon(); - } - - public function name() - { - return $this->name; - } - - public function version() - { - return $this->controller->version(); - } - - public function isEnabled() - { - return $this->getAttribute('enabled') == true; - } - - public function isDisabled() - { - return $this->getAttribute('enabled') == false; - } - - public function isFrontEnd() - { - return $this->getAttribute('is_frontend'); - } - - public function isBackEnd() - { - return $this->getAttribute('is_backend'); - } - - public function getCreatedAt() - { - return $this->getAttribute('created_at'); - } - - public function getUpdatedAt() - { - return $this->getAttribute('updated_at'); - } - - public function setEnabled($boolean) - { - if ($boolean == true) { - return $this->enable(); - } - - return $this->disable(); - } - - /** - * Enable the product. - * - * @return $this - */ - public function enable() - { - $this->setAttribute('enabled', true); - - return $this; - } - - /** - * Disable the product. - * - * @return $this - */ - public function disable() - { - $this->setAttribute('enabled', false); - - return $this; - } - - public function setInstalled(bool $boolean) - { - $this->setAttribute('installed', $boolean ? 1 : 0); - - return $this; - } - - /** - * @return mixed - */ - public function isInstalled() - { - return $this->getAttribute('installed') ? true : false; - } - - public function setName($string) - { - $this->setAttribute('name', $string); - - return $this; - } - - public function setVersion($integer) - { - $this->setAttribute('version', $integer); - - return $this; - } - - public function setIcon($string) - { - $this->setAttribute('icon', $string); - - return $this; - } - - public function adminUrl() - { - if ($this->isBackEnd()) { - return route("admin.{$this->name}.index"); - } - - throw new \Exception('This is not a backend enabled plugin and should not be used here.'); - } - - public function userUrl() - { - if ($this->isFrontEnd()) { - return url($this->name()); - } - - throw new \Exception('This is not a frontend enabled plugin and should not be used here.'); - } - - public function isHidden() - { - return $this->getAttribute('hidden') ? true : false; - } - - public function setHide(bool $boolean) - { - $this->setAttribute('hidden', $boolean ? 1 : 0); - - return $this; - } - - public function setRequired($boolean) - { - $this->setAttribute('required', $boolean); - - return $this; - } - - public function setFrontEnd($boolean) - { - $this->setAttribute('is_frontend', $boolean); - - return $this; - } - - public function setBackEnd($boolean) - { - $this->setAttribute('is_backend', $boolean); - - return $this; - } - - /** - * @return \Illuminate\Database\Eloquent\Relations\HasMany - */ - public function options() - { - return $this->hasMany(PluginOption::class, 'plugin_id', 'id'); - } - - public function option($key) - { - return $this->options->where('key', $key)->first()->value(); - } - - public function feeds() - { - return $this->hasMany(PluginFeed::class, 'plugin_id', 'id'); - } -} diff --git a/app/Modules/ModuleServiceProvider.php b/app/Modules/ModuleServiceProvider.php index af17586b..6656d7ba 100644 --- a/app/Modules/ModuleServiceProvider.php +++ b/app/Modules/ModuleServiceProvider.php @@ -40,10 +40,10 @@ public function register() */ public static function map() { - foreach (config('modules') as $module) { + foreach (config('modules') as $key => $module) { $namespace = sprintf('App\Modules\%s', $module['title']); - if (config("modules.{$module['title']}.enabled")) { + if (config("modules.{$key}.enabled")) { $backendRoute = base_path(sprintf('app/Modules/%s/Routes/backend.php', $module['title'])); if (file_exists($backendRoute)) { Route::middleware(['web', 'auth', 'gateway'])->namespace($namespace)->group($backendRoute); diff --git a/app/Modules/Navigation/FrontendController.php b/app/Modules/Navigation/FrontendController.php index c601d0e6..93f82db6 100644 --- a/app/Modules/Navigation/FrontendController.php +++ b/app/Modules/Navigation/FrontendController.php @@ -1,6 +1,6 @@ make('index')->with('pages', $this->repository->allPluginPages()); + return $this->make('index')->with('pages', $this->repository->allModulePages()); } /** diff --git a/app/Modules/Pages/Blade/index.blade.php b/app/Modules/Pages/Blade/index.blade.php index 33d22af8..d608b83a 100644 --- a/app/Modules/Pages/Blade/index.blade.php +++ b/app/Modules/Pages/Blade/index.blade.php @@ -1,7 +1,5 @@ @extends('dashboard::frame') - - @section('title') Website Pages @endsection diff --git a/app/Modules/Products/BackendController.php b/app/Modules/Products/BackendController.php index e6b0736a..7dd0d92d 100644 --- a/app/Modules/Products/BackendController.php +++ b/app/Modules/Products/BackendController.php @@ -31,9 +31,15 @@ public function index() * * @param string $module * @param ModuleManager $modules + * + * @return \Illuminate\Http\RedirectResponse + * + * @throws \App\Modules\ModuleNotFoundException */ public function toggle(string $module, ModuleManager $modules) { - // + $modules->toggle(strtolower($module)); + + return response()->redirectToRoute('admin.products.index'); } } diff --git a/app/Modules/Redirects/FrontendController.php b/app/Modules/Redirects/FrontendController.php index 28de4198..f99a7222 100644 --- a/app/Modules/Redirects/FrontendController.php +++ b/app/Modules/Redirects/FrontendController.php @@ -1,6 +1,6 @@ sitemap = $sitemap; - - $this->plugins = $plugins; - } - - /** - * @return View - * @internal param PluginRepository $plugins - */ - public function iframe() - { - // this is located on the dashboard. - // set it up as a dashboard controller. - $dashboard = app(DashboardController::class); - - $this->loadPluginSitemaps($this->plugins->allWhereActive()); - // get and create an array of all the sitemaps to be loaded - // send to the view for display. - - return $this->make('index')->with('sitemaps', $this->sitemap->generateArray()); - } - - /** - * @param PluginRepository $plugins - * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response - */ - public function all() - { - $this->loadPluginSitemaps($this->plugins->allWhereActive()); - - return response($this->sitemap->generateXML(), 200, ['Content-Type' => 'text/xml;charset=utf-8']); - } - - private function loadPluginSitemaps(Collection $plugins) - { - - /** @var Plugin $plugin */ - foreach ($plugins as $plugin) { - $classDir = 'App\Plugins\\'.ucfirst($plugin->name).'\\FrontendController'; - - if (class_exists($classDir)) { - $class = app($classDir); - - if ($class instanceof Sitemap) { - $this->sitemap($class); - } - } - } - } - - /** - * Get the plugin sitemap function and its contents. - * - * @param Sitemap $plugin - * @return bool|mixed - */ - private function sitemap(Sitemap $plugin) - { - return $plugin->sitemap($this->sitemap); } } diff --git a/app/Modules/Sitemap/Routes/frontend.php b/app/Modules/Sitemap/Routes/frontend.php index 9c5ae580..962988fd 100644 --- a/app/Modules/Sitemap/Routes/frontend.php +++ b/app/Modules/Sitemap/Routes/frontend.php @@ -15,7 +15,7 @@ // Get Requests. // ================================================================================== - Route::get('/sitemap.xml')->uses('Controller@all')->name('sitemap'); + //Route::get('/sitemap.xml')->uses('Controller@all')->name('sitemap'); // Post Requests. // ================================================================================== diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 0ea1930b..a224241c 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -2,8 +2,8 @@ use Faker\Generator as Faker; use App\Classes\Roles\Administrator; -use App\Plugins\Pages\Model\PageTypes; -use App\Plugins\Pages\Model\PageOptions; +use App\Modules\Pages\Model\PageTypes; +use App\Modules\Pages\Model\PageOptions; /* |-------------------------------------------------------------------------- @@ -38,7 +38,7 @@ return [ 'seo_title' => $title, 'seo_keywords' => $faker->paragraph(1), - 'seo_description' => $faker->paragraph(2), + 'seo_description' => $faker->paragraph(1), 'prefix' => $faker->word, 'slug' => str_slug($title), 'views' => $faker->numberBetween(75, 900), diff --git a/database/migrations/2018_03_01_232041_march_update_one.php b/database/migrations/2018_03_01_232041_march_update_one.php index d8fbbdd8..13fe3810 100644 --- a/database/migrations/2018_03_01_232041_march_update_one.php +++ b/database/migrations/2018_03_01_232041_march_update_one.php @@ -4,6 +4,7 @@ use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; +use App\Modules\Newsletters\Model\Newsletter; class MarchUpdateOne extends Migration { diff --git a/database/migrations/2018_06_03_001436_june_update_one.php b/database/migrations/2018_06_03_001436_june_update_one.php index 38ae73cb..e88b6a8d 100644 --- a/database/migrations/2018_06_03_001436_june_update_one.php +++ b/database/migrations/2018_06_03_001436_june_update_one.php @@ -4,6 +4,8 @@ use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; +use App\Modules\Pages\Model\PageTypes; +use App\Modules\Pages\Model\PageOptions; class JuneUpdateOne extends Migration { diff --git a/database/migrations/2018_07_04_210841_create_modules_table.php b/database/migrations/2018_07_04_210841_create_modules_table.php index 28dcdafb..71fa9c53 100644 --- a/database/migrations/2018_07_04_210841_create_modules_table.php +++ b/database/migrations/2018_07_04_210841_create_modules_table.php @@ -1,9 +1,9 @@ string('module')->after('option')->nullable(); + }); + + Page::firstOrCreate([ 'seo_title' => 'Articles', 'identifier' => 'articles', 'slug' => 'articles', @@ -24,9 +28,27 @@ public function up() 'option' => PageOptions::OPTION_DISABLED, ]); - Schema::table('pages', function (Blueprint $table) { - $table->string('module')->after('option')->nullable(); - }); + foreach (Page::all() as $page) { + if ($page->type & PageTypes::TYPE_PLUGIN) { + $page->type = $page->type &~ PageTypes::TYPE_PLUGIN; + $page->type = $page->type | PageTypes::TYPE_MODULE; + } + + if ($page->identifier == 'articles') { + $page->module = 'articles'; + } + + if ($page->identifier == 'newsletter.success') { + $page->module = 'newsletters'; + $page->option = $page->option | PageOptions::OPTION_DISABLED; + } + + if ($page->identifier == 'error.404') { + $page->module = 'errors'; + } + + $page->save(); + } } /** diff --git a/resources/admin/views/structure/sidebar.blade.php b/resources/admin/views/structure/sidebar.blade.php index 8eaffa76..15402467 100644 --- a/resources/admin/views/structure/sidebar.blade.php +++ b/resources/admin/views/structure/sidebar.blade.php @@ -24,7 +24,7 @@ @foreach(config('modules') as $module) - @if(account()->hasRole($module['role'])) + @if($module['enabled'] && account()->hasRole($module['role']))
  • diff --git a/tests/Article/ArticleInstallationTest.php b/tests/Article/ArticleInstallationTest.php deleted file mode 100644 index 56224aee..00000000 --- a/tests/Article/ArticleInstallationTest.php +++ /dev/null @@ -1,87 +0,0 @@ -first(); - - $this->assertEquals('articles', $plugin['name']); - } - - /** - * @test - */ - public function the_article_plugin_can_be_toggled() - { - $plugin = Plugin::whereName('articles')->first(); - - $plugin->toggle(); - - $this->assertTrue($plugin->enabled); - } - - /** - * @test - */ - public function the_article_plugin_has_a_controller_class() - { - $plugin = Plugin::whereName('articles')->first(); - - $this->assertInstanceOf(ArticlesController::class, $plugin->controller); - } - - /** - * @test - */ - public function the_article_plugin_exists_on_the_dashboard() - { - $this->signIn(['role_id' => Developer::$key]); - - $this->get('admin/products/index') - ->assertSee('Articles'); - } - - /** - * @test - */ - public function the_article_plugin_can_be_installed() - { - $this->signIn(['role_id' => Developer::$key]); - - $this->get('/admin/products/install/articles') - ->assertRedirect('/admin/products/index'); - - $this->assertDatabaseHas('plugins', ['name' => 'articles', 'enabled' => true]); - $this->assertDatabaseHas('pages', ['identifier' => 'articles']); - } - - /** - * @test - */ - public function the_article_plugin_can_be_uninstalled() - { - $this->signIn(['role_id' => Developer::$key]); - - $this->get('/admin/products/install/articles'); - - $this->get('/admin/products/uninstall/articles') - ->assertRedirect('/admin/products/index'); - - $this->assertDatabaseHas('plugins', ['name' => 'articles', 'enabled' => false]); - $this->assertDatabaseMissing('pages', ['identifier' => 'articles']); - } -} diff --git a/tests/Article/ArticleViewingTest.php b/tests/Article/ArticleViewingTest.php index e1210c9a..f64ca6cb 100644 --- a/tests/Article/ArticleViewingTest.php +++ b/tests/Article/ArticleViewingTest.php @@ -14,6 +14,7 @@ class ArticleViewingTest extends TestCase * Provide fake content */ use WithFaker; + /* * Reset database after each test. */ @@ -33,9 +34,9 @@ public function setUp() { parent::setUp(); - Route::middleware('web', 'auth', 'gateway')->group(base_path(sprintf('app/Modules/%s/Routes/backend.php', 'Articles'))); + Route::middleware('web', 'auth', 'gateway')->group(base_path('app/Modules/Articles/Routes/backend.php')); - Route::middleware('web')->group(base_path(sprintf('app/Modules/%s/Routes/frontend.php', 'Articles'))); + Route::middleware('web')->namespace('App\Modules\Articles')->group(base_path('app/Modules/Articles/Routes/frontend.php')); } /** diff --git a/tests/Module/ModuleManagerTest.php b/tests/Module/ModuleManagerTest.php index 1939f12b..8af251c1 100644 --- a/tests/Module/ModuleManagerTest.php +++ b/tests/Module/ModuleManagerTest.php @@ -8,7 +8,7 @@ use App\Modules\ModuleManager; use App\Modules\ModuleRepository; use Illuminate\Support\Facades\Config; -use App\Plugins\Pages\Model\PageOptions; +use App\Modules\Pages\Model\PageOptions; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithoutMiddleware; use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration; diff --git a/tests/Products/ProductInstallationTest.php b/tests/Products/ProductInstallationTest.php index 8abd8e7a..77d92fa2 100644 --- a/tests/Products/ProductInstallationTest.php +++ b/tests/Products/ProductInstallationTest.php @@ -19,11 +19,11 @@ class ProductInstallationTest extends TestCase /** * @test */ - public function modules_can_be_enabled() + public function modules_can_be_toggled() { - Mockery::mock(ModuleManager::class)->shouldReceive('enable')->andReturn(true); + $mocked = Mockery::mock(ModuleManager::class)->shouldReceive('toggle')->andReturn(true)->getMock(); - Config::set('modules.test', ['enabled' => false]); + $this->app->instance(ModuleManager::class, $mocked); $response = $this->get('/admin/products/test/toggle'); From 0c21f8c9c90ce1bcc75af24d92b8977a8430c28e Mon Sep 17 00:00:00 2001 From: Mark Hester Date: Fri, 6 Jul 2018 16:42:47 +0000 Subject: [PATCH 4/8] Apply fixes from StyleCI [ci skip] [skip ci] --- app/Modules/Sitemap/Controller.php | 4 ---- database/migrations/2018_03_01_232041_march_update_one.php | 2 +- database/migrations/2018_06_03_001436_june_update_one.php | 4 ++-- .../migrations/2018_07_04_210841_create_modules_table.php | 2 +- tests/Article/ArticleViewingTest.php | 1 - tests/Products/ProductInstallationTest.php | 1 - 6 files changed, 4 insertions(+), 10 deletions(-) diff --git a/app/Modules/Sitemap/Controller.php b/app/Modules/Sitemap/Controller.php index 9ff0f751..3d42c13f 100644 --- a/app/Modules/Sitemap/Controller.php +++ b/app/Modules/Sitemap/Controller.php @@ -2,13 +2,9 @@ namespace App\Modules\Sitemap; -use App\Model\Plugin; use App\Modules\ModuleEngine; use App\Classes\SitemapGenerator; use App\Classes\Interfaces\Sitemap; -use Illuminate\Contracts\View\View; -use Illuminate\Database\Eloquent\Collection; -use App\Http\Controllers\DashboardController; /** * Class Controller. diff --git a/database/migrations/2018_03_01_232041_march_update_one.php b/database/migrations/2018_03_01_232041_march_update_one.php index 13fe3810..c151aae6 100644 --- a/database/migrations/2018_03_01_232041_march_update_one.php +++ b/database/migrations/2018_03_01_232041_march_update_one.php @@ -3,8 +3,8 @@ use App\Model\Page; use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; -use Illuminate\Database\Migrations\Migration; use App\Modules\Newsletters\Model\Newsletter; +use Illuminate\Database\Migrations\Migration; class MarchUpdateOne extends Migration { diff --git a/database/migrations/2018_06_03_001436_june_update_one.php b/database/migrations/2018_06_03_001436_june_update_one.php index e88b6a8d..d9877f42 100644 --- a/database/migrations/2018_06_03_001436_june_update_one.php +++ b/database/migrations/2018_06_03_001436_june_update_one.php @@ -1,11 +1,11 @@ type & PageTypes::TYPE_PLUGIN) { - $page->type = $page->type &~ PageTypes::TYPE_PLUGIN; + $page->type = $page->type & ~PageTypes::TYPE_PLUGIN; $page->type = $page->type | PageTypes::TYPE_MODULE; } diff --git a/tests/Article/ArticleViewingTest.php b/tests/Article/ArticleViewingTest.php index f64ca6cb..13a08cfe 100644 --- a/tests/Article/ArticleViewingTest.php +++ b/tests/Article/ArticleViewingTest.php @@ -14,7 +14,6 @@ class ArticleViewingTest extends TestCase * Provide fake content */ use WithFaker; - /* * Reset database after each test. */ diff --git a/tests/Products/ProductInstallationTest.php b/tests/Products/ProductInstallationTest.php index 77d92fa2..8548ac0d 100644 --- a/tests/Products/ProductInstallationTest.php +++ b/tests/Products/ProductInstallationTest.php @@ -5,7 +5,6 @@ use Mockery; use Tests\TestCase; use App\Modules\ModuleManager; -use Illuminate\Support\Facades\Config; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithoutMiddleware; From 829f72070fe210a04e34dd5c2350cf387ea88b2f Mon Sep 17 00:00:00 2001 From: Mark Hester Date: Fri, 6 Jul 2018 19:32:01 +0100 Subject: [PATCH 5/8] Router page types now save configuration to router config. --- app/Modules/ModuleManager.php | 20 ++++- app/Modules/ModuleRouteObservers.php | 78 +++++++++++++++++++ app/Modules/ModuleServiceProvider.php | 3 +- app/Modules/Pages/Model/PageTypes.php | 12 +++ app/Modules/Sitemap/Routes/backend.php | 2 +- config/modules.php | 25 +++--- ...2018_07_04_210841_create_modules_table.php | 1 + tests/Module/ModuleManagerTest.php | 1 + 8 files changed, 125 insertions(+), 17 deletions(-) create mode 100644 app/Modules/ModuleRouteObservers.php diff --git a/app/Modules/ModuleManager.php b/app/Modules/ModuleManager.php index 3edff650..196c5aec 100644 --- a/app/Modules/ModuleManager.php +++ b/app/Modules/ModuleManager.php @@ -12,7 +12,7 @@ class ModuleManager /** * @var ModuleRepository */ - private $repository; + public $repository; /** * ModuleLoader constructor. @@ -29,7 +29,7 @@ public function __construct(ModuleRepository $repository) * * @param string $module * - * @return $this + * @return void * * @throws ModuleNotFoundException */ @@ -42,7 +42,7 @@ public function enable(string $module) /** * @param string $module - * @return $this + * @return void * @throws ModuleNotFoundException */ public function disable(string $module) @@ -79,6 +79,20 @@ public function status(string $module) return $this->repository->get("{$module}.enabled"); } + /** + * Update the route of a module configuration. + * + * @param string $module + * @param string $newRoute + * + * @return bool + * @throws ModuleNotFoundException + */ + public function route(string $module, string $newRoute) + { + return $this->repository->set("{$module}.route", $newRoute)->save(); + } + /** * Sync the module pages to load with the condig status. * diff --git a/app/Modules/ModuleRouteObservers.php b/app/Modules/ModuleRouteObservers.php new file mode 100644 index 00000000..13fd963b --- /dev/null +++ b/app/Modules/ModuleRouteObservers.php @@ -0,0 +1,78 @@ +module = $module; + } + + /** + * Handle pages that have been updated. + * + * @param Page $page + * + * @return void + * @throws ModuleNotFoundException + */ + public function updated(Page $page) + { + $this->updateModuleRoute($page); + } + + /** + * Handle pages that have been created. + * + * @param Page $page + * + * @throws ModuleNotFoundException + */ + public function created(Page $page) + { + $this->updateModuleRoute($page); + } + + /** + * Check if the page is type router. + * + * @param Page $page + * + * @return int + */ + private function isTypeRouter(Page $page): int + { + return $page->type & PageTypes::TYPE_ROUTER; + } + + /** + * Update the modules route on the configuration file. + * + * @param Page $page + * @throws ModuleNotFoundException + */ + public function updateModuleRoute(Page $page) { + if ($this->isTypeRouter($page)) { + $this->module->route($page->module, $page->slug); + } + } +} \ No newline at end of file diff --git a/app/Modules/ModuleServiceProvider.php b/app/Modules/ModuleServiceProvider.php index 6656d7ba..dfef2407 100644 --- a/app/Modules/ModuleServiceProvider.php +++ b/app/Modules/ModuleServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Modules; +use App\Model\Page; use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Config; use Illuminate\Support\ServiceProvider; @@ -18,7 +19,7 @@ class ModuleServiceProvider extends ServiceProvider */ public function boot() { - // + Page::observe(ModuleRouteObservers::class); } /** diff --git a/app/Modules/Pages/Model/PageTypes.php b/app/Modules/Pages/Model/PageTypes.php index e6d8b999..c614d2cb 100644 --- a/app/Modules/Pages/Model/PageTypes.php +++ b/app/Modules/Pages/Model/PageTypes.php @@ -60,4 +60,16 @@ class PageTypes | */ const TYPE_ERROR = 16; + + /* + |-------------------------------------------------------------------------- + | Type Router + |-------------------------------------------------------------------------- + | + | This page is responsible for routing of a module, the value + | of the page title and prefix, will be saved into configuration + | when it is changed. + | + */ + const TYPE_ROUTER = 32; } diff --git a/app/Modules/Sitemap/Routes/backend.php b/app/Modules/Sitemap/Routes/backend.php index ddab0be9..acb65b02 100644 --- a/app/Modules/Sitemap/Routes/backend.php +++ b/app/Modules/Sitemap/Routes/backend.php @@ -15,7 +15,7 @@ // Get Requests. // ================================================================================== - Route::get('/admin/sitemap')->uses('Controller@iframe')->name('sitemap.iframe'); + //Route::get('/admin/sitemap')->uses('Controller@sitemap')->name('sitemap.xml'); // Post Requests. // ================================================================================== diff --git a/config/modules.php b/config/modules.php index 541dc97d..3b2ec063 100644 --- a/config/modules.php +++ b/config/modules.php @@ -6,7 +6,7 @@ 'title' => 'Products', 'enabled' => true, 'icon' => 'fas fa-box', - 'version' => '1.3', + 'version' => 1.0, 'url' => 'admin/products', 'role' => 'publisher', ], @@ -15,7 +15,7 @@ 'title' => 'Navigation', 'enabled' => true, 'icon' => 'fas fa-compass', - 'version' => '2.6', + 'version' => 1.0, 'url' => 'admin/navigation', 'role' => 'publisher', ], @@ -24,7 +24,7 @@ 'title' => 'Pages', 'enabled' => true, 'icon' => 'fab fa-readme', - 'version' => '2.1', + 'version' => 1.0, 'url' => 'admin/pages', 'role' => 'publisher', ], @@ -33,25 +33,26 @@ 'title' => 'Redirects', 'enabled' => false, 'icon' => 'fas fa-exchange-alt', - 'version' => '1.9', + 'version' => 1.0, 'url' => 'admin/redirects', 'role' => 'publisher', ], 'articles' => [ 'title' => 'Articles', - 'enabled' => false, + 'enabled' => true, 'icon' => 'fas fa-glasses', - 'version' => '1.6', + 'version' => 1.0, 'url' => 'admin/articles', 'role' => 'publisher', + 'route' => 'articles', ], 'newsletters' => [ 'title' => 'Newsletters', 'enabled' => false, 'icon' => 'fa-book', - 'version' => '1.0', + 'version' => 1.0, 'url' => 'admin/newsletter', 'role' => 'publisher', ], @@ -60,7 +61,7 @@ 'title' => 'Settings', 'enabled' => true, 'icon' => 'fas fa-wrench', - 'version' => '1.0', + 'version' => 1.0, 'url' => 'admin/settings', 'role' => 'administrator', ], @@ -69,7 +70,7 @@ 'title' => 'Accounts', 'enabled' => true, 'icon' => 'fa fa-users', - 'version' => '1.0', + 'version' => 1.0, 'url' => 'admin/accounts', 'role' => 'administrator', ], @@ -78,7 +79,7 @@ 'title' => 'Filemanager', 'enabled' => true, 'icon' => 'fas fa-toolbox', - 'version' => '1.0', + 'version' => 1.0, 'url' => 'admin/filemanager', 'role' => 'publisher', ], @@ -87,7 +88,7 @@ 'title' => 'Updates', 'enabled' => true, 'icon' => 'fas fa-code', - 'version' => '1.0', + 'version' => 1.0, 'url' => 'admin/updates', 'role' => 'developer', ], @@ -96,7 +97,7 @@ 'title' => 'Sitemap', 'enabled' => true, 'icon' => 'fas fa-globe', - 'version' => '1.0', + 'version' => 1.0, 'url' => 'admin/sitemap', 'role' => 'developer', ], diff --git a/database/migrations/2018_07_04_210841_create_modules_table.php b/database/migrations/2018_07_04_210841_create_modules_table.php index 71fa9c53..8c1cfb7c 100644 --- a/database/migrations/2018_07_04_210841_create_modules_table.php +++ b/database/migrations/2018_07_04_210841_create_modules_table.php @@ -36,6 +36,7 @@ public function up() if ($page->identifier == 'articles') { $page->module = 'articles'; + $page->type = PageTypes::TYPE_MODULE|PageTypes::TYPE_ROUTER; } if ($page->identifier == 'newsletter.success') { diff --git a/tests/Module/ModuleManagerTest.php b/tests/Module/ModuleManagerTest.php index 8af251c1..c32001e8 100644 --- a/tests/Module/ModuleManagerTest.php +++ b/tests/Module/ModuleManagerTest.php @@ -2,6 +2,7 @@ namespace Tests\Module; +use App\Modules\Pages\Model\PageTypes; use Exception; use App\Model\Page; use Tests\TestCase; From deb948c40c928b7278ec2aa749b4093714a5af70 Mon Sep 17 00:00:00 2001 From: Mark Hester Date: Fri, 6 Jul 2018 18:32:35 +0000 Subject: [PATCH 6/8] Apply fixes from StyleCI [ci skip] [skip ci] --- app/Modules/ModuleRouteObservers.php | 9 ++++----- .../2018_07_04_210841_create_modules_table.php | 2 +- tests/Module/ModuleManagerTest.php | 1 - 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/Modules/ModuleRouteObservers.php b/app/Modules/ModuleRouteObservers.php index 13fd963b..4542a926 100644 --- a/app/Modules/ModuleRouteObservers.php +++ b/app/Modules/ModuleRouteObservers.php @@ -4,11 +4,9 @@ use App\Model\Page; use App\Modules\Pages\Model\PageTypes; -use Illuminate\Database\Eloquent\Model; /** - * Class ModuleObservers - * @package App\Modules + * Class ModuleObservers. */ class ModuleRouteObservers { @@ -70,9 +68,10 @@ private function isTypeRouter(Page $page): int * @param Page $page * @throws ModuleNotFoundException */ - public function updateModuleRoute(Page $page) { + public function updateModuleRoute(Page $page) + { if ($this->isTypeRouter($page)) { $this->module->route($page->module, $page->slug); } } -} \ No newline at end of file +} diff --git a/database/migrations/2018_07_04_210841_create_modules_table.php b/database/migrations/2018_07_04_210841_create_modules_table.php index 2584e19a..404bd23b 100644 --- a/database/migrations/2018_07_04_210841_create_modules_table.php +++ b/database/migrations/2018_07_04_210841_create_modules_table.php @@ -36,7 +36,7 @@ public function up() if ($page->identifier == 'articles') { $page->module = 'articles'; - $page->type = PageTypes::TYPE_MODULE|PageTypes::TYPE_ROUTER; + $page->type = PageTypes::TYPE_MODULE | PageTypes::TYPE_ROUTER; } if ($page->identifier == 'newsletter.success') { diff --git a/tests/Module/ModuleManagerTest.php b/tests/Module/ModuleManagerTest.php index c32001e8..8af251c1 100644 --- a/tests/Module/ModuleManagerTest.php +++ b/tests/Module/ModuleManagerTest.php @@ -2,7 +2,6 @@ namespace Tests\Module; -use App\Modules\Pages\Model\PageTypes; use Exception; use App\Model\Page; use Tests\TestCase; From d2677f5f51fe6734123292650b658bbcc15c5f87 Mon Sep 17 00:00:00 2001 From: Mark Hester Date: Sun, 8 Jul 2018 13:38:25 +0100 Subject: [PATCH 7/8] Modules lookup active and inactive modules + route --- app/Helpers/Global.php | 8 ++ app/Model/Article.php | 2 +- app/Modules/Articles/Routes/frontend.php | 13 +- app/Modules/ModuleManager.php | 27 +++- app/Modules/ModuleRepository.php | 8 +- tests/Module/ModuleManagerTest.php | 162 +++++++++++++++-------- 6 files changed, 156 insertions(+), 64 deletions(-) diff --git a/app/Helpers/Global.php b/app/Helpers/Global.php index ee26b3e7..900a1c0f 100644 --- a/app/Helpers/Global.php +++ b/app/Helpers/Global.php @@ -149,3 +149,11 @@ function formSelect($value, $matches) { return $value == $matches ? 'selected' : ''; } + + /** + * @return \App\Modules\ModuleManager + */ + function modules() + { + return app(\App\Modules\ModuleManager::class); + } diff --git a/app/Model/Article.php b/app/Model/Article.php index 4c103096..ae94eacf 100644 --- a/app/Model/Article.php +++ b/app/Model/Article.php @@ -218,7 +218,7 @@ public function getPageAttribute() */ public function path() { - return url($this->page->path().'/'.$this->category->slug.'/'.$this->slug); + return url(config('modules.articles.route') .'/'.$this->category->slug.'/'.$this->slug); } /** diff --git a/app/Modules/Articles/Routes/frontend.php b/app/Modules/Articles/Routes/frontend.php index 0a932698..4b68783e 100644 --- a/app/Modules/Articles/Routes/frontend.php +++ b/app/Modules/Articles/Routes/frontend.php @@ -14,16 +14,13 @@ | */ - /** @var Page $page */ - $page = Page::whereIdentifier('articles'); - /* |-------------------------------------------------------------------------- | (Page Path = Articles Page '/articles') |-------------------------------------------------------------------------- */ - Route::get($page->path())->uses('FrontendController@allArticles')->name('articles.all'); - Route::get($page->path().'/search')->uses('FrontendController@searchArticles')->name('search.articles'); - Route::get($page->path().'/{category}')->uses('FrontendController@categoryArticles')->name('category.articles'); - Route::get($page->path().'/creator/{account}')->uses('FrontendController@allCreatorsArticles')->name('creator.articles'); - Route::get($page->path().'/{category}/{article}')->uses('FrontendController@viewArticle')->name('article.view'); + Route::get(config('modules.articles.route'))->uses('FrontendController@allArticles')->name('articles.all'); + Route::get(config('modules.articles.route') .'/search')->uses('FrontendController@searchArticles')->name('search.articles'); + Route::get(config('modules.articles.route') .'/{category}')->uses('FrontendController@categoryArticles')->name('category.articles'); + Route::get(config('modules.articles.route') .'/creator/{account}')->uses('FrontendController@allCreatorsArticles')->name('creator.articles'); + Route::get(config('modules.articles.route') .'/{category}/{article}')->uses('FrontendController@viewArticle')->name('article.view'); diff --git a/app/Modules/ModuleManager.php b/app/Modules/ModuleManager.php index 196c5aec..dad15e35 100644 --- a/app/Modules/ModuleManager.php +++ b/app/Modules/ModuleManager.php @@ -21,8 +21,7 @@ class ModuleManager */ public function __construct(ModuleRepository $repository) { - $this->repository = $repository; - } + $this->repository = $repository;} /** * Enable a module using the modules.php configuration. @@ -93,6 +92,30 @@ public function route(string $module, string $newRoute) return $this->repository->set("{$module}.route", $newRoute)->save(); } + /** + * Return the array collection of all enabled modules. + * + * @return array + */ + public function getActive() + { + return array_where($this->repository->all(), function($value) { + return $value['enabled'] == true; + }); + } + + /** + * Return the array collection of all disabled modules. + * + * @return array + */ + public function getInactive() + { + return array_where($this->repository->all(), function($value) { + return $value['enabled'] == false; + }); + } + /** * Sync the module pages to load with the condig status. * diff --git a/app/Modules/ModuleRepository.php b/app/Modules/ModuleRepository.php index bda13160..7a3e75de 100644 --- a/app/Modules/ModuleRepository.php +++ b/app/Modules/ModuleRepository.php @@ -40,10 +40,16 @@ public function set($key, $value = null) * @param null $to * @param bool $validate * @return bool + * + * @throws ModuleNotFoundException */ public function save($from = null, $to = null, $validate = true) { - parent::save($from, $to, $validate); + try { + parent::save($from, $to, $validate); + } catch (\Exception $e) { + throw new ModuleNotFoundException; + } return true; } diff --git a/tests/Module/ModuleManagerTest.php b/tests/Module/ModuleManagerTest.php index c32001e8..a8a83922 100644 --- a/tests/Module/ModuleManagerTest.php +++ b/tests/Module/ModuleManagerTest.php @@ -2,180 +2,238 @@ namespace Tests\Module; -use App\Modules\Pages\Model\PageTypes; -use Exception; +use App\Modules\ModuleNotFoundException; use App\Model\Page; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; use App\Modules\ModuleManager; use App\Modules\ModuleRepository; use Illuminate\Support\Facades\Config; use App\Modules\Pages\Model\PageOptions; -use Illuminate\Foundation\Testing\RefreshDatabase; -use Illuminate\Foundation\Testing\WithoutMiddleware; -use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration; /** * Class ModuleManagerTest. */ class ModuleManagerTest extends TestCase { - /* - * Test traits. - */ - use WithoutMiddleware, RefreshDatabase; - /* - * Mockery + + /** + * Database Traits */ - use MockeryPHPUnitIntegration; + use RefreshDatabase; /** * @test */ - public function a_module_will_error_if_plugin_is_not_found() + public function it_will_throw_exception_if_config_does_not_exist() { - $this->expectException(Exception::class); + // expects exception + $this->expectException(ModuleNotFoundException::class); + // when app(ModuleManager::class)->enable('unknown'); } /** * @test + * @throws ModuleNotFoundException */ - public function a_module_can_be_disabled_using_configuration_file() + public function it_can_disable_a_module() { Config::set('modules.config', ['enabled' => true]); - $this->willSaveToConfigurationFile(); + $module = $this->mockModuleManager(); - app(ModuleManager::class)->disable('config'); + $module->disable('config'); - $this->assertFalse(app(ModuleManager::class)->status('config')); + $this->assertFalse($module->status('config')); } /** * @test + * @throws ModuleNotFoundException */ - public function a_module_can_be_enabled_using_configuration_file() + public function it_can_enable_a_module() { Config::set('modules.config', ['enabled' => false]); - $this->willSaveToConfigurationFile(); + $module = $this->mockModuleManager(); - app(ModuleManager::class)->enable('config'); + $module->enable('config'); - $this->assertTrue(app(ModuleManager::class)->status('config')); + $this->assertTrue($module->status('config')); } /** * @test + * @throws ModuleNotFoundException */ - public function a_module_can_be_toggled_using_configuration_file() + public function it_can_toggle_a_module() { Config::set('modules.config', ['enabled' => false]); - $this->willSaveToConfigurationFile(); + $module = $this->mockModuleManager(); - app(ModuleManager::class)->toggle('config'); + $module->toggle('config'); - $this->assertTrue(app(ModuleManager::class)->status('config')); + $this->assertTrue($module->status('config')); - app(ModuleManager::class)->toggle('config'); + $module->toggle('config'); - $this->assertFalse(app(ModuleManager::class)->status('config')); + $this->assertFalse($module->status('config')); } /** * @test + * @throws ModuleNotFoundException */ - public function a_module_will_enable_pages_attached_to_module() + public function it_can_enable_pages_attached_to_module() { /** @var Page $page */ $page = factory('App\Model\Page')->create(['module' => 'pictures', 'option' => PageOptions::OPTION_DISABLED]); Config::set('modules.pictures', ['title' => 'Pictures', 'enabled' => false]); - $this->willSaveToConfigurationFile(); + $module = $this->mockModuleManager(); - app(ModuleManager::class)->enable('pictures'); + $module->enable('pictures'); $this->assertDatabaseHas('pages', ['id' => $page->id, 'option' => PageOptions::OPTION_DEFAULT]); - $this->assertTrue(app(ModuleManager::class)->status('pictures')); + $this->assertTrue($module->status('pictures')); } /** * @test + * + * @throws \App\Modules\ModuleNotFoundException */ - public function a_module_will_disable_pages_attached_to_module() + public function it_can_disable_pages_attached_to_module() { /** @var Page $page */ $page = factory('App\Model\Page')->create(['module' => 'pictures', 'option' => PageOptions::OPTION_PUBLIC]); Config::set('modules.pictures', ['title' => 'Pictures', 'enabled' => true]); - $this->willSaveToConfigurationFile(); + $module = $this->mockModuleManager(); - app(ModuleManager::class)->disable('pictures'); + $module->disable('pictures'); $this->assertDatabaseHas('pages', ['id' => $page->id, 'option' => PageOptions::OPTION_PUBLIC | PageOptions::OPTION_DISABLED]); - $this->assertFalse(app(ModuleManager::class)->status('pictures')); + $this->assertFalse($module->status('pictures')); } /** * @test + * @throws ModuleNotFoundException */ - public function a_module_will_enable_multiple_pages_attached_to_module() + public function it_can_enable_multiple_pages_attached_to_module() { /** @var Page $page */ $pages = factory('App\Model\Page', 4)->create(['module' => 'unit-testing', 'option' => PageOptions::OPTION_DISABLED]); Config::set('modules.unit-testing', ['title' => 'Unit Testing', 'enabled' => false]); - $this->willSaveToConfigurationFile(); + $module = $this->mockModuleManager(); - app(ModuleManager::class)->enable('unit-testing'); + $module->enable('unit-testing'); foreach ($pages as $page) { $this->assertDatabaseHas('pages', ['id' => $page->id, 'option' => PageOptions::OPTION_DEFAULT]); } - $this->assertTrue(app(ModuleManager::class)->status('unit-testing')); + $this->assertTrue($module->status('unit-testing')); } /** * @test + * @throws ModuleNotFoundException */ - public function a_module_will_disable_multiple_pages_attached_to_module() + public function it_can_disable_multiple_pages_attached_to_module() { /** @var Page $page */ $pages = factory('App\Model\Page', 4)->create(['module' => 'unit-testing', 'option' => PageOptions::OPTION_DEFAULT]); Config::set('modules.unit-testing', ['title' => 'Unit Testing', 'enabled' => true]); - $this->willSaveToConfigurationFile(); + $module = $this->mockModuleManager(); - app(ModuleManager::class)->disable('unit-testing'); + $module->disable('unit-testing'); foreach ($pages as $page) { $this->assertDatabaseHas('pages', ['id' => $page->id, 'option' => PageOptions::OPTION_DISABLED]); } - $this->assertFalse(app(ModuleManager::class)->status('unit-testing')); + $this->assertFalse($module->status('unit-testing')); + } + + /** + * @test + */ + public function it_can_return_all_modules_currently_enabled() + { + $this->mockConfiguration([ + 'foo' => ['title' => 'foo', 'enabled' => true], + 'bar' => ['title' => 'bar', 'enabled' => true], + 'zor' => ['title' => 'zor', 'enabled' => false], + ]); + + $modules = $this->mockModuleManager(); + + $this->assertCount(2, $modules->getActive()); + } + + /** + * @test + */ + public function it_can_return_all_modules_currently_disabled() + { + $this->mockConfiguration([ + 'san' => ['title' => 'foo', 'enabled' => false], + 'zap' => ['title' => 'bar', 'enabled' => true], + 'lae' => ['title' => 'zor', 'enabled' => false], + ]); + + $modules = $this->mockModuleManager(); + + $this->assertCount(2, $modules->getInactive()); + } + + /** + * Mock the configuration file data. + * + * @param $array + */ + private function mockConfiguration($array) + { + return config()->set('modules', $array); + } + + /** + * Mock the module repository on its own. + * + * @return \PHPUnit\Framework\MockObject\MockBuilder + */ + private function mockModuleRepository() + { + return $this->getMockBuilder(ModuleRepository::class)->enableOriginalConstructor(); } /** - * Mock the instance of saving to a configuration file. + * Mock the module manager. + * + * @return ModuleManager */ - private function willSaveToConfigurationFile(): void + private function mockModuleManager() { - $mock = $this->getMockBuilder(ModuleRepository::class) - ->enableOriginalConstructor() - ->setMethodsExcept(['set', 'get']) - ->getMock(); + // mock everything + $mockedClass = $this->mockModuleRepository()->setMethodsExcept(['set', 'get', 'all'])->getMock(); - $mock->method('save')->willReturn(true); + // save method will return + $mockedClass->method('save')->willReturn(true); - $this->app->instance(ModuleRepository::class, $mock); + /** @var ModuleRepository $mockedClass */ + return new ModuleManager($mockedClass); } } From eadd391534ea163ed3c9a1afbe3fe1b00c9066bb Mon Sep 17 00:00:00 2001 From: Mark Hester Date: Sun, 8 Jul 2018 12:39:41 +0000 Subject: [PATCH 8/8] Apply fixes from StyleCI [ci skip] [skip ci] --- app/Model/Article.php | 2 +- app/Modules/Articles/Routes/frontend.php | 8 ++++---- app/Modules/ModuleManager.php | 7 ++++--- tests/Module/ModuleManagerTest.php | 9 ++++----- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/Model/Article.php b/app/Model/Article.php index ae94eacf..7a09bc1a 100644 --- a/app/Model/Article.php +++ b/app/Model/Article.php @@ -218,7 +218,7 @@ public function getPageAttribute() */ public function path() { - return url(config('modules.articles.route') .'/'.$this->category->slug.'/'.$this->slug); + return url(config('modules.articles.route').'/'.$this->category->slug.'/'.$this->slug); } /** diff --git a/app/Modules/Articles/Routes/frontend.php b/app/Modules/Articles/Routes/frontend.php index 4b68783e..738bb112 100644 --- a/app/Modules/Articles/Routes/frontend.php +++ b/app/Modules/Articles/Routes/frontend.php @@ -20,7 +20,7 @@ |-------------------------------------------------------------------------- */ Route::get(config('modules.articles.route'))->uses('FrontendController@allArticles')->name('articles.all'); - Route::get(config('modules.articles.route') .'/search')->uses('FrontendController@searchArticles')->name('search.articles'); - Route::get(config('modules.articles.route') .'/{category}')->uses('FrontendController@categoryArticles')->name('category.articles'); - Route::get(config('modules.articles.route') .'/creator/{account}')->uses('FrontendController@allCreatorsArticles')->name('creator.articles'); - Route::get(config('modules.articles.route') .'/{category}/{article}')->uses('FrontendController@viewArticle')->name('article.view'); + Route::get(config('modules.articles.route').'/search')->uses('FrontendController@searchArticles')->name('search.articles'); + Route::get(config('modules.articles.route').'/{category}')->uses('FrontendController@categoryArticles')->name('category.articles'); + Route::get(config('modules.articles.route').'/creator/{account}')->uses('FrontendController@allCreatorsArticles')->name('creator.articles'); + Route::get(config('modules.articles.route').'/{category}/{article}')->uses('FrontendController@viewArticle')->name('article.view'); diff --git a/app/Modules/ModuleManager.php b/app/Modules/ModuleManager.php index dad15e35..dfd66cbb 100644 --- a/app/Modules/ModuleManager.php +++ b/app/Modules/ModuleManager.php @@ -21,7 +21,8 @@ class ModuleManager */ public function __construct(ModuleRepository $repository) { - $this->repository = $repository;} + $this->repository = $repository; + } /** * Enable a module using the modules.php configuration. @@ -99,7 +100,7 @@ public function route(string $module, string $newRoute) */ public function getActive() { - return array_where($this->repository->all(), function($value) { + return array_where($this->repository->all(), function ($value) { return $value['enabled'] == true; }); } @@ -111,7 +112,7 @@ public function getActive() */ public function getInactive() { - return array_where($this->repository->all(), function($value) { + return array_where($this->repository->all(), function ($value) { return $value['enabled'] == false; }); } diff --git a/tests/Module/ModuleManagerTest.php b/tests/Module/ModuleManagerTest.php index c6a41a6b..6a9ba981 100644 --- a/tests/Module/ModuleManagerTest.php +++ b/tests/Module/ModuleManagerTest.php @@ -4,20 +4,19 @@ use Exception; use App\Model\Page; -use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; use App\Modules\ModuleManager; use App\Modules\ModuleRepository; use Illuminate\Support\Facades\Config; use App\Modules\Pages\Model\PageOptions; +use Illuminate\Foundation\Testing\RefreshDatabase; /** * Class ModuleManagerTest. */ class ModuleManagerTest extends TestCase { - - /** + /* * Database Traits */ use RefreshDatabase; @@ -72,7 +71,7 @@ public function it_can_toggle_a_module() { Config::set('modules.config', ['enabled' => false]); - $module = $this->mockModuleManager(); + $module = $this->mockModuleManager(); $module->toggle('config'); @@ -233,7 +232,7 @@ private function mockModuleManager() // save method will return $mockedClass->method('save')->willReturn(true); - /** @var ModuleRepository $mockedClass */ + /* @var ModuleRepository $mockedClass */ return new ModuleManager($mockedClass); } }