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); } }