Skip to content

Commit ea611ac

Browse files
Merge pull request #8820 from ProcessMaker/task/FOUR-31101
Legacy users should have these permissions set to true (migration users)
2 parents e641fa5 + 1997f43 commit ea611ac

2 files changed

Lines changed: 168 additions & 0 deletions

File tree

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Support\Facades\DB;
5+
use ProcessMaker\Models\User;
6+
7+
return new class extends Migration {
8+
private const TAB_TASK_PERMISSIONS = [
9+
'overview-tab-task',
10+
'summary-tab-task',
11+
'completed-tab-task',
12+
'form-tab-task',
13+
'files-tab-task',
14+
];
15+
16+
private const CHUNK_SIZE = 500;
17+
18+
/**
19+
* Run the migrations.
20+
*/
21+
public function up(): void
22+
{
23+
$permissionIds = DB::table('permissions')
24+
->whereIn('name', self::TAB_TASK_PERMISSIONS)
25+
->pluck('id', 'name')
26+
->values();
27+
28+
foreach ($permissionIds as $permissionId) {
29+
$this->assignPermissionToUsers((int) $permissionId);
30+
}
31+
}
32+
33+
/**
34+
* Reverse the migrations.
35+
*/
36+
public function down(): void
37+
{
38+
$permissionIds = DB::table('permissions')
39+
->whereIn('name', self::TAB_TASK_PERMISSIONS)
40+
->pluck('id', 'name')
41+
->values();
42+
43+
DB::table('assignables')
44+
->whereIn('permission_id', $permissionIds)
45+
->where('assignable_type', User::class)
46+
->delete();
47+
}
48+
49+
private function assignPermissionToUsers(int $permissionId): void
50+
{
51+
$lastUserId = 0;
52+
53+
do {
54+
$users = DB::table('users AS u')
55+
->leftJoin('assignables AS a', function ($join) use ($permissionId) {
56+
$join->on('u.id', '=', 'a.assignable_id')
57+
->where('a.assignable_type', User::class)
58+
->where('a.permission_id', $permissionId);
59+
})
60+
->whereNull('a.permission_id')
61+
->where('u.id', '>', $lastUserId)
62+
->where('u.is_administrator', false)
63+
->select('u.id')
64+
->orderBy('u.id')
65+
->limit(self::CHUNK_SIZE)
66+
->get();
67+
68+
if ($users->isEmpty()) {
69+
return;
70+
}
71+
72+
$records = $users->map(fn ($user) => [
73+
'permission_id' => $permissionId,
74+
'assignable_id' => $user->id,
75+
'assignable_type' => User::class,
76+
])->all();
77+
78+
DB::table('assignables')->insert($records);
79+
$lastUserId = $users->last()->id;
80+
} while ($users->count() === self::CHUNK_SIZE);
81+
}
82+
};
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
3+
namespace Tests\Feature\Migrations;
4+
5+
use Database\Seeders\PermissionSeeder;
6+
use Illuminate\Support\Facades\DB;
7+
use ProcessMaker\Models\Permission;
8+
use ProcessMaker\Models\User;
9+
use Tests\TestCase;
10+
11+
class AddPermissionsTabTaskToUsersTest extends TestCase
12+
{
13+
private const MIGRATION_PATH = 'database/migrations/2026_05_07_142346_add_permissions_tab_task_to_users.php';
14+
15+
private const TAB_TASK_PERMISSIONS = [
16+
'overview-tab-task',
17+
'summary-tab-task',
18+
'completed-tab-task',
19+
'form-tab-task',
20+
'files-tab-task',
21+
];
22+
23+
public function testItAssignsTabTaskPermissionsToNonAdministratorUsersOnly(): void
24+
{
25+
(new PermissionSeeder)->run();
26+
27+
[$existingUser, $newUser, $adminUser] = User::withoutEvents(fn () => [
28+
User::factory()->create(['is_administrator' => false]),
29+
User::factory()->create(['is_administrator' => false]),
30+
User::factory()->admin()->create(),
31+
]);
32+
33+
$existingPermission = Permission::byName('overview-tab-task');
34+
$existingUser->permissions()->attach($existingPermission->id);
35+
36+
$this->migration()->up();
37+
38+
$this->assertSame($this->tabTaskPermissionIds()->count(), $this->tabTaskPermissionCount($existingUser));
39+
$this->assertSame($this->tabTaskPermissionIds()->count(), $this->tabTaskPermissionCount($newUser));
40+
$this->assertSame(0, $this->tabTaskPermissionCount($adminUser));
41+
$this->assertSame(1, $this->userPermissionCount($existingUser, $existingPermission));
42+
}
43+
44+
public function testItRemovesTabTaskPermissionAssignmentsOnRollback(): void
45+
{
46+
(new PermissionSeeder)->run();
47+
48+
$user = User::withoutEvents(fn () => User::factory()->create(['is_administrator' => false]));
49+
50+
$migration = $this->migration();
51+
$migration->up();
52+
$migration->down();
53+
54+
$this->assertSame(0, $this->tabTaskPermissionCount($user));
55+
}
56+
57+
private function migration()
58+
{
59+
return include base_path(self::MIGRATION_PATH);
60+
}
61+
62+
private function tabTaskPermissionCount(User $user): int
63+
{
64+
return DB::table('assignables')
65+
->where('assignable_id', $user->id)
66+
->where('assignable_type', User::class)
67+
->whereIn('permission_id', $this->tabTaskPermissionIds())
68+
->count();
69+
}
70+
71+
private function userPermissionCount(User $user, Permission $permission): int
72+
{
73+
return DB::table('assignables')
74+
->where('assignable_id', $user->id)
75+
->where('assignable_type', User::class)
76+
->where('permission_id', $permission->id)
77+
->count();
78+
}
79+
80+
private function tabTaskPermissionIds()
81+
{
82+
return Permission::whereIn('name', self::TAB_TASK_PERMISSIONS)
83+
->pluck('id', 'name')
84+
->values();
85+
}
86+
}

0 commit comments

Comments
 (0)