Files
biiproject-kit-v2/app/Http/Controllers/SystemSettingController.php
T

180 lines
7.3 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Setting;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Storage;
class SystemSettingController extends Controller
{
/**
* Display the system settings page.
*/
public function index()
{
abort_if(!auth()->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()
]);
}
}
}