FEATURE #1865: add logging for uploaded file

This commit is contained in:
Michal Kváček
2017-08-01 23:33:01 +02:00
parent 7a38f357dc
commit e5d9ce682d
8 changed files with 135 additions and 108 deletions
+9 -13
View File
@@ -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');
} // }
} }
/** /**
+7 -13
View File
@@ -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'));
+20 -17
View File
@@ -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';
} }
} }
+13 -10
View File
@@ -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;
+4 -4
View File
@@ -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();
}
}
+49 -47
View File
@@ -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'
]; ];