Removed joint_permissions auto_increment id

Removed auto_incrementing id and set a primary key of the [role_id,
entity_type, entity_id, action] instead since this table could recieve a
lot of activity, especially when permission regeneration was automated,
leading to very high auto_increment counts which could max out the
integer limit.

Also updated some RolesTest comment endpoints to align with
recent route changes.

Should fix #2091
This commit is contained in:
Dan Brown 2020-08-04 13:02:31 +01:00
parent 7590ecd37c
commit a9f02550f0
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
3 changed files with 45 additions and 9 deletions

View File

@ -3,25 +3,26 @@
use BookStack\Auth\Role;
use BookStack\Entities\Entity;
use BookStack\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphOne;
class JointPermission extends Model
{
protected $primaryKey = null;
public $timestamps = false;
/**
* Get the role that this points to.
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function role()
public function role(): BelongsTo
{
return $this->belongsTo(Role::class);
}
/**
* Get the entity this points to.
* @return \Illuminate\Database\Eloquent\Relations\MorphOne
*/
public function entity()
public function entity(): MorphOne
{
return $this->morphOne(Entity::class, 'entity');
}

View File

@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class DropJointPermissionsId extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('joint_permissions', function (Blueprint $table) {
$table->dropColumn('id');
$table->primary(['role_id', 'entity_type', 'entity_id', 'action'], 'joint_primary');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('joint_permissions', function (Blueprint $table) {
$table->dropPrimary(['role_id', 'entity_type', 'entity_id', 'action']);
});
Schema::table('joint_permissions', function (Blueprint $table) {
$table->increments('id')->unsigned();
});
}
}

View File

@ -2,10 +2,8 @@
use BookStack\Entities\Bookshelf;
use BookStack\Entities\Page;
use BookStack\Auth\Permissions\PermissionsRepo;
use BookStack\Auth\Role;
use Laravel\BrowserKitTesting\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Tests\BrowserKitTest;
class RolesTest extends BrowserKitTest
@ -852,7 +850,7 @@ class RolesTest extends BrowserKitTest
private function addComment($page) {
$comment = factory(\BookStack\Actions\Comment::class)->make();
$url = "/ajax/page/$page->id/comment";
$url = "/comment/$page->id";
$request = [
'text' => $comment->text,
'html' => $comment->html
@ -865,7 +863,7 @@ class RolesTest extends BrowserKitTest
private function updateComment($commentId) {
$comment = factory(\BookStack\Actions\Comment::class)->make();
$url = "/ajax/comment/$commentId";
$url = "/comment/$commentId";
$request = [
'text' => $comment->text,
'html' => $comment->html
@ -875,7 +873,7 @@ class RolesTest extends BrowserKitTest
}
private function deleteComment($commentId) {
$url = '/ajax/comment/' . $commentId;
$url = '/comment/' . $commentId;
return $this->json('DELETE', $url);
}