Initial commit

This commit is contained in:
root
2026-05-09 17:28:23 +02:00
commit 9d73f82529
5575 changed files with 281989 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
<?php
namespace App\Http\Controllers\Miscellaneous;
use App\Http\Controllers\Controller;
use App\Models\Articles\WebsiteArticle;
use App\Models\Miscellaneous\CameraWeb;
use Illuminate\Support\Facades\Cache;
use Illuminate\View\View;
class HomeController extends Controller
{
public function __invoke(): View
{
$articles = Cache::remember('home_articles', 300, fn () => WebsiteArticle::with(['user:id,username,look'])
->latest('id')
->take(4)
->get());
$photos = Cache::remember('home_photos', 300, fn () => CameraWeb::query()
->where('visible', true)
->latest('id')
->take(4)
->with('user:id,username,look')
->get());
return view('index', [
'articles' => $articles,
'photos' => $photos,
]);
}
}
@@ -0,0 +1,118 @@
<?php
namespace App\Http\Controllers\Miscellaneous;
use App\Http\Controllers\Controller;
use App\Models\Miscellaneous\WebsiteInstallation;
use App\Models\Miscellaneous\WebsiteSetting;
use App\Rules\ValidateInstallationKeyRule;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
class InstallationController extends Controller
{
public function index()
{
return view('installation.index');
}
public function storeInstallationKey(Request $request)
{
$request->validate([
'installation_key' => ['required', 'string', 'max:255', new ValidateInstallationKeyRule],
]);
WebsiteInstallation::first()->update([
'step' => 1,
'user_ip' => $request->ip(),
]);
return to_route('installation.show-step', 1);
}
public function showStep($currentStep)
{
$settings = $this->getSettingsForStep((int) $currentStep);
return view('installation.step-' . $currentStep, [
'settings' => $settings,
]);
}
public function saveStepSettings(Request $request)
{
$this->updateSettings($request);
WebsiteInstallation::first()->increment('step');
return to_route('installation.show-step', WebsiteInstallation::first()->step);
}
public function previousStep()
{
WebsiteInstallation::first()->decrement('step');
return to_route('installation.show-step', WebsiteInstallation::first()->step);
}
public function restartInstallation()
{
WebsiteInstallation::first()->update([
'step' => 0,
'installation_key' => Str::uuid(),
'user_ip' => null,
]);
WebsiteSetting::where('key', 'theme')->update([
'value' => 'atom',
]);
return to_route('installation.index');
}
public function completeInstallation()
{
// Clear all caches before marking as complete
Cache::forget('website_permissions');
Cache::forget('website_settings');
// Mark installation as complete
WebsiteInstallation::latest()->first()->update([
'completed' => true,
]);
return to_route('welcome');
}
private function updateSettings(Request $request): void
{
foreach ($request->except('_token') as $key => $value) {
WebsiteSetting::where('key', '=', $key)->update([
'value' => $value ?? '',
]);
}
// Cache will be automatically cleared by WebsiteSetting model events
}
private function getSettingsForStep(int $step)
{
$settingsData = array_chunk(WebsiteSetting::all()->pluck('key')->toArray(), (int) ceil(WebsiteSetting::count() / 4));
$settings = match ($step) {
1 => $settingsData[0] ?? [],
2 => $settingsData[1] ?? [],
3 => $settingsData[2] ?? [],
4 => $settingsData[3] ?? [],
5 => [], // Completion step has no settings
default => throw new Exception('Step does not exist'),
};
return WebsiteSetting::query()
->whereIn('key', $settings)
->select(['key', 'value', 'comment'])
->get();
}
}
+24
View File
@@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\Miscellaneous;
use App\Http\Controllers\Controller;
use App\Models\Miscellaneous\WebsiteLanguage;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;
class LocaleController extends Controller
{
public function __invoke(string $locale): RedirectResponse
{
if (! WebsiteLanguage::where('country_code', $locale)->exists()) {
return redirect()->back()->withErrors(['message' => __('The language selected is not supported')]);
}
App::setLocale($locale);
Session::put('locale', $locale);
return redirect()->back();
}
}
@@ -0,0 +1,36 @@
<?php
namespace App\Http\Controllers\Miscellaneous;
use App\Http\Controllers\Controller;
use App\Models\Miscellaneous\WebsiteSetting;
use Illuminate\Http\Request;
class LogoGeneratorController extends Controller
{
public function index()
{
if (! hasPermission('generate_logo')) {
return to_route('me.show')->with([
'message' => __('You do not have permission to do this.'),
]);
}
return view('logo-generator');
}
public function store(Request $request)
{
$request->validate(['logo' => 'required|image|mimes:jpeg,png,gif,webp|max:5120']);
$path = $request->file('logo')->store('generated-logos', 'public');
$setting = WebsiteSetting::where('key', 'cms_logo')->first();
$setting?->update([
'value' => '/storage/' . $path,
]);
return response()->json(['success' => true, 'message' => 'Logo updated!']);
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers\Miscellaneous;
use App\Http\Controllers\Controller;
use App\Models\Miscellaneous\WebsiteMaintenanceTask;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\Schema;
use Illuminate\View\View;
use Throwable;
class MaintenanceController extends Controller
{
public function __invoke(): View
{
$tasks = new LengthAwarePaginator([], 0, 5);
try {
if (Schema::hasTable('website_maintenance_tasks')) {
$tasks = WebsiteMaintenanceTask::with('user:id,username,look')->simplePaginate(5);
}
} catch (Throwable) {
$tasks = new LengthAwarePaginator([], 0, 5);
}
return view('maintenance', [
'tasks' => $tasks,
]);
}
}