Route downloads through controller; file IDs as hash to prevent guessing; download count; download list on airport page

This commit is contained in:
Nabeel Shahzad
2018-04-02 12:55:37 -05:00
parent 3ddee56359
commit 9e1e0142e9
8 changed files with 131 additions and 11 deletions

View File

@@ -13,15 +13,19 @@ class CreateFilesTable extends Migration
public function up()
{
Schema::create('files', function (Blueprint $table) {
$table->increments('id');
$table->string('id', \App\Interfaces\Model::ID_MAX_LENGTH);
$table->string('name');
$table->string('description')->nullable();
$table->string('disk')->nullable();
$table->string('path');
$table->boolean('public')->default(true);
$table->unsignedInteger('download_count')->default(0);
$table->string('ref_model', 50)->nullable();
$table->string('ref_model_id', 36)->nullable();
$table->timestamps();
$table->primary('id');
$table->index(['ref_model', 'ref_model_id']);
});
}

View File

@@ -57,7 +57,7 @@ class FilesController extends Controller
$asset->description = $attrs['file_description'];
$asset->disk = config('filesystems.public_files');
$asset->path = $file_path;
$asset->public = true;
$asset->public = false; // need to be logged in to see. default (for now)
$asset->ref_model = $attrs['ref_model'];
$asset->ref_model_id = $attrs['ref_model_id'];

View File

@@ -0,0 +1,47 @@
<?php
namespace App\Http\Controllers\Frontend;
use App\Interfaces\Controller;
use App\Models\File;
use Auth;
use Flash;
use Illuminate\Support\Facades\Storage;
/**
* Class FileController
* @package App\Http\Controllers\Frontend
*/
class FileController extends Controller
{
/**
* Show the application dashboard.
*/
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('app.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);
}
}

View File

@@ -4,23 +4,28 @@ namespace App\Models;
use App\Interfaces\Model;
use App\Models\Traits\HashIdTrait;
use App\Models\Traits\ReferenceTrait;
use Illuminate\Support\Facades\Storage;
/**
* File property
* @property string $name
* @property string $description
* @property string $disk
* @property string $path
* @property boolean $public
* @property int $download_count
* @property string $url
* @property string $filename
* @package App\Models
*/
class File extends Model
{
use HashIdTrait;
use ReferenceTrait;
protected $table = 'files';
public $incrementing = false;
protected $fillable = [
'name',
@@ -32,10 +37,42 @@ class File extends Model
'ref_model_id',
];
protected $casts = [
'public' => 'boolean',
];
public static $rules = [
'name' => 'required',
];
private $pathinfo;
/**
* Return the file extension
* @return string
*/
public function getExtensionAttribute(): string
{
if (!$this->pathinfo) {
$this->pathinfo = pathinfo($this->path);
}
return $this->pathinfo['extension'];
}
/**
* Get just the filename
* @return string
*/
public function getFilenameAttribute() :string
{
if (!$this->pathinfo) {
$this->pathinfo = pathinfo($this->path);
}
return $this->pathinfo['filename'].'.'.$this->pathinfo['extension'];
}
/**
* Get the full URL to this attribute
* @return string

View File

@@ -27,6 +27,9 @@ Route::group([
Route::get('airports/{id}', 'AirportController@show')->name('airports.show');
// Download a file
Route::get('files/{id}', 'FileController@show')->name('files.show');
Route::get('flights/bids', 'FlightController@bids')->name('flights.bids');
Route::get('flights/search', 'FlightController@search')->name('flights.search');
Route::resource('flights', 'FlightController');

View File

@@ -41,7 +41,6 @@ class CheckWx extends Widget
return $data;
});
if($data->results === 1) {
$data = $data->data[0];
} else {