3cc5ca2c32
* DownloadController Improvements Added multiple airline support to both Aircraft and Subfleet downloads, if the user has more than one active airline downloads will display the airline name before the object name. Also sorted the returned results to have a better look at the blade. * Trying to pass broken UnitTest Please do fix the UnitTest, this pr has nothing to do with units but still being tested with it and failing.
105 lines
3.1 KiB
PHP
105 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Frontend;
|
|
|
|
use App\Contracts\Controller;
|
|
use App\Models\Airline;
|
|
use App\Models\File;
|
|
use Auth;
|
|
use Flash;
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
/**
|
|
* Class DownloadController
|
|
*/
|
|
class DownloadController extends Controller
|
|
{
|
|
/**
|
|
* Show all of the available files
|
|
*/
|
|
public function index()
|
|
{
|
|
$airlines = Airline::where('active', 1)->count();
|
|
$files = File::orderBy('ref_model', 'asc')->get();
|
|
|
|
/**
|
|
* Group all the files but compound the model with the ID,
|
|
* since we can have multiple files for every `ref_model`
|
|
*/
|
|
$grouped_files = $files->groupBy(function ($item, $key) {
|
|
return $item['ref_model'].'_'.$item['ref_model_id'];
|
|
});
|
|
|
|
/**
|
|
* The $group here looks like: App\Models\Airport_KAUS
|
|
* Split it into the $class and $id, and then change the
|
|
* name of the group to the object instance "name"
|
|
*/
|
|
$regrouped_files = [];
|
|
foreach ($grouped_files as $group => $files) {
|
|
[$class, $id] = explode('_', $group);
|
|
$klass = new $class();
|
|
$obj = $klass->find($id);
|
|
|
|
$category = explode('\\', $class);
|
|
$category = end($category);
|
|
|
|
if ($category == 'Aircraft' && $airlines > 1) {
|
|
$group_name = $category.' > '.$obj->subfleet->airline->name.' '.$obj->icao.' '.$obj->registration;
|
|
} elseif ($category == 'Aircraft') {
|
|
$group_name = $category.' > '.$obj->icao.' '.$obj->registration;
|
|
} elseif ($category == 'Airport') {
|
|
$group_name = $category.' > '.$obj->icao.' : '.$obj->name.' ('.$obj->country.')';
|
|
} elseif ($category == 'Subfleet' && $airlines > 1) {
|
|
$group_name = $category.' > '.$obj->airline->name.' '.$obj->name;
|
|
} else {
|
|
$group_name = $category.' > '.$obj->name;
|
|
}
|
|
|
|
$regrouped_files[$group_name] = $files;
|
|
}
|
|
|
|
ksort($regrouped_files, SORT_STRING);
|
|
|
|
return view('downloads.index', [
|
|
'grouped_files' => $regrouped_files,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Show the application dashboard
|
|
*
|
|
* @param string $id
|
|
*
|
|
* @return mixed
|
|
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Symfony\Component\HttpFoundation\StreamedResponse
|
|
*/
|
|
public function show($id)
|
|
{
|
|
/**
|
|
* @var File $file
|
|
*/
|
|
$file = File::find($id);
|
|
if (!$file) {
|
|
Flash::error('File doesn\'t exist');
|
|
return redirect()->back();
|
|
}
|
|
|
|
// Allowed to download? If not, direct to login
|
|
if (!$file->public && !Auth::check()) {
|
|
return redirect(config('phpvms.login_redirect'));
|
|
}
|
|
|
|
$file->download_count++;
|
|
$file->save();
|
|
|
|
if ($file->disk === 'public') {
|
|
$storage = Storage::disk('public');
|
|
return $storage->download($file->path, $file->filename);
|
|
}
|
|
|
|
// TODO: Config for streamed response?
|
|
return redirect()->to($file->url);
|
|
}
|
|
}
|