New-Thanasoft/thanasoft-back/app/Http/Controllers/Api/AccessControlController.php

252 lines
8.4 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Repositories\AccessControlRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class AccessControlController extends Controller
{
public function __construct(
private readonly AccessControlRepositoryInterface $accessControlRepository
) {
}
public function index(): JsonResponse
{
try {
return response()->json([
'data' => $this->accessControlRepository->index(),
'message' => 'Roles et permissions recuperes avec succes.',
]);
} catch (\Exception $e) {
Log::error('Error fetching access control data: ' . $e->getMessage(), [
'exception' => $e,
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la recuperation des roles et permissions.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
public function storeRole(Request $request): JsonResponse
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:100', 'unique:roles,name'],
'guard_name' => ['nullable', 'string', 'max:50'],
'permissions' => ['nullable', 'array'],
'permissions.*' => ['string', 'max:150'],
]);
try {
$role = $this->accessControlRepository->createRole($validated);
return response()->json([
'data' => $role,
'message' => 'Role cree avec succes.',
], 201);
} catch (\Exception $e) {
Log::error('Error creating role: ' . $e->getMessage(), [
'exception' => $e,
'data' => $validated,
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la creation du role.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
public function updateRole(Request $request, string $id): JsonResponse
{
$validated = $request->validate([
'name' => ['sometimes', 'string', 'max:100', 'unique:roles,name,' . $id],
'guard_name' => ['nullable', 'string', 'max:50'],
'permissions' => ['nullable', 'array'],
'permissions.*' => ['string', 'max:150'],
]);
try {
$role = $this->accessControlRepository->updateRole((int) $id, $validated);
if (! $role) {
return response()->json([
'message' => 'Role non trouve.',
], 404);
}
return response()->json([
'data' => $role,
'message' => 'Role mis a jour avec succes.',
]);
} catch (\Exception $e) {
Log::error('Error updating role: ' . $e->getMessage(), [
'exception' => $e,
'role_id' => $id,
'data' => $validated,
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la mise a jour du role.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
public function destroyRole(string $id): JsonResponse
{
try {
$deleted = $this->accessControlRepository->deleteRole((int) $id);
if (! $deleted) {
return response()->json([
'message' => 'Role non trouve.',
], 404);
}
return response()->json([
'message' => 'Role supprime avec succes.',
]);
} catch (\Exception $e) {
Log::error('Error deleting role: ' . $e->getMessage(), [
'exception' => $e,
'role_id' => $id,
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la suppression du role.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
public function syncRolePermissions(Request $request, string $id): JsonResponse
{
$validated = $request->validate([
'permissions' => ['required', 'array'],
'permissions.*' => ['string', 'max:150'],
]);
try {
$role = $this->accessControlRepository->syncRolePermissions((int) $id, $validated['permissions']);
if (! $role) {
return response()->json([
'message' => 'Role non trouve.',
], 404);
}
return response()->json([
'data' => $role,
'message' => 'Permissions du role synchronisees avec succes.',
]);
} catch (\Exception $e) {
Log::error('Error syncing role permissions: ' . $e->getMessage(), [
'exception' => $e,
'role_id' => $id,
'data' => $validated,
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la synchronisation des permissions du role.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
public function storePermission(Request $request): JsonResponse
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:150', 'unique:permissions,name'],
'guard_name' => ['nullable', 'string', 'max:50'],
]);
try {
$permission = $this->accessControlRepository->createPermission($validated);
return response()->json([
'data' => $permission,
'message' => 'Permission creee avec succes.',
], 201);
} catch (\Exception $e) {
Log::error('Error creating permission: ' . $e->getMessage(), [
'exception' => $e,
'data' => $validated,
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la creation de la permission.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
public function updatePermission(Request $request, string $id): JsonResponse
{
$validated = $request->validate([
'name' => ['sometimes', 'string', 'max:150', 'unique:permissions,name,' . $id],
'guard_name' => ['nullable', 'string', 'max:50'],
]);
try {
$permission = $this->accessControlRepository->updatePermission((int) $id, $validated);
if (! $permission) {
return response()->json([
'message' => 'Permission non trouvee.',
], 404);
}
return response()->json([
'data' => $permission,
'message' => 'Permission mise a jour avec succes.',
]);
} catch (\Exception $e) {
Log::error('Error updating permission: ' . $e->getMessage(), [
'exception' => $e,
'permission_id' => $id,
'data' => $validated,
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la mise a jour de la permission.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
public function destroyPermission(string $id): JsonResponse
{
try {
$deleted = $this->accessControlRepository->deletePermission((int) $id);
if (! $deleted) {
return response()->json([
'message' => 'Permission non trouvee.',
], 404);
}
return response()->json([
'message' => 'Permission supprimee avec succes.',
]);
} catch (\Exception $e) {
Log::error('Error deleting permission: ' . $e->getMessage(), [
'exception' => $e,
'permission_id' => $id,
]);
return response()->json([
'message' => 'Une erreur est survenue lors de la suppression de la permission.',
'error' => config('app.debug') ? $e->getMessage() : null,
], 500);
}
}
}