FEATURE: add soft deletes to content pages

This commit is contained in:
Michal Kváček
2016-09-22 21:57:45 +02:00
parent b982831fbf
commit d5d4216a80
9 changed files with 67 additions and 46 deletions
@@ -1,18 +0,0 @@
<?php
namespace App\Enumerations;
use App\Models\Content;
class ActiveContentStatuses extends BaseEnumeration
{
protected static function init()
{
foreach (ContentStatuses::getWithTranslations() as $key => $value) {
if ($key == Content::STATUS_DELETED) {
continue;
}
self::push($key, $value);
}
}
}
-1
View File
@@ -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
];
+1 -3
View File
@@ -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;
}
}
@@ -1,7 +1,7 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Enumerations\ActiveContentStatuses;
use App\Enumerations\ContentStatuses;
use App\Events\CreateNewContent as CreateNewContentEvent;
use App\Http\Requests\CreateNewContentRequest;
use App\Models\Content;
@@ -43,7 +43,7 @@ class CreateNewContent extends Controller
public function getNew($moduleId)
{
$module = Module::findOrFail($moduleId);
$statuses = ActiveContentStatuses::getWithTranslations();
$statuses = ContentStatuses::getWithTranslations();
$templates = Template::where('module_id', $moduleId)
->select(['template_name', 'name', 'description'])
+2 -13
View File
@@ -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()
-1
View File
@@ -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);
+8 -6
View File
@@ -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;
}
+1 -2
View File
@@ -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 = [];
@@ -0,0 +1,53 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
class AddSoftDeletesToContent extends Migration
{
public function __construct()
{
$platform = Schema::getConnection()
->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`;");
}
}