Files
citrus-cms/resources/views/admin-ajax/document-permission-load.blade.php
2026-04-28 21:15:09 +03:00

141 lines
5.2 KiB
PHP

@php
use App\Models\DocumentManagerPermission;
use App\Services\DocumentManager\FolderCatalog;
$userLevel = $request->input('user_level', 'Admin');
if (!$userLevel) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'User level is required']);
exit;
}
try {
// Get all permissions for this user level
$allPermissions = DocumentManagerPermission::where('user_level', $userLevel)->get();
$catalogService = app(FolderCatalog::class);
$definedFolders = $catalogService->flattened();
$definedPaths = $definedFolders->pluck('path')->map(fn($path) => trim($path, '/'))->filter()->unique()->values();
// Start with catalog defined folders (in declared order)
$allFoldersCollection = collect($definedPaths->all());
// Get all folders from documents directory (not just from permissions)
$documentsPath = storage_path('documents');
$actualFolders = [];
// Debug: Check if path exists
if (!is_dir($documentsPath)) {
header('Content-Type: application/json');
echo json_encode([
'success' => false,
'message' => 'Documents directory not found at: ' . $documentsPath
]);
exit;
}
// Get system folder patterns from config for filtering when needed
$exactMatches = config('document-folders.system_patterns.exact', []);
$regexPatterns = config('document-folders.system_patterns.regex', []);
$items = scandir($documentsPath);
foreach ($items as $item) {
if ($item !== '.' && $item !== '..' && is_dir($documentsPath . '/' . $item)) {
// Filter system folders for non-admin users
if ($userLevel !== 'Admin') {
$isSystemFolder = in_array($item, $exactMatches);
if (!$isSystemFolder) {
foreach ($regexPatterns as $pattern) {
if (preg_match($pattern, $item)) {
$isSystemFolder = true;
break;
}
}
}
if ($isSystemFolder) {
continue; // Skip system folders for non-admin
}
}
// Add main folder
$actualFolders[] = $item;
// Check for subfolders (one level deep)
$subPath = $documentsPath . '/' . $item;
if (is_dir($subPath)) {
$subItems = scandir($subPath);
foreach ($subItems as $subItem) {
if ($subItem !== '.' && $subItem !== '..' && is_dir($subPath . '/' . $subItem)) {
if ($userLevel !== 'Admin') {
$target = $subItem;
$isSystemSub = in_array($target, $exactMatches);
if (!$isSystemSub) {
foreach ($regexPatterns as $pattern) {
if (preg_match($pattern, $target) || preg_match($pattern, $item . '/' . $target)) {
$isSystemSub = true;
break;
}
}
}
if ($isSystemSub) {
continue;
}
}
// Add subfolder with parent folder prefix
$actualFolders[] = $item . '/' . $subItem;
}
}
}
}
}
$actualCollection = collect($actualFolders)->unique()->values();
$extras = $actualCollection->diff($definedPaths)->sort()->values();
$allFoldersCollection = $allFoldersCollection->merge($extras)->unique();
if ($allFoldersCollection->isEmpty()) {
header('Content-Type: application/json');
echo json_encode([
'success' => false,
'message' => 'No folders are defined in the catalog or found on disk.'
]);
exit;
}
$allFolders = $allFoldersCollection->values()->all();
// Get permission types (2-tier system)
$permissionTypes = ['read', 'write'];
$permissions = [];
foreach ($allFolders as $folder) {
$permissions[$folder] = [];
foreach ($permissionTypes as $permissionType) {
$permission = $allPermissions->where('folder_path', $folder)
->where('permission_type', $permissionType)
->first();
if ($permission && $permission->is_allowed) {
$permissions[$folder][] = $permissionType;
}
}
}
header('Content-Type: application/json');
echo json_encode([
'success' => true,
'folders' => $allFolders,
'permissions' => $permissions,
'user_level' => $userLevel
]);
} catch (Exception $e) {
header('Content-Type: application/json');
echo json_encode([
'success' => false,
'message' => 'Error loading permissions: ' . $e->getMessage()
]);
}
@endphp