PM_Console/backend/app/Http/Controllers/Api/RoleController.php

180 خطوط
5.8 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\StoreRoleRequest;
use App\Http\Requests\UpdateRoleRequest;
use App\Http\Resources\RoleResource;
use App\Http\Resources\PermissionResource;
use App\Models\Role;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RoleController extends Controller
{
public function index(Request $request): JsonResponse
{
try {
$query = Role::with('permissions')->withCount('users');
$perPage = min((int) $request->input('per_page', 15), 100);
$sortBy = in_array($request->input('sort_by'), ['id', 'name', 'display_name', 'created_at', 'updated_at'], true)
? $request->input('sort_by')
: 'created_at';
$sortDir = $request->input('sort_dir') === 'asc' ? 'asc' : 'desc';
$roles = $query->orderBy($sortBy, $sortDir)->paginate($perPage);
return response()->json([
'success' => true,
'data' => RoleResource::collection($roles),
'meta' => [
'current_page' => $roles->currentPage(),
'last_page' => $roles->lastPage(),
'per_page' => $roles->perPage(),
'total' => $roles->total(),
],
'message' => 'لیست نقش‌ها',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در دریافت نقش‌ها',
], 500);
}
}
public function show(Role $role): JsonResponse
{
try {
$role->load('permissions');
return response()->json([
'success' => true,
'data' => new RoleResource($role),
'message' => 'اطلاعات نقش',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در دریافت اطلاعات نقش',
], 500);
}
}
public function store(StoreRoleRequest $request): JsonResponse
{
try {
$data = $request->validated();
$permissionIds = $data['permissions'] ?? [];
unset($data['permissions']);
$data['guard_name'] = $data['guard_name'] ?? 'web';
$role = Role::create($data);
$role->permissions()->sync($permissionIds);
$role->load('permissions')->loadCount('users');
return response()->json([
'success' => true,
'data' => new RoleResource($role),
'message' => 'نقش با موفقیت ایجاد شد',
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در ایجاد نقش',
], 500);
}
}
public function update(UpdateRoleRequest $request, Role $role): JsonResponse
{
try {
$data = $request->validated();
$permissionIds = $data['permissions'] ?? null;
unset($data['permissions']);
if (array_key_exists('guard_name', $data) && !$data['guard_name']) {
$data['guard_name'] = 'web';
}
$role->update($data);
if ($permissionIds !== null) {
$role->permissions()->sync($permissionIds);
}
$role->load('permissions')->loadCount('users');
return response()->json([
'success' => true,
'data' => new RoleResource($role),
'message' => 'نقش به‌روزرسانی شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در به‌روزرسانی نقش',
], 500);
}
}
public function destroy(Role $role): JsonResponse
{
try {
$role->delete();
return response()->json([
'success' => true,
'message' => 'نقش حذف شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در حذف نقش',
], 500);
}
}
public function assignPermissions(Request $request, Role $role): JsonResponse
{
try {
$request->validate([
'permissions' => 'present|array',
'permissions.*' => 'exists:permissions,id',
]);
$role->permissions()->sync($request->permissions);
$role->load('permissions')->loadCount('users');
return response()->json([
'success' => true,
'data' => new RoleResource($role),
'message' => 'دسترسی‌های نقش به‌روزرسانی شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در به‌روزرسانی دسترسی‌های نقش',
], 500);
}
}
public function getPermissions(Role $role): JsonResponse
{
try {
$role->load('permissions');
return response()->json([
'success' => true,
'data' => PermissionResource::collection($role->permissions),
'message' => 'دسترسی‌های نقش',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در دریافت دسترسی‌های نقش',
], 500);
}
}
}