91 خطوط
2.7 KiB
PHP
91 خطوط
2.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Services\ActivityLogger;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Spatie\Permission\Models\Role;
|
|
use Spatie\Permission\Models\Permission;
|
|
|
|
class RoleController extends Controller
|
|
{
|
|
public function index(): JsonResponse
|
|
{
|
|
$roles = Role::with('permissions')->orderBy('name')->get();
|
|
return response()->json($roles);
|
|
}
|
|
|
|
public function store(Request $request): JsonResponse
|
|
{
|
|
$validated = $request->validate([
|
|
'name' => 'required|string|unique:roles,name',
|
|
'permissions' => 'sometimes|array',
|
|
'permissions.*' => 'exists:permissions,name',
|
|
]);
|
|
|
|
$role = Role::create(['name' => $validated['name'], 'guard_name' => 'web']);
|
|
|
|
if ($request->permissions) {
|
|
$role->syncPermissions($validated['permissions']);
|
|
}
|
|
|
|
ActivityLogger::log('role_created', "Role {$role->name} created");
|
|
|
|
return response()->json($role->load('permissions'), 201);
|
|
}
|
|
|
|
public function show(Role $role): JsonResponse
|
|
{
|
|
return response()->json($role->load('permissions'));
|
|
}
|
|
|
|
public function update(Request $request, Role $role): JsonResponse
|
|
{
|
|
$validated = $request->validate([
|
|
'name' => 'sometimes|string|unique:roles,name,' . $role->id,
|
|
'permissions' => 'sometimes|array',
|
|
'permissions.*' => 'exists:permissions,name',
|
|
]);
|
|
|
|
if (isset($validated['name'])) {
|
|
$role->update(['name' => $validated['name']]);
|
|
}
|
|
|
|
if ($request->has('permissions')) {
|
|
$role->syncPermissions($validated['permissions']);
|
|
}
|
|
|
|
ActivityLogger::log('role_updated', "Role {$role->name} updated");
|
|
|
|
return response()->json($role->load('permissions'));
|
|
}
|
|
|
|
public function destroy(Role $role): JsonResponse
|
|
{
|
|
if ($role->name === 'admin') {
|
|
return response()->json(['message' => 'نقش ادمین قابل حذف نیست'], 422);
|
|
}
|
|
|
|
$role->delete();
|
|
|
|
ActivityLogger::log('role_deleted', "Role {$role->name} deleted");
|
|
|
|
return response()->json(['message' => 'نقش حذف شد']);
|
|
}
|
|
|
|
public function syncPermissions(Request $request, Role $role): JsonResponse
|
|
{
|
|
$request->validate(['permissions' => 'required|array', 'permissions.*' => 'exists:permissions,name']);
|
|
$role->syncPermissions($request->permissions);
|
|
|
|
return response()->json($role->load('permissions'));
|
|
}
|
|
|
|
public function permissions(): JsonResponse
|
|
{
|
|
return response()->json(Permission::orderBy('name')->get());
|
|
}
|
|
}
|