Proje dosyaları eklendi

This commit is contained in:
2026-08-29 15:53:53 +03:00
commit d3313400ca
440 changed files with 24827 additions and 0 deletions
+52
View File
@@ -0,0 +1,52 @@
<?php
namespace App\Support;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
final class AuthenticatedRedirect
{
private const UNSAFE = ['/', '/login', '/admin/login', '/logout', '/register', '/forgot-password', '/reset-password', '/locale'];
/**
* Müşteri giriş adresinden doğrulanan kullanıcıyı müşteri paneline yönlendirir.
*
* Kullanıcının ek yönetim rolleri hedef paneli değiştirmez; panel bağlamını
* kimlik doğrulamasının başlatıldığı giriş adresi belirler.
*
* @return string Müşteri kontrol panelinin göreli adresi.
*
* @author Gökhan Engin - İletişim : https://bit.ly/YazılımUzmanı
*/
public function landing(): string
{
return route('dashboard', absolute: false);
}
public function intended(Request $r): ?string
{
$value = $r->session()->pull('url.intended');
if (! is_string($value) || $value === '') {
return null;
}$parts = parse_url($value);
if ($parts === false) {
return null;
}if (isset($parts['host'])) {
$port = $parts['port'] ?? (($parts['scheme'] ?? '') === 'https' ? 443 : 80);
if (($parts['scheme'] ?? null) !== $r->getScheme() || $parts['host'] !== $r->getHost() || $port !== $r->getPort()) {
return null;
}$value = ($parts['path'] ?? '/').(isset($parts['query']) ? '?'.$parts['query'] : '');
}$decoded = $value;
for ($i = 0; $i < 3; $i++) {
$decoded = rawurldecode($decoded);
}if (! str_starts_with($decoded, '/') || str_starts_with($decoded, '//') || Str::contains($decoded, ["\r", "\n", '\\'])) {
return null;
}$path = '/'.ltrim((string) parse_url($decoded, PHP_URL_PATH), '/');
if (in_array(rtrim($path, '/') ?: '/', self::UNSAFE, true) || str_starts_with($path, '/admin')) {
return null;
}
return $value;
}
}
+3
View File
@@ -0,0 +1,3 @@
<?php
namespace App\Support;
final class KeywordTargetOptions{public const COUNTRIES=['TR'=>'Türkiye','DE'=>'Germany','US'=>'United States','GB'=>'United Kingdom'];public const LANGUAGES=['tr'=>'Türkçe','de'=>'Deutsch','en'=>'English'];public const COUNTRY_LANGUAGES=['TR'=>['tr','en'],'DE'=>['tr','de','en'],'US'=>['en'],'GB'=>['en']];public static function countries():array{return self::COUNTRIES;}public static function languages():array{return self::LANGUAGES;}public static function supports(string $country,string $language):bool{return in_array(strtolower($language),self::COUNTRY_LANGUAGES[strtoupper($country)]??[],true);}}
+8
View File
@@ -0,0 +1,8 @@
<?php
namespace App\Support;
final readonly class NormalizedProjectUrl
{
public function __construct(public string $domain, public string $url) {}
}
+28
View File
@@ -0,0 +1,28 @@
<?php
namespace App\Support;
use App\Models\User;
use Illuminate\Http\Request;
final class PortalNavigationContext
{
public function resolve(Request $request): array
{
$webUser = auth('web')->user();
$earnMember = auth('earn')->user();
$isEarnContext = $request->routeIs('earn.*');
if ($isEarnContext && $earnMember) {
return ['kind' => 'earn', 'user' => $earnMember, 'panel_url' => route('earn.dashboard'), 'panel_label' => __('earn_portal.dashboard'), 'logout_route' => route('earn.logout')];
}
if (! $isEarnContext && $webUser instanceof User) {
$admin = $webUser->canAccessAdminPortal();
return ['kind' => 'web', 'user' => $webUser, 'panel_url' => $admin ? '/admin' : route('dashboard'), 'panel_label' => $admin ? __('landing.admin_panel') : __('landing.customer_panel'), 'logout_route' => route('logout')];
}
return ['kind' => 'guest', 'user' => null];
}
}
+18
View File
@@ -0,0 +1,18 @@
<?php
namespace App\Support;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
final class PortalSession
{
public function terminate(Request $request): void
{
$locale = app()->getLocale();
Auth::guard('web')->logout();
$request->session()->regenerate();
$request->session()->regenerateToken();
$request->session()->put('locale', $locale);
}
}