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:
		
							parent
							
								
									7590ecd37c
								
							
						
					
					
						commit
						a9f02550f0
					
				| 
						 | 
					@ -3,25 +3,26 @@
 | 
				
			||||||
use BookStack\Auth\Role;
 | 
					use BookStack\Auth\Role;
 | 
				
			||||||
use BookStack\Entities\Entity;
 | 
					use BookStack\Entities\Entity;
 | 
				
			||||||
use BookStack\Model;
 | 
					use BookStack\Model;
 | 
				
			||||||
 | 
					use Illuminate\Database\Eloquent\Relations\BelongsTo;
 | 
				
			||||||
 | 
					use Illuminate\Database\Eloquent\Relations\MorphOne;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class JointPermission extends Model
 | 
					class JointPermission extends Model
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    protected $primaryKey = null;
 | 
				
			||||||
    public $timestamps = false;
 | 
					    public $timestamps = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Get the role that this points to.
 | 
					     * 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);
 | 
					        return $this->belongsTo(Role::class);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Get the entity this points to.
 | 
					     * 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');
 | 
					        return $this->morphOne(Entity::class, 'entity');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -2,10 +2,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use BookStack\Entities\Bookshelf;
 | 
					use BookStack\Entities\Bookshelf;
 | 
				
			||||||
use BookStack\Entities\Page;
 | 
					use BookStack\Entities\Page;
 | 
				
			||||||
use BookStack\Auth\Permissions\PermissionsRepo;
 | 
					 | 
				
			||||||
use BookStack\Auth\Role;
 | 
					use BookStack\Auth\Role;
 | 
				
			||||||
use Laravel\BrowserKitTesting\HttpException;
 | 
					use Laravel\BrowserKitTesting\HttpException;
 | 
				
			||||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 | 
					 | 
				
			||||||
use Tests\BrowserKitTest;
 | 
					use Tests\BrowserKitTest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RolesTest extends BrowserKitTest
 | 
					class RolesTest extends BrowserKitTest
 | 
				
			||||||
| 
						 | 
					@ -852,7 +850,7 @@ class RolesTest extends BrowserKitTest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private function addComment($page) {
 | 
					    private function addComment($page) {
 | 
				
			||||||
        $comment = factory(\BookStack\Actions\Comment::class)->make();
 | 
					        $comment = factory(\BookStack\Actions\Comment::class)->make();
 | 
				
			||||||
        $url = "/ajax/page/$page->id/comment";
 | 
					        $url = "/comment/$page->id";
 | 
				
			||||||
        $request = [
 | 
					        $request = [
 | 
				
			||||||
            'text' => $comment->text,
 | 
					            'text' => $comment->text,
 | 
				
			||||||
            'html' => $comment->html
 | 
					            'html' => $comment->html
 | 
				
			||||||
| 
						 | 
					@ -865,7 +863,7 @@ class RolesTest extends BrowserKitTest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private function updateComment($commentId) {
 | 
					    private function updateComment($commentId) {
 | 
				
			||||||
        $comment = factory(\BookStack\Actions\Comment::class)->make();
 | 
					        $comment = factory(\BookStack\Actions\Comment::class)->make();
 | 
				
			||||||
        $url = "/ajax/comment/$commentId";
 | 
					        $url = "/comment/$commentId";
 | 
				
			||||||
        $request = [
 | 
					        $request = [
 | 
				
			||||||
            'text' => $comment->text,
 | 
					            'text' => $comment->text,
 | 
				
			||||||
            'html' => $comment->html
 | 
					            'html' => $comment->html
 | 
				
			||||||
| 
						 | 
					@ -875,7 +873,7 @@ class RolesTest extends BrowserKitTest
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private function deleteComment($commentId) {
 | 
					    private function deleteComment($commentId) {
 | 
				
			||||||
         $url = '/ajax/comment/' . $commentId;
 | 
					         $url = '/comment/' . $commentId;
 | 
				
			||||||
         return $this->json('DELETE', $url);
 | 
					         return $this->json('DELETE', $url);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue