feat: add app and database modules

This commit is contained in:
2026-05-21 16:05:11 +07:00
parent 37b7e783f5
commit fad70d096b
212 changed files with 23901 additions and 0 deletions
@@ -0,0 +1,175 @@
<?php
namespace App\Providers;
use App\Services\MobileConfig\MobileConfigService;
use App\Services\SystemConfig\SystemConfigService;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\ServiceProvider;
class SystemConfigServiceProvider extends ServiceProvider
{
/**
* Register services.
*/
public function register(): void
{
$this->app->singleton(SystemConfigService::class);
}
/**
* Bootstrap services.
*/
public function boot(): void
{
// 1. Ensure settings helper is loaded
$helper = app_path('Helpers/SettingsHelper.php');
if (file_exists($helper)) {
require_once $helper;
}
/** @var SystemConfigService $systemConfig */
$systemConfig = $this->app->make(SystemConfigService::class);
// 2. Localization
$locale = $systemConfig->get('default_locale', 'en');
app()->setLocale($locale);
// Sync app.name globally so mail sender name, document title etc. use DB value
config(['app.name' => $systemConfig->get('app_name', config('app.name'))]);
// 3. Performance: Only run config overrides if not in console (optional, but speeds up Artisan)
// or prioritize based on current context
// Apply timezone globally from settings
$timezone = $systemConfig->get('regional_timezone', 'Asia/Jakarta');
config(['app.timezone' => $timezone]);
date_default_timezone_set($timezone);
// HTTPS Enforcement
if ($systemConfig->get('force_https', false)) {
URL::forceScheme('https');
}
// CORS Dynamic Configuration
config([
'cors.allowed_origins' => array_filter(array_map('trim', explode(',', $systemConfig->get('cors_origins', '*')))),
'cors.allowed_methods' => array_filter(array_map('trim', explode(',', $systemConfig->get('cors_methods', '*')))),
'cors.allowed_headers' => array_filter(array_map('trim', explode(',', $systemConfig->get('cors_headers', '*')))),
]);
// Apply Captcha Config
config([
'captcha.sitekey' => $systemConfig->get('captcha_site_key'),
'captcha.secret' => $systemConfig->get('captcha_secret_key'),
'captcha.options' => [
'timeout' => 30,
],
]);
// Unified Social Login Callback Base
$callbackUrl = $systemConfig->get('social_login_callback_url', '/auth/callback');
// Apply Socialite Config
config([
'services.google' => [
'client_id' => $systemConfig->get('google_client_id'),
'client_secret' => $systemConfig->get('google_client_secret'),
'redirect' => url($callbackUrl),
],
'services.facebook' => [
'client_id' => $systemConfig->get('facebook_app_id'),
'client_secret' => $systemConfig->get('facebook_app_secret'),
'redirect' => url($callbackUrl),
],
'services.github' => [
'client_id' => $systemConfig->get('github_client_id'),
'client_secret' => $systemConfig->get('github_client_secret'),
'redirect' => url($callbackUrl),
],
]);
// Apply Session Configuration
config([
'session.driver' => $systemConfig->get('session_driver', 'file'),
'session.lifetime' => $systemConfig->get('session_lifetime', 120),
'session.secure' => $systemConfig->get('session_secure_cookie', false),
'session.encrypt' => $systemConfig->get('session_encrypt', false),
'session.remember' => $systemConfig->get('session_remember_me_duration', 30) * 1440, // Days to Minutes
]);
config(['auth.passwords.users.expire' => $systemConfig->get('password_reset_link_expiry', 60)]);
// 7. DYNAMIC MAIL CONFIGURATION
if ($systemConfig->get('mail_host')) {
config([
'mail.default' => $systemConfig->get('mail_driver', 'smtp'),
'mail.mailers.smtp.host' => $systemConfig->get('mail_host'),
'mail.mailers.smtp.port' => $systemConfig->get('mail_port', 587),
'mail.mailers.smtp.encryption' => $systemConfig->get('mail_encryption', 'tls'),
'mail.mailers.smtp.username' => $systemConfig->get('mail_username'),
'mail.mailers.smtp.password' => $systemConfig->get('mail_password'),
'mail.from.address' => $systemConfig->get('mail_from_address', 'noreply@example.com'),
'mail.from.name' => $systemConfig->get('mail_from_name', config('app.name')),
]);
// If using smtp transport specifically
}
// 8. DYNAMIC BACKUP CONFIGURATION (Spatie Backup)
if ($systemConfig->get('backup_db_enabled')) {
$driver = $systemConfig->get('backup_db_driver', 'local');
config([
'backup.backup.destination.disks' => [$driver],
'backup.monitor_backups.0.disks' => [$driver],
'backup.cleanup.default_strategy.keep_all_backups_for_days' => (int) $systemConfig->get('backup_db_retention', 7),
]);
// Encryption
if ($systemConfig->get('backup_db_encrypt') && $systemConfig->get('backup_db_encrypt_key')) {
config([
'backup.backup.password' => $systemConfig->get('backup_db_encrypt_key'),
'backup.backup.encryption' => 'aes256',
]);
} else {
config([
'backup.backup.password' => null,
'backup.backup.encryption' => 'none',
]);
}
// Exclude Tables (Injected via database config dump key)
if ($excludeTables = $systemConfig->get('backup_db_exclude')) {
$tables = array_map('trim', explode(',', $excludeTables));
$dbDriver = config('database.default');
config(["database.connections.{$dbDriver}.dump.exclude_tables" => $tables]);
}
// Notifications
$notifyTo = $systemConfig->get('backup_db_notify_to');
if ($notifyTo) {
if (filter_var($notifyTo, FILTER_VALIDATE_EMAIL)) {
config(['backup.notifications.mail.to' => $notifyTo]);
} elseif (str_starts_with($notifyTo, 'http')) {
config(['backup.notifications.notifications.webhook.url' => $notifyTo]);
}
}
}
// 9. DYNAMIC MOBILE AUTH CONFIGURATION
$mobileConfig = $this->app->make(MobileConfigService::class);
$allMobile = $mobileConfig->all();
if ($ttl = ($allMobile['security_auth']['token_ttl_minutes'] ?? null)) {
config(['sanctum.expiration' => (int) $ttl]);
}
// 3. View Sharing (Cached for request duration)
view()->share($systemConfig->getPublicSettings());
// 4. Pulse Access Gate
Gate::define('viewPulse', function ($user) {
return $user->can('view pulse');
});
}
}