diff --git a/app/Http/Controllers/Accessories/AccessoriesFilesController.php b/app/Http/Controllers/Accessories/AccessoriesFilesController.php index 9dbb16d83aed..c1d3f12c9fe0 100644 --- a/app/Http/Controllers/Accessories/AccessoriesFilesController.php +++ b/app/Http/Controllers/Accessories/AccessoriesFilesController.php @@ -80,7 +80,8 @@ public function destroy($accessoryId = null, $fileId = null) : RedirectResponse if (Storage::exists('private_uploads/accessories/'.$log->filename)) { try { Storage::delete('private_uploads/accessories/' . $log->filename); - $log->delete(); + $accessory->logUploadDelete($log->filename); + return redirect()->back()->withFragment('files')->with('success', trans('admin/hardware/message.deletefile.success')); } catch (\Exception $e) { Log::debug($e); diff --git a/app/Http/Controllers/Assets/AssetFilesController.php b/app/Http/Controllers/Assets/AssetFilesController.php index cf119edddc8c..97a9bd6fa9b4 100644 --- a/app/Http/Controllers/Assets/AssetFilesController.php +++ b/app/Http/Controllers/Assets/AssetFilesController.php @@ -98,7 +98,8 @@ public function destroy(Asset $asset, $fileId = null) : RedirectResponse if (Storage::exists($rel_path.'/'.$log->filename)) { Storage::delete($rel_path.'/'.$log->filename); } - $log->delete(); + $asset->logUploadDelete($log->filename); + return redirect()->back()->withFragment('files')->with('success', trans('admin/hardware/message.deletefile.success')); } diff --git a/app/Http/Controllers/Components/ComponentsFilesController.php b/app/Http/Controllers/Components/ComponentsFilesController.php index b5e30aa694fd..b8503d078170 100644 --- a/app/Http/Controllers/Components/ComponentsFilesController.php +++ b/app/Http/Controllers/Components/ComponentsFilesController.php @@ -88,7 +88,7 @@ public function destroy($componentId = null, $fileId = null) Log::debug($e); } } - + $component->logUploadDelete($log->filename); $log->delete(); return redirect()->back()->withFragment('files') diff --git a/app/Http/Controllers/Consumables/ConsumablesFilesController.php b/app/Http/Controllers/Consumables/ConsumablesFilesController.php index 545b008dc0b1..ff7d40f56e4b 100644 --- a/app/Http/Controllers/Consumables/ConsumablesFilesController.php +++ b/app/Http/Controllers/Consumables/ConsumablesFilesController.php @@ -86,8 +86,7 @@ public function destroy($consumableId = null, $fileId = null) Log::debug($e); } } - - $log->delete(); + $consumable->logUploadDelete($log->filename); return redirect()->back()->withFragment('files') ->with('success', trans('admin/hardware/message.deletefile.success')); diff --git a/app/Http/Controllers/Licenses/LicenseFilesController.php b/app/Http/Controllers/Licenses/LicenseFilesController.php index 6ab3cb7703aa..03c252fe5b76 100644 --- a/app/Http/Controllers/Licenses/LicenseFilesController.php +++ b/app/Http/Controllers/Licenses/LicenseFilesController.php @@ -80,8 +80,7 @@ public function destroy($licenseId = null, $fileId = null) Log::debug($e); } } - - $log->delete(); + $license->logUploadDelete($log->filename); return redirect()->back() ->with('success', trans('admin/hardware/message.deletefile.success')); diff --git a/app/Http/Transformers/ActionlogsTransformer.php b/app/Http/Transformers/ActionlogsTransformer.php index 702ea123d8f2..8b0119199a54 100644 --- a/app/Http/Transformers/ActionlogsTransformer.php +++ b/app/Http/Transformers/ActionlogsTransformer.php @@ -57,7 +57,7 @@ public function transformActionlog (Actionlog $actionlog, $settings = null) } if ($actionlog->filename!='') { - $icon = Helper::filetype_icon($actionlog->filename); + $icon = $actionlog->action_type === 'upload deleted' ? 'fas fa-trash' : Helper::filetype_icon($actionlog->filename); } // This is necessary since we can't escape special characters within a JSON object diff --git a/app/Models/Accessory.php b/app/Models/Accessory.php index 039f8692f6b4..2d0f894622b1 100755 --- a/app/Models/Accessory.php +++ b/app/Models/Accessory.php @@ -112,10 +112,17 @@ class Accessory extends SnipeModel */ public function uploads() { - return $this->hasMany(\App\Models\Actionlog::class, 'item_id') + return $this->hasMany(Actionlog::class, 'item_id') ->where('item_type', '=', self::class) ->where('action_type', '=', 'uploaded') ->whereNotNull('filename') + ->whereNotIn('filename', function ($query) { + $query->select('filename') + ->from('action_logs') + ->where('item_type', '=', self::class) + ->where('action_type', '=', 'upload deleted') + ->where('item_id', $this->id); + }) ->orderBy('created_at', 'desc'); } diff --git a/app/Models/Asset.php b/app/Models/Asset.php index ac4fecac345a..a01d343f3dac 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -480,11 +480,18 @@ public function get_depreciation() */ public function uploads() { - return $this->hasMany('\App\Models\Actionlog', 'item_id') - ->where('item_type', '=', Asset::class) - ->where('action_type', '=', 'uploaded') - ->whereNotNull('filename') - ->orderBy('created_at', 'desc'); + return $this->hasMany(Actionlog::class, 'item_id') + ->where('item_type', '=', self::class) + ->where('action_type', '=', 'uploaded') + ->whereNotNull('filename') + ->whereNotIn('filename', function ($query) { + $query->select('filename') + ->from('action_logs') + ->where('item_type', '=', self::class) + ->where('action_type', '=', 'upload deleted') + ->where('item_id', $this->id); + }) + ->orderBy('created_at', 'desc'); } /** diff --git a/app/Models/Component.php b/app/Models/Component.php index 0208fb9f68b4..200027c391a1 100644 --- a/app/Models/Component.php +++ b/app/Models/Component.php @@ -122,10 +122,17 @@ public function isDeletable() */ public function uploads() { - return $this->hasMany(\App\Models\Actionlog::class, 'item_id') + return $this->hasMany(Actionlog::class, 'item_id') ->where('item_type', '=', self::class) ->where('action_type', '=', 'uploaded') ->whereNotNull('filename') + ->whereNotIn('filename', function ($query) { + $query->select('filename') + ->from('action_logs') + ->where('item_type', '=', self::class) + ->where('action_type', '=', 'upload deleted') + ->where('item_id', $this->id); + }) ->orderBy('created_at', 'desc'); } @@ -226,7 +233,7 @@ public function manufacturer() */ public function assetlog() { - return $this->hasMany(\App\Models\Actionlog::class, 'item_id')->where('item_type', self::class)->orderBy('created_at', 'desc')->withTrashed(); + return $this->hasMany(Actionlog::class, 'item_id')->where('item_type', self::class)->orderBy('created_at', 'desc')->withTrashed(); } /** diff --git a/app/Models/Consumable.php b/app/Models/Consumable.php index c83aa6106e45..807618d1273e 100644 --- a/app/Models/Consumable.php +++ b/app/Models/Consumable.php @@ -124,6 +124,13 @@ public function uploads() ->where('item_type', '=', self::class) ->where('action_type', '=', 'uploaded') ->whereNotNull('filename') + ->whereNotIn('filename', function ($query) { + $query->select('filename') + ->from('action_logs') + ->where('item_type', '=', self::class) + ->where('action_type', '=', 'upload deleted') + ->where('item_id', $this->id); + }) ->orderBy('created_at', 'desc'); } diff --git a/app/Models/License.php b/app/Models/License.php index 0997c1e57b99..36f515186fe6 100755 --- a/app/Models/License.php +++ b/app/Models/License.php @@ -416,10 +416,17 @@ public function assetlog() */ public function uploads() { - return $this->hasMany(\App\Models\Actionlog::class, 'item_id') + return $this->hasMany(Actionlog::class, 'item_id') ->where('item_type', '=', self::class) ->where('action_type', '=', 'uploaded') ->whereNotNull('filename') + ->whereNotIn('filename', function ($query) { + $query->select('filename') + ->from('action_logs') + ->where('item_type', '=', self::class) + ->where('action_type', '=', 'upload deleted') + ->where('item_id', $this->id); + }) ->orderBy('created_at', 'desc'); } diff --git a/app/Models/Loggable.php b/app/Models/Loggable.php index 4cf58176689b..0101730ba1b0 100644 --- a/app/Models/Loggable.php +++ b/app/Models/Loggable.php @@ -345,6 +345,29 @@ public function logUpload($filename, $note) return $log; } + /** + * @author Godfrey Martinez + * @since [v8.0.4] + * @return \App\Models\Actionlog + */ + public function logUploadDelete($filename) + { + $log = new Actionlog; + if (static::class == LicenseSeat::class) { + $log->item_type = License::class; + $log->item_id = $this->license_id; + } else { + $log->item_type = static::class; + $log->item_id = $this->id; + } + $log->created_by = auth()->id(); + $log->target_id = null; + $log->filename = $filename; + $log->created_at = date('Y-m-d H:i:s'); + $log->logaction('upload deleted'); + + return $log; + } /** * Get latest signature from a specific user diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index 8e055ac79bb1..dd304d179e48 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -308,6 +308,7 @@ 'updating_item' => 'Updating :item', 'upload_filetypes_help' => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, xls, xlsx, txt, lic, xml, zip, rtf and rar. Max upload size allowed is :size.', 'uploaded' => 'Uploaded', + 'upload_deleted' => 'Upload Deleted', 'user' => 'User', 'accepted' => 'accepted', 'declined' => 'declined',