FEATURE: add soft deletes to content pages
This commit is contained in:
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -9,7 +9,6 @@ class ContentStatuses extends BaseEnumeration
|
|||||||
{
|
{
|
||||||
$roles = [
|
$roles = [
|
||||||
Content::STATUS_DRAFT => 'admin/contents.status_' . Content::STATUS_DRAFT,
|
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_PROTECTED => 'admin/contents.status_' . Content::STATUS_PROTECTED,
|
||||||
Content::STATUS_PUBLIC => 'admin/contents.status_' . Content::STATUS_PUBLIC
|
Content::STATUS_PUBLIC => 'admin/contents.status_' . Content::STATUS_PUBLIC
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ class DeleteContent extends Event
|
|||||||
* @var Content
|
* @var Content
|
||||||
*/
|
*/
|
||||||
public $page;
|
public $page;
|
||||||
public $revision;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new event instance.
|
* Create a new event instance.
|
||||||
@@ -20,9 +19,8 @@ class DeleteContent extends Event
|
|||||||
* @param Content $page
|
* @param Content $page
|
||||||
* @param $revision
|
* @param $revision
|
||||||
*/
|
*/
|
||||||
public function __construct(Content $page, $revision)
|
public function __construct(Content $page)
|
||||||
{
|
{
|
||||||
$this->page = $page;
|
$this->page = $page;
|
||||||
$this->revision = $revision;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace App\Http\Controllers\Admin;
|
namespace App\Http\Controllers\Admin;
|
||||||
|
|
||||||
use App\Enumerations\ActiveContentStatuses;
|
use App\Enumerations\ContentStatuses;
|
||||||
use App\Events\CreateNewContent as CreateNewContentEvent;
|
use App\Events\CreateNewContent as CreateNewContentEvent;
|
||||||
use App\Http\Requests\CreateNewContentRequest;
|
use App\Http\Requests\CreateNewContentRequest;
|
||||||
use App\Models\Content;
|
use App\Models\Content;
|
||||||
@@ -43,7 +43,7 @@ class CreateNewContent extends Controller
|
|||||||
public function getNew($moduleId)
|
public function getNew($moduleId)
|
||||||
{
|
{
|
||||||
$module = Module::findOrFail($moduleId);
|
$module = Module::findOrFail($moduleId);
|
||||||
$statuses = ActiveContentStatuses::getWithTranslations();
|
$statuses = ContentStatuses::getWithTranslations();
|
||||||
|
|
||||||
$templates = Template::where('module_id', $moduleId)
|
$templates = Template::where('module_id', $moduleId)
|
||||||
->select(['template_name', 'name', 'description'])
|
->select(['template_name', 'name', 'description'])
|
||||||
|
|||||||
@@ -197,7 +197,6 @@ class EditContent extends Controller
|
|||||||
{
|
{
|
||||||
// get possible statuses
|
// get possible statuses
|
||||||
$statuses = ContentStatuses::getWithTranslations();
|
$statuses = ContentStatuses::getWithTranslations();
|
||||||
unset($statuses[Content::STATUS_DELETED]);
|
|
||||||
|
|
||||||
// check if given status is valid
|
// check if given status is valid
|
||||||
if (!isset($statuses[$status])) {
|
if (!isset($statuses[$status])) {
|
||||||
@@ -260,23 +259,13 @@ class EditContent extends Controller
|
|||||||
|
|
||||||
// change url to something unique
|
// change url to something unique
|
||||||
$oldURL = $page->url;
|
$oldURL = $page->url;
|
||||||
$page->url = uniqid($page->url . '_deleted');
|
$page->delete();
|
||||||
$page->save();
|
|
||||||
|
|
||||||
list ($revision, $changedColumns) = $page->updateWithHistory(['status' => 'status'], ['status' => Content::STATUS_DELETED]);
|
|
||||||
|
|
||||||
// let module to delete some extra content created during page's life
|
// let module to delete some extra content created during page's life
|
||||||
call_user_func([$page->module_handler, 'delete'], $page);
|
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
|
// trigger delete event
|
||||||
Event::fire(new DeleteContent($page, $revision));
|
Event::fire(new DeleteContent($page));
|
||||||
|
|
||||||
// redirect back to overview with info for user
|
// redirect back to overview with info for user
|
||||||
return redirect()
|
return redirect()
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ class LogDeleteContent extends Logger
|
|||||||
'id' => $event->page->id,
|
'id' => $event->page->id,
|
||||||
'url' => $event->page->url,
|
'url' => $event->page->url,
|
||||||
'title' => $event->page->title,
|
'title' => $event->page->title,
|
||||||
'revision' => $event->revision
|
|
||||||
];
|
];
|
||||||
|
|
||||||
$this->saveLog($parameters);
|
$this->saveLog($parameters);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ namespace App\Models;
|
|||||||
use App\Enumerations\ContentStatuses;
|
use App\Enumerations\ContentStatuses;
|
||||||
use App\Http\Requests\Request;
|
use App\Http\Requests\Request;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
use Illuminate\Support\Facades\App;
|
use Illuminate\Support\Facades\App;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
|
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
|
||||||
@@ -15,6 +16,7 @@ use Modules\Categories\Entities\Category;
|
|||||||
*/
|
*/
|
||||||
class Content extends Model
|
class Content extends Model
|
||||||
{
|
{
|
||||||
|
use SoftDeletes;
|
||||||
public $timestamps = true;
|
public $timestamps = true;
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'user_id',
|
'user_id',
|
||||||
@@ -38,7 +40,6 @@ class Content extends Model
|
|||||||
protected $guarded = [];
|
protected $guarded = [];
|
||||||
protected $subpages = [];
|
protected $subpages = [];
|
||||||
protected $subpagesInit = false;
|
protected $subpagesInit = false;
|
||||||
const STATUS_DELETED = 'deleted';
|
|
||||||
const STATUS_DRAFT = 'draft';
|
const STATUS_DRAFT = 'draft';
|
||||||
const STATUS_PROTECTED = 'protected';
|
const STATUS_PROTECTED = 'protected';
|
||||||
const STATUS_PUBLIC = 'public';
|
const STATUS_PUBLIC = 'public';
|
||||||
@@ -59,8 +60,7 @@ class Content extends Model
|
|||||||
*/
|
*/
|
||||||
public function getPageQuery()
|
public function getPageQuery()
|
||||||
{
|
{
|
||||||
return Content::where('status', '!=', Content::STATUS_DELETED)
|
return Content::where('status', '!=', Content::STATUS_DRAFT);
|
||||||
->where('status', '!=', Content::STATUS_DRAFT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -179,6 +179,7 @@ class Content extends Model
|
|||||||
* @param bool $handler
|
* @param bool $handler
|
||||||
* @param bool $status
|
* @param bool $status
|
||||||
* @param bool $joinAuthor
|
* @param bool $joinAuthor
|
||||||
|
* @param bool $joinParent
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -186,9 +187,10 @@ class Content extends Model
|
|||||||
{
|
{
|
||||||
$query = DB::table('contents')
|
$query = DB::table('contents')
|
||||||
->select('contents.*', 'modules.name AS module_name', 'modules.id AS module_id')
|
->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')
|
->join('modules', 'modules.handler', '=', 'contents.module_handler')
|
||||||
|
->whereNull('contents.deleted_at')
|
||||||
|
->where('contents.language', LaravelLocalization::getCurrentLocale())
|
||||||
|
->where('modules.enabled', 1)
|
||||||
->orderBy('created_at', 'DESC');
|
->orderBy('created_at', 'DESC');
|
||||||
|
|
||||||
// filter results using handler
|
// filter results using handler
|
||||||
@@ -439,7 +441,7 @@ class Content extends Model
|
|||||||
public function view()
|
public function view()
|
||||||
{
|
{
|
||||||
$this->timestamps = false;
|
$this->timestamps = false;
|
||||||
$this->viewed ++;
|
$this->viewed++;
|
||||||
$this->save();
|
$this->save();
|
||||||
$this->timestamps = true;
|
$this->timestamps = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,8 +72,7 @@ class Menu extends NonInstallableWidget
|
|||||||
|
|
||||||
public static function selectContentPages($ids)
|
public static function selectContentPages($ids)
|
||||||
{
|
{
|
||||||
$pages = Content::where('status', '!=', Content::STATUS_DELETED)
|
$pages = Content::where('language', LaravelLocalization::getCurrentLocale())
|
||||||
->where('language', LaravelLocalization::getCurrentLocale())
|
|
||||||
->whereIn('id', $ids)
|
->whereIn('id', $ids)
|
||||||
->get();
|
->get();
|
||||||
$used = [];
|
$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`;");
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user