Deathgarden_Rebirth-Rewrite/dist/app/Http/Controllers/Api/PatchController.php
Shaggy84675 d006695e25 Add file history to pak manager to better handle the patches
Signed-off-by: Shaggy84675 <admin@RainbowShaggy.com>
2025-08-03 21:59:31 +02:00

104 lines
3.9 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Enums\Launcher\Patchline;
use App\Http\Controllers\Controller;
use App\Models\GameFile;
use Auth;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class PatchController extends Controller
{
public function getFileWithPatchline(string $patchlineName, string $hash) : BinaryFileResponse|JsonResponse
{
$patchline = Patchline::tryFromName(str($patchlineName)->upper());
$gameFile = GameFile::select(['filename'])->wherePatchline($patchline)->whereHash($hash)->latest()->first();
$disk = Storage::disk('patches');
if($gameFile === null)
return response()->json('File not found', 404);
$filePath = DIRECTORY_SEPARATOR . str($patchlineName)->lower() . DIRECTORY_SEPARATOR . $gameFile->filename;
if (!$disk->exists($filePath)) {
return response()->json('File not found', 404);
}
return response()->download($disk->path($filePath));
}
function getFile(string $hash) : BinaryFileResponse|JsonResponse {
return $this->getFileWithPatchline(Patchline::LIVE->name, $hash);
}
public function getGameFileList(?string $patchlineName = null) : JsonResponse
{
$patchline = Patchline::tryFromName(str($patchlineName)->upper()) ?? Patchline::LIVE;
if (!$patchline) {
return response()->json(['error' => 'Invalid patchline'], 404);
}
$neededRole = $patchline->getNeededRole();
if ($neededRole !== null && ( !Auth::check() || !Auth::user()->hasRole($neededRole->value))) {
return response()->json(['error' => 'Unauthorized'], 401);
}
$gameFiles = GameFile::where('patchline', $patchline->value)
->where('is_additional', 0)
->withFileHistory()
->map(function ($latestFile) {
$processedHashes = [];
$history = collect();
foreach ($latestFile->children as $historyFile) {
if (in_array($historyFile->hash, $processedHashes)) {
continue;
}
$processedHashes[] = $historyFile->hash;
$history->push($historyFile->only(['hash']));
}
$selectedFile = $latestFile->only(['filename', 'hash', 'game_path', 'action']);
$selectedFile['history'] = $history;
return $selectedFile;
});
if (count($gameFiles) <= 0)
return response()->json(['error' => 'No files found'], 404);
return response()->json($gameFiles, 200);
}
public function getGameModFileList(?string $patchlineName = null) : JsonResponse
{
$patchline = Patchline::tryFromName(str($patchlineName)->upper()) ?? Patchline::LIVE;
if (!$patchline) {
return response()->json(['error' => 'Invalid patchline'], 404);
}
$neededRole = $patchline->getNeededRole();
if ($neededRole !== null && ( !Auth::check() || !Auth::user()->hasRole($neededRole->value))) {
return response()->json(['error' => 'Unauthorized'], 401);
}
$gameFiles = GameFile::select(['name', 'description', 'filename', 'hash', 'game_path', 'action'])
->where('patchline', $patchline->value)
->where('is_additional', 1)->latest()->get();
if (count($gameFiles) <= 0)
return response()->json(['error' => 'No files found'], 404);
return response()->json($gameFiles, 200);
}
}