mirror of
https://github.com/Deathgarden-Rebirth/Deathgarden_Rebirth-Rewrite.git
synced 2026-03-21 18:04:46 -05:00
104 lines
3.9 KiB
PHP
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);
|
|
}
|
|
}
|