新增职务权限管理与聊天室管理权限控制

This commit is contained in:
2026-04-21 16:43:17 +08:00
parent cfdbf387af
commit 281315d1cf
19 changed files with 1243 additions and 87 deletions
@@ -16,9 +16,13 @@ use App\Jobs\SaveMessageJob;
use App\Models\BaccaratLossCoverEvent;
use App\Models\BaccaratLossCoverRecord;
use App\Models\BaccaratRound;
use App\Models\Department;
use App\Models\GameConfig;
use App\Models\Position;
use App\Models\User;
use App\Models\UserPosition;
use App\Services\BaccaratLossCoverService;
use App\Support\PositionPermissionRegistry;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Queue;
@@ -57,7 +61,7 @@ class BaccaratLossCoverControllerTest extends TestCase
{
Queue::fake();
$admin = User::factory()->create(['user_level' => 100]);
$admin = User::factory()->create(['id' => 1, 'user_level' => 100]);
$response = $this->actingAs($admin)->postJson(route('command.baccarat_loss_cover.store'), [
'title' => '你玩游戏我买单',
@@ -76,6 +80,46 @@ class BaccaratLossCoverControllerTest extends TestCase
]);
}
/**
* 验证拥有买单活动权限的职务用户也可以创建活动。
*/
public function test_position_user_with_loss_cover_permission_can_create_event(): void
{
Queue::fake();
$admin = $this->createUserWithPermissions([
PositionPermissionRegistry::ROOM_BACCARAT_LOSS_COVER,
]);
$response = $this->actingAs($admin)->postJson(route('command.baccarat_loss_cover.store'), [
'title' => '职务买单活动',
'description' => '职务权限测试',
'starts_at' => now()->addMinutes(3)->toDateTimeString(),
'ends_at' => now()->addMinutes(33)->toDateTimeString(),
'claim_deadline_at' => now()->addHours(6)->toDateTimeString(),
]);
$response->assertOk()->assertJson(['ok' => true]);
}
/**
* 验证高等级但无买单活动权限的用户会被拒绝。
*/
public function test_high_level_user_without_loss_cover_permission_cannot_create_event(): void
{
$admin = User::factory()->create(['user_level' => 100]);
$response = $this->actingAs($admin)->postJson(route('command.baccarat_loss_cover.store'), [
'title' => '无权限活动',
'description' => '测试活动',
'starts_at' => now()->addMinutes(5)->toDateTimeString(),
'ends_at' => now()->addMinutes(35)->toDateTimeString(),
'claim_deadline_at' => now()->addDay()->toDateTimeString(),
]);
$response->assertStatus(403);
}
/**
* 验证活动进行中下注会挂到活动并写入用户聚合记录。
*/
@@ -331,4 +375,45 @@ class BaccaratLossCoverControllerTest extends TestCase
'source' => CurrencySource::BACCARAT_LOSS_COVER_CLAIM->value,
]);
}
/**
* 创建带指定聊天室权限的在职职务用户。
*
* @param list<string> $permissions
*/
private function createUserWithPermissions(array $permissions): User
{
$user = User::factory()->create([
'user_level' => 90,
]);
$department = Department::create([
'name' => '买单活动部'.$user->id,
'rank' => 90,
'color' => '#15803d',
'sort_order' => 1,
'description' => '买单活动权限测试',
]);
$position = Position::create([
'department_id' => $department->id,
'name' => '买单活动职务'.$user->id,
'icon' => '🎁',
'rank' => 90,
'level' => 90,
'sort_order' => 1,
'permissions' => $permissions,
]);
UserPosition::create([
'user_id' => $user->id,
'position_id' => $position->id,
'appointed_by_user_id' => null,
'appointed_at' => now(),
'remark' => '买单活动权限测试',
'is_active' => true,
]);
return $user->fresh();
}
}