From d5d4216a807e8aa20332c8c9cd8f6725f3a35373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kv=C3=A1=C4=8Dek?= Date: Thu, 22 Sep 2016 21:47:11 +0200 Subject: [PATCH] FEATURE: add soft deletes to content pages --- app/Enumerations/ActiveContentStatuses.php | 18 ------- app/Enumerations/ContentStatuses.php | 1 - app/Events/DeleteContent.php | 4 +- .../Controllers/Admin/CreateNewContent.php | 4 +- app/Http/Controllers/Admin/EditContent.php | 15 +----- app/Listeners/LogDeleteContent.php | 1 - app/Models/Content.php | 14 ++--- app/Widgets/Menu/Menu.php | 3 +- ...6_09_22_191204_AddSoftDeletesToContent.php | 53 +++++++++++++++++++ 9 files changed, 67 insertions(+), 46 deletions(-) delete mode 100644 app/Enumerations/ActiveContentStatuses.php create mode 100644 database/migrations/2016_09_22_191204_AddSoftDeletesToContent.php diff --git a/app/Enumerations/ActiveContentStatuses.php b/app/Enumerations/ActiveContentStatuses.php deleted file mode 100644 index ed48c909..00000000 --- a/app/Enumerations/ActiveContentStatuses.php +++ /dev/null @@ -1,18 +0,0 @@ - $value) { - if ($key == Content::STATUS_DELETED) { - continue; - } - - self::push($key, $value); - } - } -} \ No newline at end of file diff --git a/app/Enumerations/ContentStatuses.php b/app/Enumerations/ContentStatuses.php index 8ed34f9f..9ed89887 100644 --- a/app/Enumerations/ContentStatuses.php +++ b/app/Enumerations/ContentStatuses.php @@ -9,7 +9,6 @@ class ContentStatuses extends BaseEnumeration { $roles = [ Content::STATUS_DRAFT => 'admin/contents.status_' . Content::STATUS_DRAFT, - Content::STATUS_DELETED => 'admin/contents.status_' . Content::STATUS_DELETED, Content::STATUS_PROTECTED => 'admin/contents.status_' . Content::STATUS_PROTECTED, Content::STATUS_PUBLIC => 'admin/contents.status_' . Content::STATUS_PUBLIC ]; diff --git a/app/Events/DeleteContent.php b/app/Events/DeleteContent.php index fe1f555a..47e2a7ff 100644 --- a/app/Events/DeleteContent.php +++ b/app/Events/DeleteContent.php @@ -12,7 +12,6 @@ class DeleteContent extends Event * @var Content */ public $page; - public $revision; /** * Create a new event instance. @@ -20,9 +19,8 @@ class DeleteContent extends Event * @param Content $page * @param $revision */ - public function __construct(Content $page, $revision) + public function __construct(Content $page) { $this->page = $page; - $this->revision = $revision; } } diff --git a/app/Http/Controllers/Admin/CreateNewContent.php b/app/Http/Controllers/Admin/CreateNewContent.php index 6db38474..19b094ba 100644 --- a/app/Http/Controllers/Admin/CreateNewContent.php +++ b/app/Http/Controllers/Admin/CreateNewContent.php @@ -1,7 +1,7 @@ select(['template_name', 'name', 'description']) diff --git a/app/Http/Controllers/Admin/EditContent.php b/app/Http/Controllers/Admin/EditContent.php index 2fd85749..f07c09c1 100644 --- a/app/Http/Controllers/Admin/EditContent.php +++ b/app/Http/Controllers/Admin/EditContent.php @@ -197,7 +197,6 @@ class EditContent extends Controller { // get possible statuses $statuses = ContentStatuses::getWithTranslations(); - unset($statuses[Content::STATUS_DELETED]); // check if given status is valid if (!isset($statuses[$status])) { @@ -260,23 +259,13 @@ class EditContent extends Controller // change url to something unique $oldURL = $page->url; - $page->url = uniqid($page->url . '_deleted'); - $page->save(); - - list ($revision, $changedColumns) = $page->updateWithHistory(['status' => 'status'], ['status' => Content::STATUS_DELETED]); + $page->delete(); // let module to delete some extra content created during page's life call_user_func([$page->module_handler, 'delete'], $page); - // was something changed? - if ($changedColumns == 0) { - return redirect() - ->route('content.edit', ['id' => $page->id]) - ->with('error', trans('admin/contents.nothingToEdit')); - } - // trigger delete event - Event::fire(new DeleteContent($page, $revision)); + Event::fire(new DeleteContent($page)); // redirect back to overview with info for user return redirect() diff --git a/app/Listeners/LogDeleteContent.php b/app/Listeners/LogDeleteContent.php index 1c443dd4..f5e9ff47 100644 --- a/app/Listeners/LogDeleteContent.php +++ b/app/Listeners/LogDeleteContent.php @@ -22,7 +22,6 @@ class LogDeleteContent extends Logger 'id' => $event->page->id, 'url' => $event->page->url, 'title' => $event->page->title, - 'revision' => $event->revision ]; $this->saveLog($parameters); diff --git a/app/Models/Content.php b/app/Models/Content.php index 6bd88997..3c85be0e 100644 --- a/app/Models/Content.php +++ b/app/Models/Content.php @@ -5,6 +5,7 @@ namespace App\Models; use App\Enumerations\ContentStatuses; use App\Http\Requests\Request; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\DB; use Mcamara\LaravelLocalization\Facades\LaravelLocalization; @@ -15,6 +16,7 @@ use Modules\Categories\Entities\Category; */ class Content extends Model { + use SoftDeletes; public $timestamps = true; protected $fillable = [ 'user_id', @@ -38,7 +40,6 @@ class Content extends Model protected $guarded = []; protected $subpages = []; protected $subpagesInit = false; - const STATUS_DELETED = 'deleted'; const STATUS_DRAFT = 'draft'; const STATUS_PROTECTED = 'protected'; const STATUS_PUBLIC = 'public'; @@ -59,8 +60,7 @@ class Content extends Model */ public function getPageQuery() { - return Content::where('status', '!=', Content::STATUS_DELETED) - ->where('status', '!=', Content::STATUS_DRAFT); + return Content::where('status', '!=', Content::STATUS_DRAFT); } /** @@ -179,6 +179,7 @@ class Content extends Model * @param bool $handler * @param bool $status * @param bool $joinAuthor + * @param bool $joinParent * * @return */ @@ -186,9 +187,10 @@ class Content extends Model { $query = DB::table('contents') ->select('contents.*', 'modules.name AS module_name', 'modules.id AS module_id') - ->where('contents.status', '<>', self::STATUS_DELETED) - ->where('contents.language', LaravelLocalization::getCurrentLocale()) ->join('modules', 'modules.handler', '=', 'contents.module_handler') + ->whereNull('contents.deleted_at') + ->where('contents.language', LaravelLocalization::getCurrentLocale()) + ->where('modules.enabled', 1) ->orderBy('created_at', 'DESC'); // filter results using handler @@ -439,7 +441,7 @@ class Content extends Model public function view() { $this->timestamps = false; - $this->viewed ++; + $this->viewed++; $this->save(); $this->timestamps = true; } diff --git a/app/Widgets/Menu/Menu.php b/app/Widgets/Menu/Menu.php index b3ca55d9..67429d17 100644 --- a/app/Widgets/Menu/Menu.php +++ b/app/Widgets/Menu/Menu.php @@ -72,8 +72,7 @@ class Menu extends NonInstallableWidget public static function selectContentPages($ids) { - $pages = Content::where('status', '!=', Content::STATUS_DELETED) - ->where('language', LaravelLocalization::getCurrentLocale()) + $pages = Content::where('language', LaravelLocalization::getCurrentLocale()) ->whereIn('id', $ids) ->get(); $used = []; diff --git a/database/migrations/2016_09_22_191204_AddSoftDeletesToContent.php b/database/migrations/2016_09_22_191204_AddSoftDeletesToContent.php new file mode 100644 index 00000000..5046f05d --- /dev/null +++ b/database/migrations/2016_09_22_191204_AddSoftDeletesToContent.php @@ -0,0 +1,53 @@ +getDoctrineSchemaManager() + ->getDatabasePlatform(); + $platform->registerDoctrineTypeMapping('enum', 'string'); + } + + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + + Schema::table('contents', function (Blueprint $table) { + $table->softDeletes() + ->after('updated_at'); + }); + + DB::statement(" + ALTER TABLE `contents` + CHANGE `status` `status` enum('draft','protected','public') COLLATE 'utf8_unicode_ci' NOT NULL DEFAULT 'draft' AFTER `module_settings` + "); + + DB::statement('UPDATE contents SET status="protected", deleted_at=NOW() WHERE status=""'); + DB::statement('DELETE FROM content_history WHERE new_value="deleted" OR old_value="deleted"'); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('contents', function (Blueprint $table) { + $table->dropSoftDeletes(); + }); + + DB::statement("ALTER TABLE `contents` +CHANGE `status` `status` enum('draft','protected','public', 'deleted') COLLATE 'utf8_unicode_ci' NULL DEFAULT 'draft' AFTER `module_settings`;"); + } +}