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.
87 lines
2.8 KiB
87 lines
2.8 KiB
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\User;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Hash;
|
|
|
|
class AdminUserController extends Controller
|
|
{
|
|
public function index(Request $request): JsonResponse
|
|
{
|
|
$this->ensureSuperAdmin($request);
|
|
|
|
$users = User::with('venues:id,name')
|
|
->orderByDesc('id')
|
|
->get(['id', 'username', 'name', 'email', 'role', 'is_active', 'created_at']);
|
|
|
|
return response()->json($users);
|
|
}
|
|
|
|
public function store(Request $request): JsonResponse
|
|
{
|
|
$this->ensureSuperAdmin($request);
|
|
|
|
$data = $request->validate([
|
|
'username' => ['required', 'string', 'max:50', 'unique:users,username'],
|
|
'name' => ['required', 'string', 'max:100'],
|
|
'email' => ['required', 'email', 'max:100', 'unique:users,email'],
|
|
'password' => ['required', 'string', 'min:6'],
|
|
'role' => ['required', 'in:super_admin,venue_admin'],
|
|
'is_active' => ['boolean'],
|
|
'venue_ids' => ['array'],
|
|
'venue_ids.*' => ['integer', 'exists:venues,id'],
|
|
]);
|
|
|
|
$user = User::create([
|
|
'username' => $data['username'],
|
|
'name' => $data['name'],
|
|
'email' => $data['email'],
|
|
'password' => Hash::make($data['password']),
|
|
'role' => $data['role'],
|
|
'is_active' => $data['is_active'] ?? true,
|
|
]);
|
|
|
|
$user->venues()->sync($data['venue_ids'] ?? []);
|
|
|
|
return response()->json($user->load('venues:id,name'), 201);
|
|
}
|
|
|
|
public function update(Request $request, User $user): JsonResponse
|
|
{
|
|
$this->ensureSuperAdmin($request);
|
|
|
|
$data = $request->validate([
|
|
'name' => ['sometimes', 'string', 'max:100'],
|
|
'email' => ['nullable', 'email', 'max:100', 'unique:users,email,' . $user->id],
|
|
'password' => ['nullable', 'string', 'min:6'],
|
|
'role' => ['sometimes', 'in:super_admin,venue_admin'],
|
|
'is_active' => ['sometimes', 'boolean'],
|
|
'venue_ids' => ['sometimes', 'array'],
|
|
'venue_ids.*' => ['integer', 'exists:venues,id'],
|
|
]);
|
|
|
|
if (isset($data['password'])) {
|
|
$data['password'] = Hash::make($data['password']);
|
|
} else {
|
|
unset($data['password']);
|
|
}
|
|
|
|
$user->fill($data)->save();
|
|
|
|
if (array_key_exists('venue_ids', $data)) {
|
|
$user->venues()->sync($data['venue_ids']);
|
|
}
|
|
|
|
return response()->json($user->fresh()->load('venues:id,name'));
|
|
}
|
|
|
|
private function ensureSuperAdmin(Request $request): void
|
|
{
|
|
abort_unless($request->user()?->isSuperAdmin(), 403, '仅超级管理员可操作');
|
|
}
|
|
}
|