Files
HRM-System/app/Services/StorageConfigService.php
2026-04-13 08:16:56 +08:00

205 lines
6.6 KiB
PHP

<?php
namespace App\Services;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class StorageConfigService
{
private static $config = null;
/**
* Get the active storage disk name
*/
public static function getActiveDisk(): string
{
$userId = Auth::id();
if (!$userId) {
return 'public'; // Default for unauthenticated users
}
$cacheKey = 'active_storage_config';
$config = Cache::remember($cacheKey, 300, function () use ($userId) {
return self::loadStorageConfigFromDB($userId);
});
return $config['disk'] ?? 'public';
}
/**
* Get file validation rules based on settings
*/
public static function getFileValidationRules(): array
{
$config = self::getStorageConfig();
$allowedTypes = $config['allowed_file_types'] ?? '';
$maxSize = ($config['max_file_size_mb'] ?? 2) * 1024; // Convert MB to KB
return [
'mimes:' . $allowedTypes,
'max:' . $maxSize
];
}
/**
* Get complete storage configuration
*/
public static function getStorageConfig(): array
{
try {
// Check if user is authenticated
if (!Auth::check() || !Auth::user()) {
return self::getDefaultConfig();
}
$user = Auth::user();
$userId = null;
// Check if isSaaS function exists and handle accordingly
if (isSaaS()) {
if ($user->type === 'superadmin') {
$userId = $user->id;
} else {
$userId = $user->created_by ?? null;
}
} else {
if ($user->type === 'company') {
$userId = $user->id;
} else {
$userId = $user->created_by ?? null;
}
}
if (!$userId) {
return self::getDefaultConfig();
}
$cacheKey = 'active_storage_config_' . $userId;
// return Cache::remember($cacheKey, 300, function () use ($userId) {
return self::loadStorageConfigFromDB($userId);
// });
} catch (\Exception $e) {
\Log::error('Error in getStorageConfig', ['error' => $e->getMessage()]);
return self::getDefaultConfig();
}
}
/**
* Clear storage configuration cache
*/
public static function clearCache(): void
{
Cache::forget('active_storage_config');
Cache::forget('admin_settings');
}
/**
* Load storage configuration from database
*/
private static function loadStorageConfigFromDB($userId = null): array
{
try {
if (!$userId) {
return self::getDefaultConfig();
}
$settings = DB::table('settings')
->where('user_id', $userId)
->whereIn('key', [
'storage_type',
'storage_file_types',
'storage_max_upload_size',
'aws_access_key_id',
'aws_secret_access_key',
'aws_default_region',
'aws_bucket',
'aws_url',
'aws_endpoint',
'wasabi_access_key',
'wasabi_secret_key',
'wasabi_region',
'wasabi_bucket',
'wasabi_url',
'wasabi_root'
])
->pluck('value', 'key')
->toArray();
// Map storage_type to correct disk name
if (isSaaS()) {
$superAdmin = User::where('type', 'superadmin')->first();
if ($superAdmin) {
$superAdminSettings = DB::table('settings')->where('user_id', $superAdmin->id)->whereIn('key', [
'storage_file_types',
'storage_max_upload_size'
])
->pluck('value', 'key')
->toArray();
}
} else {
$superAdmin = User::where('type', 'company')->first();
if ($superAdmin) {
$superAdminSettings = DB::table('settings')->where('user_id', $superAdmin->id)->whereIn('key', [
'storage_file_types',
'storage_max_upload_size'
])
->pluck('value', 'key')
->toArray();
}
}
$storageType = $settings['storage_type'] ?? 'local';
$diskName = match ($storageType) {
'local' => 'public',
'aws_s3' => 's3',
'wasabi' => 'wasabi',
default => 'public'
};
return [
'disk' => $diskName,
'allowed_file_types' => $superAdminSettings['storage_file_types'] ?? 'jpg,jpeg,png,webp,gif,pdf,doc,docx,csv,txt,zip,mp4,mp3',
'max_file_size_mb' => (int)($superAdminSettings['storage_max_upload_size'] ?? 2),
's3' => [
'key' => $settings['aws_access_key_id'] ?? '',
'secret' => $settings['aws_secret_access_key'] ?? '',
'bucket' => $settings['aws_bucket'] ?? '',
'region' => $settings['aws_default_region'] ?? 'us-east-1',
'url' => $settings['aws_url'] ?? '',
'endpoint' => $settings['aws_endpoint'] ?? '',
],
'wasabi' => [
'key' => $settings['wasabi_access_key'] ?? '',
'secret' => $settings['wasabi_secret_key'] ?? '',
'bucket' => $settings['wasabi_bucket'] ?? '',
'region' => $settings['wasabi_region'] ?? 'us-east-1',
'url' => $settings['wasabi_url'] ?? '',
'root' => $settings['wasabi_root'] ?? '',
]
];
} catch (\Exception $e) {
\Log::error('Failed to load storage config from DB', ['error' => $e->getMessage()]);
return self::getDefaultConfig();
}
}
/**
* Get default storage configuration
*/
private static function getDefaultConfig(): array
{
return [
'disk' => 'public',
'allowed_file_types' => 'jpg,png,webp,gif,png',
'max_file_size_mb' => 2,
's3' => [],
'wasabi' => []
];
}
}