FEATURE #1865: add logging for uploaded file
This commit is contained in:
@@ -2,37 +2,33 @@
|
|||||||
|
|
||||||
namespace App\Events;
|
namespace App\Events;
|
||||||
|
|
||||||
|
use App\Models\FileManager\File as FileModel;
|
||||||
use Illuminate\Queue\SerializesModels;
|
use Illuminate\Queue\SerializesModels;
|
||||||
use Symfony\Component\HttpFoundation\File\File;
|
|
||||||
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
|
||||||
|
|
||||||
class UploadFile extends Event
|
class UploadFile extends Event
|
||||||
{
|
{
|
||||||
use SerializesModels;
|
use SerializesModels;
|
||||||
/**
|
|
||||||
* @var UploadedFile
|
|
||||||
*/
|
|
||||||
public $uploadedFile;
|
public $uploadedFile;
|
||||||
/**
|
/**
|
||||||
* @var
|
* @var FileModel
|
||||||
*/
|
*/
|
||||||
public $id;
|
public $file;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new event instance.
|
* Create a new event instance.
|
||||||
*
|
*
|
||||||
* @param File $uploadedFile
|
* @param FileModel $file
|
||||||
* @param $id
|
* @param $id
|
||||||
|
*
|
||||||
|
* @internal param File $uploadedFile
|
||||||
*/
|
*/
|
||||||
public function __construct(File $uploadedFile, $id)
|
public function __construct(FileModel $file)
|
||||||
{
|
{
|
||||||
$this->uploadedFile = $uploadedFile;
|
$this->file = $file;
|
||||||
$this->id = $id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the channels the event should be broadcast on.
|
* Get the channels the event should be broadcast on.
|
||||||
*
|
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function broadcastOn()
|
public function broadcastOn()
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class UploadFile extends Controller
|
|||||||
*/
|
*/
|
||||||
private function internalUpload(Request $request)
|
private function internalUpload(Request $request)
|
||||||
{
|
{
|
||||||
try {
|
// try {
|
||||||
$uploadedFiles = [];
|
$uploadedFiles = [];
|
||||||
$files = $request->all()['files'];
|
$files = $request->all()['files'];
|
||||||
|
|
||||||
@@ -62,9 +62,9 @@ class UploadFile extends Controller
|
|||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->with('success', trans_choice('admin/fileManager.uploadSuccessfull', $successfullUploads));
|
->with('success', trans_choice('admin/fileManager.uploadSuccessfull', $successfullUploads));
|
||||||
} catch (FileException $e) {
|
// } catch (FileException $e) {
|
||||||
return $this->invalidUpload('invalidFile');
|
// return $this->invalidUpload('invalidFile');
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
namespace App\Listeners;
|
namespace App\Listeners;
|
||||||
|
|
||||||
use App\Events\UploadFile;
|
use App\Events\UploadFile;
|
||||||
|
use App\Models\FileManager\File;
|
||||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
use Illuminate\Support\Facades\File as FileFacade;
|
use Illuminate\Support\Facades\File as FileFacade;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
@@ -12,15 +13,6 @@ use Symfony\Component\HttpFoundation\File\File as SymphonyFile;
|
|||||||
|
|
||||||
class CreateImageThumbnail implements ShouldQueue
|
class CreateImageThumbnail implements ShouldQueue
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* Create the event listener.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle the event.
|
* Handle the event.
|
||||||
*
|
*
|
||||||
@@ -30,10 +22,10 @@ class CreateImageThumbnail implements ShouldQueue
|
|||||||
*/
|
*/
|
||||||
public function handle(UploadFile $event)
|
public function handle(UploadFile $event)
|
||||||
{
|
{
|
||||||
$uploadedFile = $event->uploadedFile;
|
$uploadedFile = $event->file;
|
||||||
|
|
||||||
// is uploaded file an image?
|
// is uploaded file an image?
|
||||||
if (!Str::startsWith($uploadedFile->getMimeType(), 'image')) {
|
if (!Str::startsWith($uploadedFile->mime_type, 'image')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// yes, create thumbnail
|
// yes, create thumbnail
|
||||||
@@ -43,10 +35,12 @@ class CreateImageThumbnail implements ShouldQueue
|
|||||||
/**
|
/**
|
||||||
* Create thumbnail of given image
|
* Create thumbnail of given image
|
||||||
*
|
*
|
||||||
* @param SymphonyFile $file
|
* @param File $uploadedFile
|
||||||
*/
|
*/
|
||||||
private function createThumbnail(SymphonyFile $file)
|
private function createThumbnail(File $uploadedFile)
|
||||||
{
|
{
|
||||||
|
$file = new SymphonyFile(config('app.upload_path') . '/' . $uploadedFile->filename);
|
||||||
|
|
||||||
// does thumbnail directory exist?
|
// does thumbnail directory exist?
|
||||||
if (!is_dir(config('app.thumbnail_path'))) {
|
if (!is_dir(config('app.thumbnail_path'))) {
|
||||||
FileFacade::makeDirectory(config('app.thumbnail_path'));
|
FileFacade::makeDirectory(config('app.thumbnail_path'));
|
||||||
|
|||||||
@@ -2,30 +2,33 @@
|
|||||||
|
|
||||||
namespace App\Listeners\Loggers;
|
namespace App\Listeners\Loggers;
|
||||||
|
|
||||||
use App\Events\Uploadfile;
|
use App\Events\UploadFile;
|
||||||
use Illuminate\Queue\InteractsWithQueue;
|
|
||||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
||||||
|
|
||||||
class LogUploadFile
|
class LogUploadFile extends Logger
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* Create the event listener.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle the event.
|
* Handle the event.
|
||||||
*
|
*
|
||||||
* @param Uploadfile $event
|
* @param CreateNewWidget $event
|
||||||
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function handle(Uploadfile $event)
|
public function handle(UploadFile $event)
|
||||||
{
|
{
|
||||||
//
|
$parameters = [
|
||||||
|
'name' => $event->file->filename,
|
||||||
|
'mime' => $event->file->mime_type,
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->saveLog($parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for action name. Used only internally
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
protected function getName()
|
||||||
|
{
|
||||||
|
return 'newFile';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ use App\CMS\Contracts\Repositories\Content as ContentContract;
|
|||||||
use App\CMS\Helpers\Traits\Nullable;
|
use App\CMS\Helpers\Traits\Nullable;
|
||||||
use App\CMS\Observers\Content as ContentObserver;
|
use App\CMS\Observers\Content as ContentObserver;
|
||||||
use App\Models\FileManager\File;
|
use App\Models\FileManager\File;
|
||||||
|
use App\Models\Module;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
@@ -55,7 +56,6 @@ class Content extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Mark relationship with its historical records
|
* Mark relationship with its historical records
|
||||||
*
|
|
||||||
* @return \Illuminate\Database\Eloquent\Relations\HasMany
|
* @return \Illuminate\Database\Eloquent\Relations\HasMany
|
||||||
*/
|
*/
|
||||||
public function history()
|
public function history()
|
||||||
@@ -65,7 +65,6 @@ class Content extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Mark relationship with users table
|
* Mark relationship with users table
|
||||||
*
|
|
||||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
*/
|
*/
|
||||||
public function author()
|
public function author()
|
||||||
@@ -75,7 +74,6 @@ class Content extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Related files to content page
|
* Related files to content page
|
||||||
*
|
|
||||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
|
||||||
*/
|
*/
|
||||||
public function files()
|
public function files()
|
||||||
@@ -85,7 +83,6 @@ class Content extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Category of content page
|
* Category of content page
|
||||||
*
|
|
||||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
*/
|
*/
|
||||||
public function category()
|
public function category()
|
||||||
@@ -95,7 +92,6 @@ class Content extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Subpages assigned to page
|
* Subpages assigned to page
|
||||||
*
|
|
||||||
* @return \Illuminate\Database\Eloquent\Relations\HasMany
|
* @return \Illuminate\Database\Eloquent\Relations\HasMany
|
||||||
*/
|
*/
|
||||||
public function subpages()
|
public function subpages()
|
||||||
@@ -103,9 +99,17 @@ class Content extends Model
|
|||||||
return $this->hasMany(Content::class, 'parentId');
|
return $this->hasMany(Content::class, 'parentId');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module relationship
|
||||||
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
|
*/
|
||||||
|
public function module()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Module::class, 'moduleHandler', 'handler');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parent page
|
* Parent page
|
||||||
*
|
|
||||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
*/
|
*/
|
||||||
public function parentPage()
|
public function parentPage()
|
||||||
@@ -115,7 +119,6 @@ class Content extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Is current content draft?
|
* Is current content draft?
|
||||||
*
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function isDraft()
|
public function isDraft()
|
||||||
@@ -125,7 +128,6 @@ class Content extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Is current content visible for all visitors?
|
* Is current content visible for all visitors?
|
||||||
*
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function isPublic()
|
public function isPublic()
|
||||||
@@ -135,7 +137,6 @@ class Content extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Is current content visible only for logged users?
|
* Is current content visible only for logged users?
|
||||||
*
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function isProtected()
|
public function isProtected()
|
||||||
@@ -145,7 +146,6 @@ class Content extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Is current content visible for logged user OR for everyone?
|
* Is current content visible for logged user OR for everyone?
|
||||||
*
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function isVisible()
|
public function isVisible()
|
||||||
@@ -164,6 +164,9 @@ class Content extends Model
|
|||||||
return parent::save($options);
|
return parent::save($options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increment number of viewed content
|
||||||
|
*/
|
||||||
public function view()
|
public function view()
|
||||||
{
|
{
|
||||||
$this->timestamps = false;
|
$this->timestamps = false;
|
||||||
|
|||||||
@@ -45,15 +45,15 @@ trait File
|
|||||||
$uploadedFile = $file->move($destination, $filename);
|
$uploadedFile = $file->move($destination, $filename);
|
||||||
|
|
||||||
// insert record into database
|
// insert record into database
|
||||||
$id = $this->saveIntoDatabase($uploadedFile, $data, $file->getClientOriginalName());
|
$fileInDB = $this->saveIntoDatabase($uploadedFile, $data, $file->getClientOriginalName());
|
||||||
|
|
||||||
// fire event about new file
|
// fire event about new file
|
||||||
Event::fire(new UploadFile($uploadedFile, $id));
|
Event::fire(new UploadFile($fileInDB));
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'filename' => $filename,
|
'filename' => $filename,
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'id' => $id
|
'id' => $fileInDB->id
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,6 +89,6 @@ trait File
|
|||||||
'keywords' => isset($request->keyword) ? $request->keyword : ''
|
'keywords' => isset($request->keyword) ? $request->keyword : ''
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return $newFile->id;
|
return $newFile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
|
class AddNewActionLogType extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
\App\Models\ActionLog\ActionLogType::create([
|
||||||
|
'string_id' => 'newFile',
|
||||||
|
'name' => 'admin/actionLog.nameNewFile',
|
||||||
|
'value' => 'admin/actionLog.newFile'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
\App\Models\ActionLog\ActionLogType::where('string_id', 'newFile')
|
||||||
|
->delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,51 +1,53 @@
|
|||||||
<?php
|
<?php
|
||||||
return [
|
return [
|
||||||
"assignWidget" => "Přiřadil widget :widgetName (#:widgetId) do plochy :widgetAreaName (#:widgetAreaId)",
|
"assignWidget" => "Přiřadil widget :widgetName (#:widgetId) do plochy :widgetAreaName (#:widgetAreaId)",
|
||||||
"changeSettings" => "Změna nastavení",
|
"changeSettings" => "Změna nastavení",
|
||||||
"createNewContent" => "Vytvořena nová obsahová stránka. Titulek <strong>:title</strong>, url :url a ID #:id",
|
"createNewContent" => "Vytvořena nová obsahová stránka. Titulek <strong>:title</strong>, url :url a ID #:id",
|
||||||
"createUser" => "Vytvořen nový uživatel :name s e-mailem :email.",
|
"createUser" => "Vytvořen nový uživatel :name s e-mailem :email.",
|
||||||
"deleteContent" => 'Smazána stránka ":title", url "url a ID #:id. Tato změna je zaznamenána v revizi :revision.',
|
"deleteContent" => 'Smazána stránka ":title", url "url a ID #:id. Tato změna je zaznamenána v revizi :revision.',
|
||||||
"deleteCustomField" => "a",
|
"deleteCustomField" => "a",
|
||||||
"deleteWidgetArea" => "Smazal plochu pro widget :name",
|
"deleteWidgetArea" => "Smazal plochu pro widget :name",
|
||||||
"displayingUsersActions" => "Zobrazuji všechny akce od uživatele :name (:email).",
|
"displayingUsersActions" => "Zobrazuji všechny akce od uživatele :name (:email).",
|
||||||
"draftFromContent" => "Upraven widget :name (#:id)",
|
"draftFromContent" => "Upraven widget :name (#:id)",
|
||||||
"editContent" => 'Editace stránky - nový titulek je ":title", url :url a ID #:id. Revize změny: :revision.',
|
"editContent" => 'Editace stránky - nový titulek je ":title", url :url a ID #:id. Revize změny: :revision.',
|
||||||
"editCustomField" => "a",
|
"editCustomField" => "a",
|
||||||
"editWidget" => "Upraven widget :name (#:id)",
|
"editWidget" => "Upraven widget :name (#:id)",
|
||||||
"editWidgetArea" => 'Upravena plocha pro widgety :name (#:id) s popisem ":description"',
|
"editWidgetArea" => 'Upravena plocha pro widgety :name (#:id) s popisem ":description"',
|
||||||
"invalidEditContentAttempt" => "Pokus o editaci obsahu s ID :contentId",
|
"invalidEditContentAttempt" => "Pokus o editaci obsahu s ID :contentId",
|
||||||
"ip" => "IP adresa",
|
"ip" => "IP adresa",
|
||||||
"login" => "Přihlášen",
|
"login" => "Přihlášen",
|
||||||
"logout" => "Odhlášen",
|
"logout" => "Odhlášen",
|
||||||
"nameAssignWidget" => "Přiřazení widgetu",
|
"nameAssignWidget" => "Přiřazení widgetu",
|
||||||
"nameChangeSettings" => "Změna nastavení",
|
"nameChangeSettings" => "Změna nastavení",
|
||||||
"nameCreateNewContent" => "Vytvoření nové stránky",
|
"nameCreateNewContent" => "Vytvoření nové stránky",
|
||||||
"nameCreateUser" => "Vytvořen uživatel",
|
"nameCreateUser" => "Vytvořen uživatel",
|
||||||
"nameDeleteContent" => "Smazání stránky",
|
"nameDeleteContent" => "Smazání stránky",
|
||||||
"nameDeleteCustomField" => "Smazání uživatelského pole",
|
"nameDeleteCustomField" => "Smazání uživatelského pole",
|
||||||
"nameDeleteWidgetArea" => "Smazání plochy pro widgety",
|
"nameDeleteWidgetArea" => "Smazání plochy pro widgety",
|
||||||
"nameDraftFromContent" => "Vytvoření konceptu z publikované stránky",
|
"nameDraftFromContent" => "Vytvoření konceptu z publikované stránky",
|
||||||
"nameEditContent" => "Úprava obsahu",
|
"nameEditContent" => "Úprava obsahu",
|
||||||
"nameEditCustomField" => "Editace uživatelského pole",
|
"nameEditCustomField" => "Editace uživatelského pole",
|
||||||
"nameEditWidget" => "Úprava widgetu",
|
"nameEditWidget" => "Úprava widgetu",
|
||||||
"nameEditWidgetArea" => "Úprava plochy pro widgety",
|
"nameEditWidgetArea" => "Úprava plochy pro widgety",
|
||||||
"nameInvalidEditContentAttempt" => "Pokus o editaci neexistující/neplatné stránky",
|
"nameInvalidEditContentAttempt" => "Pokus o editaci neexistující/neplatné stránky",
|
||||||
"nameLogin" => "Login",
|
"nameLogin" => "Login",
|
||||||
"nameLogout" => "Odhlášení",
|
"nameLogout" => "Odhlášení",
|
||||||
"nameNewCustomField" => "Vytvoření uživatelského pole",
|
"nameNewCustomField" => "Vytvoření uživatelského pole",
|
||||||
"nameNewWidget" => "Nový widget",
|
"nameNewWidget" => "Nový widget",
|
||||||
"nameNewWidgetArea" => "Vytoření plochy pro widgety",
|
"nameNewWidgetArea" => "Vytoření plochy pro widgety",
|
||||||
"namePublishContent" => "Publikace stránky",
|
"namePublishContent" => "Publikace stránky",
|
||||||
"nameRemoveWidgetFromArea" => "Odebrání widgetu z plochy",
|
"nameRemoveWidgetFromArea" => "Odebrání widgetu z plochy",
|
||||||
"nameSetHomepage" => "Nastavení domovské stránky",
|
"nameSetHomepage" => "Nastavení domovské stránky",
|
||||||
"nameUserEdit" => "Editace uživatele",
|
"nameUserEdit" => "Editace uživatele",
|
||||||
"newCustomField" => 'Přidal nové uživatelské pole s ID #:id a jménem ":name"',
|
"newCustomField" => 'Přidal nové uživatelské pole s ID #:id a jménem ":name"',
|
||||||
"newWidget" => 'Vytvořen nový widget :type se jménem :name (#:id) a popisem ":description".',
|
"newWidget" => 'Vytvořen nový widget :type se jménem :name (#:id) a popisem ":description".',
|
||||||
"newWidgetArea" => 'Vytvořil plochu pro widgety :name (#:id) s popisem ":description"',
|
"newWidgetArea" => 'Vytvořil plochu pro widgety :name (#:id) s popisem ":description"',
|
||||||
"overview" => "Seznam všech akcí",
|
"overview" => "Seznam všech akcí",
|
||||||
"publishContent" => 'Publikována stránka ":title" (url :url, ID #:id). Revize :revision.',
|
"publishContent" => 'Publikována stránka ":title" (url :url, ID #:id). Revize :revision.',
|
||||||
"removeWidgetFromArea" => "Odebrán widget :widgetName z oblasti :widgetAreaName (#widgetAreaId)",
|
"removeWidgetFromArea" => "Odebrán widget :widgetName z oblasti :widgetAreaName (#widgetAreaId)",
|
||||||
"setHomepage" => "Nastavena nová domovská stránka: :title, URL: :url a ID #:id. Revize :revision.",
|
"setHomepage" => "Nastavena nová domovská stránka: :title, URL: :url a ID #:id. Revize :revision.",
|
||||||
"userAgent" => "Prohlížeč",
|
"userAgent" => "Prohlížeč",
|
||||||
"userEdit" => "Upravil uživatele :name (:email)",
|
"userEdit" => "Upravil uživatele :name (:email)",
|
||||||
|
'newFile' => 'Nahrál soubor :name (typ :mime)',
|
||||||
|
'nameNewFile' => 'Nahrání souboru'
|
||||||
];
|
];
|
||||||
|
|||||||
Reference in New Issue
Block a user