diff --git a/app/Database/migrations/2018_04_01_193443_create_files_table.php b/app/Database/migrations/2018_04_01_193443_create_files_table.php new file mode 100644 index 00000000..8cb64c94 --- /dev/null +++ b/app/Database/migrations/2018_04_01_193443_create_files_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->string('name'); + $table->string('description')->nullable(); + $table->string('path'); + $table->boolean('public')->default(true); + $table->string('ref_model', 50)->nullable(); + $table->string('ref_model_id', 36)->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('files'); + } +} diff --git a/app/Http/Controllers/Admin/FilesController.php b/app/Http/Controllers/Admin/FilesController.php new file mode 100644 index 00000000..30ce0c95 --- /dev/null +++ b/app/Http/Controllers/Admin/FilesController.php @@ -0,0 +1,88 @@ +post(); + + Log::info('Uploading files', $attrs); + + /** + * @var $file \Illuminate\Http\UploadedFile + */ + $file = $request->file('file'); + $file_path = $file->storeAs( + 'files', + $file->getClientOriginalName(), + config('filesystems.public_files') + ); + + $asset = new File(); + $asset->name = $attrs['name']; + $asset->path = $file_path; + $asset->public = true; + $asset->ref_model = $attrs['ref_model']; + $asset->ref_model_id = $attrs['ref_model_id']; + + $asset->save(); + + /*foreach($files as $file) { + $file_path = $file->store('files', $file->getClientOriginalName(), 'public'); + }*/ + + # Where do we go now? OooOOoOoOo sweet child + $redirect = $attrs['redirect']; + if(!$redirect) { + $redirect = route('admin.dashboard.index'); + } + + Flash::success('Files uploaded successfully.'); + return redirect($redirect); + } + + /** + * Remove the file from storage. + * @param Request $request + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \Exception + */ + public function delete($id, Request $request) + { + $redirect = $request->post('redirect'); + if (!$redirect) { + $redirect = route('admin.dashboard.index'); + } + + $file = File::find($id); + if (!$file) { + Flash::error('File doesn\'t exist'); + return redirect($redirect); + } + + Storage::disk(config('filesystems.public_files'))->delete($file->path); + $file->delete(); + + Flash::success('File deleted successfully.'); + return redirect($redirect); + } +} diff --git a/app/Http/Requests/CreateFilesRequest.php b/app/Http/Requests/CreateFilesRequest.php new file mode 100644 index 00000000..e7b8bb2b --- /dev/null +++ b/app/Http/Requests/CreateFilesRequest.php @@ -0,0 +1,35 @@ + 'required', + 'file' => 'required|file', + + #'files.*' => 'required|file', + ]; + } +} diff --git a/app/Http/Requests/UpdateFilesRequest.php b/app/Http/Requests/UpdateFilesRequest.php new file mode 100644 index 00000000..137c90a2 --- /dev/null +++ b/app/Http/Requests/UpdateFilesRequest.php @@ -0,0 +1,35 @@ + 'required', + 'file' => 'nullable|file', + + #'files.*' => 'required|file', + ]; + } +} diff --git a/app/Interfaces/Model.php b/app/Interfaces/Model.php index 51192d87..12c0e545 100644 --- a/app/Interfaces/Model.php +++ b/app/Interfaces/Model.php @@ -4,6 +4,7 @@ namespace App\Interfaces; /** * Class Model + * @property mixed $id * @package App\Interfaces */ abstract class Model extends \Illuminate\Database\Eloquent\Model diff --git a/app/Models/Aircraft.php b/app/Models/Aircraft.php index 2049dd9d..d00103b8 100644 --- a/app/Models/Aircraft.php +++ b/app/Models/Aircraft.php @@ -5,6 +5,7 @@ namespace App\Models; use App\Interfaces\Model; use App\Models\Enums\AircraftStatus; use App\Models\Traits\ExpensableTrait; +use App\Models\Traits\FilesTrait; /** * @property int id @@ -22,6 +23,7 @@ use App\Models\Traits\ExpensableTrait; class Aircraft extends Model { use ExpensableTrait; + use FilesTrait; public $table = 'aircraft'; diff --git a/app/Models/Airport.php b/app/Models/Airport.php index d22fca94..f4774bac 100644 --- a/app/Models/Airport.php +++ b/app/Models/Airport.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Interfaces\Model; use App\Models\Traits\ExpensableTrait; +use App\Models\Traits\FilesTrait; /** * Class Airport @@ -16,6 +17,7 @@ use App\Models\Traits\ExpensableTrait; class Airport extends Model { use ExpensableTrait; + use FilesTrait; public $table = 'airports'; public $timestamps = false; diff --git a/app/Models/File.php b/app/Models/File.php new file mode 100644 index 00000000..714669e8 --- /dev/null +++ b/app/Models/File.php @@ -0,0 +1,53 @@ + 'required', + ]; + + /** + * Get the full URL to this attribute + * @return string + */ + public function getUrlAttribute(): string + { + $disk = config('filesystems.public_files'); + if ($disk !== 'public') { + return Storage::disk(config('filesystems.public_files')) + ->url($this->path); + } + + return public_asset(Storage::disk('public') + ->url($this->path) + ); + } +} diff --git a/app/Models/JournalTransaction.php b/app/Models/JournalTransaction.php index 10c61b44..4d4105ab 100644 --- a/app/Models/JournalTransaction.php +++ b/app/Models/JournalTransaction.php @@ -7,6 +7,7 @@ namespace App\Models; use App\Interfaces\Model; +use App\Models\Traits\ReferenceTrait; /** * @property string id UUID type @@ -22,6 +23,8 @@ use App\Interfaces\Model; */ class JournalTransaction extends Model { + use ReferenceTrait; + protected $table = 'journal_transactions'; public $incrementing = false; @@ -61,33 +64,6 @@ class JournalTransaction extends Model return $this->belongsTo(Journal::class); } - /** - * @param Model $object - * @return JournalTransaction - */ - public function referencesObject($object) - { - $this->ref_model = \get_class($object); - $this->ref_model_id = $object->id; - $this->save(); - - return $this; - } - - /** - * - */ - public function getReferencedObject() - { - if ($classname = $this->ref_model) { - $klass = new $this->ref_model; - - return $klass->find($this->ref_model_id); - } - - return false; - } - /** * @param string $currency */ diff --git a/app/Models/Traits/FilesTrait.php b/app/Models/Traits/FilesTrait.php new file mode 100644 index 00000000..8154d831 --- /dev/null +++ b/app/Models/Traits/FilesTrait.php @@ -0,0 +1,22 @@ +morphMany( + File::class, + 'files', # overridden by the next two anyway + 'ref_model', + 'ref_model_id' + ); + } +} diff --git a/app/Models/Traits/ReferenceTrait.php b/app/Models/Traits/ReferenceTrait.php new file mode 100644 index 00000000..27129cf9 --- /dev/null +++ b/app/Models/Traits/ReferenceTrait.php @@ -0,0 +1,40 @@ +ref_model = \get_class($object); + $this->ref_model_id = $object->id; + $this->save(); + + return $this; + } + + /** + * Return an instance of the object or null + * @return \App\Interfaces\Model|null + */ + public function getReferencedObject() + { + if ($classname = $this->ref_model) { + $klass = new $this->ref_model; + + return $klass->find($this->ref_model_id); + } + + return null; + } +} diff --git a/app/Routes/admin.php b/app/Routes/admin.php index 8ab680d2..376e1cf1 100644 --- a/app/Routes/admin.php +++ b/app/Routes/admin.php @@ -34,6 +34,10 @@ Route::group([ Route::match(['get', 'post'], 'fares/import', 'FareController@import')->name('fares.import'); Route::resource('fares', 'FareController'); + # files + Route::post('files', 'FilesController@store')->name('files.store'); + Route::delete('files/{id}/delete', 'FilesController@delete')->name('files.delete'); + # finances Route::resource('finances', 'FinanceController'); diff --git a/config/filesystems.php b/config/filesystems.php index 442da8f8..342903c3 100755 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -2,6 +2,9 @@ return [ 'default' => 'local', + + // This is the filesystem the uploaded files should go to + 'public_files' => 'public', 'cloud' => 's3', 'disks' => [ @@ -12,7 +15,8 @@ return [ 'public' => [ 'driver' => 'local', - 'root' => app_path('public/assets/upload'), + 'root' => public_path('uploads'), + 'url' => '/uploads', 'visibility' => 'public', ], diff --git a/public/uploads/.gitignore b/public/uploads/.gitignore new file mode 100755 index 00000000..5cbd7213 --- /dev/null +++ b/public/uploads/.gitignore @@ -0,0 +1,4 @@ +* +!files/ +!avatars/ +!.gitignore diff --git a/public/uploads/avatars/.gitignore b/public/uploads/avatars/.gitignore new file mode 100755 index 00000000..d6b7ef32 --- /dev/null +++ b/public/uploads/avatars/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/public/uploads/files/.gitignore b/public/uploads/files/.gitignore new file mode 100755 index 00000000..d6b7ef32 --- /dev/null +++ b/public/uploads/files/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/resources/views/admin/aircraft/edit.blade.php b/resources/views/admin/aircraft/edit.blade.php index bc3ab534..76bff6f5 100644 --- a/resources/views/admin/aircraft/edit.blade.php +++ b/resources/views/admin/aircraft/edit.blade.php @@ -1,19 +1,28 @@ @extends('admin.app') @section('title', "Edit \"$aircraft->name\"") @section('content') -
| Name | +Current File | ++ |
| {{ $file->name }} | +Link to file | ++ {{ Form::open(['route' => ['admin.files.delete', $file->id], 'method' => 'delete']) }} + {{ Form::hidden('id', $file->id) }} + {{ Form::hidden('redirect', $redirect) }} + {{ Form::button('', [ + 'type' => 'submit', + 'class' => 'btn btn-sm btn-danger btn-icon', + 'onclick' => "return confirm('Are you sure?')"]) + }} + {{ Form::close() }} + | +
{{ $errors->first('name') }}
+{{ $errors->first('file') }}
+ + {{ Form::close() }} +