Files
animexe/app/Http/Controllers/Admin/SettingController.php
T
2026-07-14 00:01:48 +03:00

161 lines
5.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Mail\TestMail;
use App\Models\Setting;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Mail;
class SettingController extends Controller
{
public function index()
{
$settings = Setting::all()->keyBy('key');
return view('admin.settings.index', compact('settings'));
}
public function update(Request $request)
{
$data = $request->except(['_token', '_method', 'intro_video_file']);
// Checkbox keys: explicitly set to '0' when not present in request
$booleanKeys = [
'comments_enabled', 'comments_require_approval',
'intro_enabled', 'nav_show_messages',
'ai_auto_description', 'ai_auto_seo',
'premium_free_mode',
'ads_enabled',
];
foreach ($booleanKeys as $k) {
if (!array_key_exists($k, $data)) {
$data[$k] = '0';
}
}
foreach ($data as $key => $value) {
Setting::set($key, $value);
}
cache()->forget('premium_free_mode');
return back()->with('success', 'Ayarlar kaydedildi.');
}
/**
* Favicon yükle — public/favicon.{ext} olarak kaydet, setting'e yaz.
*/
public function uploadFavicon(Request $request)
{
$request->validate(['favicon_file' => 'required|file|mimes:png,ico,svg,jpg,jpeg|max:2048']);
$file = $request->file('favicon_file');
$ext = strtolower($file->getClientOriginalExtension()) ?: 'png';
$dest = public_path('favicon.' . $ext);
// Eski favicon dosyalarını temizle
foreach (['png', 'ico', 'svg', 'jpg', 'jpeg'] as $e) {
$old = public_path('favicon.' . $e);
if (file_exists($old) && $old !== $dest) @unlink($old);
}
$file->move(public_path(), 'favicon.' . $ext);
$url = '/favicon.' . $ext;
Setting::set('site_favicon', $url);
return back()->with('favicon_success', 'Favicon güncellendi.');
}
/**
* Intro videoyu BunnyCDN Storage'a yükle, URL'yi ayarlara kaydet.
*/
public function uploadIntro(Request $request)
{
$request->validate(['intro_video_file' => 'required|file|mimes:mp4,webm|max:204800']); // max 200MB
$zone = Setting::get('bunnycdn_zone');
$apiKey = Setting::get('bunnycdn_api_key');
$pullUrl = rtrim(Setting::get('bunnycdn_pull_url', ''), '/');
if (!$zone || !$apiKey || !$pullUrl) {
return back()->with('intro_error', 'Önce BunnyCDN ayarlarını kaydedin (Zone, API Key, Pull URL).');
}
$file = $request->file('intro_video_file');
$ext = $file->getClientOriginalExtension() ?: 'mp4';
$fileName = 'intro/site-intro.' . $ext;
$apiUrl = "https://storage.bunnycdn.com/{$zone}/{$fileName}";
$response = Http::withHeaders([
'AccessKey' => $apiKey,
'Content-Type' => $file->getMimeType(),
])->withBody(file_get_contents($file->getRealPath()), $file->getMimeType())
->put($apiUrl);
if (!$response->successful()) {
return back()->with('intro_error', 'BunnyCDN yükleme başarısız: ' . $response->status() . ' — ' . $response->body());
}
$cdnUrl = $pullUrl . '/' . $fileName;
Setting::set('intro_video_url', $cdnUrl, 'intro');
return back()->with('intro_success', 'Intro video yüklendi ve URL kaydedildi.');
}
public function testMail(Request $request)
{
$request->validate(['test_mail_to' => 'required|email'], [
'test_mail_to.required' => 'Alıcı e-posta adresi zorunludur.',
'test_mail_to.email' => 'Geçerli bir e-posta adresi girin.',
]);
// DB'deki ayarları runtime'da uygula
$keys = ['mail_host','mail_port','mail_username','mail_password',
'mail_from_address','mail_from_name','mail_encryption'];
$rows = Setting::whereIn('key', $keys)->pluck('value', 'key');
if (!$rows->get('mail_host')) {
return back()->with('mail_error', 'Önce SMTP ayarlarını kaydedin.');
}
$encryption = strtolower($rows->get('mail_encryption', 'tls'));
$port = (int) $rows->get('mail_port', 587);
Config::set('mail.mailers.smtp.host', $rows->get('mail_host'));
Config::set('mail.mailers.smtp.port', $port);
Config::set('mail.mailers.smtp.username', $rows->get('mail_username'));
Config::set('mail.mailers.smtp.password', $rows->get('mail_password'));
Config::set('mail.mailers.smtp.encryption', $encryption);
Config::set('mail.mailers.smtp.timeout', 15);
Config::set('mail.mailers.smtp.stream', [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
],
]);
Config::set('mail.from.address', $rows->get('mail_from_address'));
Config::set('mail.from.name', $rows->get('mail_from_name', config('app.name')));
Config::set('mail.default', 'smtp');
Mail::purge('smtp');
// Socket timeout — PHP default 60s, düşür
$prevTimeout = ini_get('default_socket_timeout');
ini_set('default_socket_timeout', '15');
set_time_limit(30);
try {
Mail::to($request->test_mail_to)->send(new TestMail());
ini_set('default_socket_timeout', $prevTimeout);
return back()->with('mail_success', 'Test e-postası başarıyla gönderildi → ' . $request->test_mail_to);
} catch (\Throwable $e) {
ini_set('default_socket_timeout', $prevTimeout);
return back()->with('mail_error', 'Gönderi başarısız: ' . $e->getMessage());
}
}
}