user()->hasRole('super-admin'), 403, 'Unauthorized. Super-Admin only.'); $settings = Setting::all()->pluck('value', 'key'); $defaultSettings = [ 'app_name' => 'biiproject kit v2', 'app_logo' => null, 'app_logo_text' => 'BK', 'app_description' => 'Enterprise Admin Platform', 'allow_registration' => '1', 'require_email_verification' => '0', 'password_minimum_length' => '8', 'password_require_symbols' => '0', 'password_require_numbers' => '0', 'password_require_mixed_case' => '0', // OAuth 'oauth_google_enabled' => '0', 'oauth_google_client_id' => '', 'oauth_google_client_secret' => '', 'oauth_github_enabled' => '0', 'oauth_github_client_id' => '', 'oauth_github_client_secret' => '', // SMTP 'mail_host' => 'smtp.mailtrap.io', 'mail_port' => '2525', 'mail_username' => '', 'mail_password' => '', 'mail_encryption' => 'tls', 'mail_from_address' => 'hello@biiproject.com', 'mail_from_name' => 'biiproject kit Admin', 'primary_color' => '#6366f1', // Mobile App Control 'android_latest_version' => '1.0.0', 'android_min_version' => '1.0.0', 'android_maintenance_mode' => '0', 'android_playstore_url' => '', ]; $mergedSettings = array_merge($defaultSettings, $settings->toArray()); return Inertia::render('SystemSettings/Index', [ 'settings' => $mergedSettings, ]); } /** * Update the system settings. */ public function update(Request $request) { abort_if(!auth()->user()->hasRole('super-admin'), 403, 'Unauthorized. Super-Admin only.'); $validated = $request->validate([ 'settings' => 'required|array', 'settings.app_name' => 'required|string|max:255', 'settings.app_logo_text' => 'required|string|max:3', 'settings.app_description' => 'nullable|string', 'settings.allow_registration' => 'boolean', 'settings.require_email_verification' => 'boolean', 'settings.password_minimum_length' => 'integer|min:8', 'settings.password_require_symbols' => 'boolean', 'settings.password_require_numbers' => 'boolean', 'settings.password_require_mixed_case' => 'boolean', 'settings.oauth_google_enabled' => 'boolean', 'settings.oauth_google_client_id' => 'nullable|string', 'settings.oauth_google_client_secret' => 'nullable|string', 'settings.oauth_github_enabled' => 'boolean', 'settings.oauth_github_client_id' => 'nullable|string', 'settings.oauth_github_client_secret' => 'nullable|string', 'settings.mail_host' => 'nullable|string', 'settings.mail_port' => 'nullable|string', 'settings.mail_username' => 'nullable|string', 'settings.mail_password' => 'nullable|string', 'settings.mail_encryption' => 'nullable|string', 'settings.mail_from_address' => 'nullable|email', 'settings.mail_from_name' => 'nullable|string', 'settings.primary_color' => 'required|string', // Mobile App Control 'settings.android_latest_version' => 'nullable|string', 'settings.android_min_version' => 'nullable|string', 'settings.android_maintenance_mode' => 'boolean', 'settings.android_playstore_url' => 'nullable|url', 'logo_file' => 'nullable|image|max:2048', ]); $settings = $validated['settings']; if ($request->hasFile('logo_file')) { $path = $request->file('logo_file')->store('branding', 'public'); $logoUrl = Storage::url($path); Setting::updateOrCreate(['key' => 'app_logo'], ['value' => $logoUrl, 'type' => 'string']); } foreach ($settings as $key => $value) { Setting::updateOrCreate( ['key' => $key], ['value' => (string) $value, 'type' => is_bool($value) ? 'boolean' : (is_int($value) ? 'integer' : 'string')] ); } Cache::forget('system_settings'); return back()->with('success', 'System configurations updated successfully.'); } /** * Send a test email using SMTP details from the request. */ public function testEmail(Request $request) { abort_if(!auth()->user()->hasRole('super-admin'), 403, 'Unauthorized. Super-Admin only.'); $request->validate([ 'recipient' => 'required|email', 'mail_host' => 'nullable|string', 'mail_port' => 'nullable|string', 'mail_username' => 'nullable|string', 'mail_password' => 'nullable|string', 'mail_encryption' => 'nullable|string', 'mail_from_address' => 'nullable|email', 'mail_from_name' => 'nullable|string', ]); try { // Apply SMTP settings at runtime config([ 'mail.default' => 'smtp', 'mail.mailers.smtp.transport' => 'smtp', 'mail.mailers.smtp.host' => $request->input('mail_host'), 'mail.mailers.smtp.port' => $request->input('mail_port'), 'mail.mailers.smtp.username' => $request->input('mail_username'), 'mail.mailers.smtp.password' => $request->input('mail_password'), 'mail.mailers.smtp.encryption' => $request->input('mail_encryption') ?: 'tls', 'mail.from.address' => $request->input('mail_from_address'), 'mail.from.name' => $request->input('mail_from_name'), ]); \Illuminate\Support\Facades\Mail::raw("Halo!\n\nIni adalah email uji coba (test email) dari sistem biiskit.\n\nJika Anda menerima email ini, berarti konfigurasi SMTP Anda berfungsi dengan baik!\n\nDetail Konfigurasi:\n- Host: " . ($request->input('mail_host') ?: '-') . "\n- Port: " . ($request->input('mail_port') ?: '-') . "\n- Sender: " . ($request->input('mail_from_address') ?: '-') . "\n\nSalam,\nAdmin biiskit", function ($message) use ($request) { $message->to($request->input('recipient')) ->subject("Uji Coba Konfigurasi SMTP - biiskit"); }); return response()->json([ 'success' => true, 'message' => 'Email uji coba telah berhasil dikirim ke ' . $request->input('recipient') ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Gagal mengirim email uji coba. Error: ' . $e->getMessage() ]); } } }