You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.2 KiB

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\RolePermission;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RolePermissionController extends Controller
{
public function index(Request $request): JsonResponse
{
$rows = RolePermission::query()
->orderBy('sort')
->orderBy('id')
->get();
return response()->json($rows);
}
public function update(Request $request, RolePermission $rolePermission): JsonResponse
{
$this->ensureSuperAdmin($request);
$data = $request->validate([
'super_admin_allowed' => ['required', 'boolean'],
'venue_admin_allowed' => ['required', 'boolean'],
'scope' => ['nullable', 'string', 'max:255'],
'sort' => ['nullable', 'integer', 'min:0'],
]);
$rolePermission->fill($data)->save();
return response()->json($rolePermission);
}
public function batchUpdate(Request $request): JsonResponse
{
$this->ensureSuperAdmin($request);
$data = $request->validate([
'items' => ['required', 'array', 'min:1'],
'items.*.id' => ['required', 'integer', 'exists:role_permissions,id'],
'items.*.super_admin_allowed' => ['required', 'boolean'],
'items.*.venue_admin_allowed' => ['required', 'boolean'],
'items.*.scope' => ['nullable', 'string', 'max:255'],
'items.*.sort' => ['nullable', 'integer', 'min:0'],
]);
foreach ($data['items'] as $item) {
$row = RolePermission::find($item['id']);
if (!$row) {
continue;
}
$row->fill([
'super_admin_allowed' => $item['super_admin_allowed'],
'venue_admin_allowed' => $item['venue_admin_allowed'],
'scope' => $item['scope'] ?? $row->scope,
'sort' => $item['sort'] ?? $row->sort,
])->save();
}
return response()->json(['message' => '批量保存成功']);
}
private function ensureSuperAdmin(Request $request): void
{
abort_unless($request->user()?->isSuperAdmin(), 403, '仅超级管理员可操作');
}
}