Initial commit: Animexe Laravel platform

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 00:01:48 +03:00
co-authored by Claude Opus 4.8
commit a63515cfc6
366 changed files with 74773 additions and 0 deletions
@@ -0,0 +1,160 @@
<?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());
}
}
}