From 5eebdcddb24f8c605e6029d8a61e1dc4c8e1f113 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 4 Mar 2025 10:12:45 -0800 Subject: [PATCH 1/5] changes visited and link colors --- resources/assets/less/skins/skin-blue.less | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/assets/less/skins/skin-blue.less b/resources/assets/less/skins/skin-blue.less index fcbb3c0308..cf326543eb 100755 --- a/resources/assets/less/skins/skin-blue.less +++ b/resources/assets/less/skins/skin-blue.less @@ -111,8 +111,8 @@ --header: @blue; /* Use same as Header picker */ --text-main: #BBB; --text-sub: #9b9b9b; - --link:darken(@blue, 15%); /* Use same as Header picker, lighten by 70% */ - --visited-link: lighten(@blue,10%); /* Use same as Header picker, lighten by 70% */ + --link: #003366; /* Use same as Header picker, lighten by 70% */ + --visited-link: lighten(#003366,20%); /* Use same as Header picker, lighten by 70% */ --hover-link: lighten(@blue,20%); /* Use same as Header picker, lighten by 70% */ --nav-link: #FFF; /* Use same as Header picker */ --light-link: #fff; /* Use same as Header picker */ From 15a09e5187ff67a05f54bbdfa99f754f9f5a6156 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 4 Mar 2025 11:15:03 -0800 Subject: [PATCH 2/5] adds audit notification for MS Teams --- app/Models/Loggable.php | 11 ++++++- app/Notifications/AuditNotification.php | 39 +++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/app/Models/Loggable.php b/app/Models/Loggable.php index bd12050dc7..1e4a912027 100644 --- a/app/Models/Loggable.php +++ b/app/Models/Loggable.php @@ -6,6 +6,8 @@ use App\Models\Setting; use App\Notifications\AuditNotification; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Str; +use Osama\LaravelTeamsNotification\TeamsNotification; trait Loggable { @@ -242,7 +244,14 @@ trait Loggable 'location' => ($location) ? $location->name : '', 'note' => $note, ]; - Setting::getSettings()->notify(new AuditNotification($params)); + if(Setting::getSettings()->webhook_selected === 'microsoft' && Str::contains(Setting::getSettings()->webhook_endpoint, 'workflows')){ + $message = AuditNotification::toMicrosoftTeams($params); + $notification = new TeamsNotification(Setting::getSettings()->webhook_endpoint); + $notification->success()->sendMessage($message[0], $message[1]); + } + else { + Setting::getSettings()->notify(new AuditNotification($params)); + } return $log; } diff --git a/app/Notifications/AuditNotification.php b/app/Notifications/AuditNotification.php index 1377c29e7e..4f4638e6cd 100644 --- a/app/Notifications/AuditNotification.php +++ b/app/Notifications/AuditNotification.php @@ -4,8 +4,13 @@ namespace App\Notifications; use App\Models\Setting; use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Channels\SlackWebhookChannel; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; +use Illuminate\Support\Facades\Log; +use Illuminate\Support\Str; +use NotificationChannels\MicrosoftTeams\MicrosoftTeamsChannel; +use NotificationChannels\MicrosoftTeams\MicrosoftTeamsMessage; class AuditNotification extends Notification { @@ -35,10 +40,14 @@ class AuditNotification extends Notification public function via() { $notifyBy = []; - if (Setting::getSettings()->webhook_endpoint) { - $notifyBy[] = 'slack'; + if (Setting::getSettings()->webhook_selected == 'slack' || Setting::getSettings()->webhook_selected == 'general' ) { + Log::debug('use webhook'); + $notifyBy[] = SlackWebhookChannel::class; } + if (Setting::getSettings()->webhook_selected == 'microsoft' && Setting::getSettings()->webhook_endpoint) { + $notifyBy[] = MicrosoftTeamsChannel::class; + } return $notifyBy; } @@ -63,4 +72,30 @@ class AuditNotification extends Notification ->fields($fields); }); } + + public static function toMicrosoftTeams($params) + { + $item = $params['item']; + $admin_user = $params['admin']; + $note = $params['note']; + $location = $params['location']; + $setting = Setting::getSettings(); + + if(!Str::contains($setting->webhook_endpoint, 'workflows')) { + return MicrosoftTeamsMessage::create() + ->to($setting->webhook_endpoint) + ->type('success') + ->title(class_basename(get_class($params['item'])) . ' Audited') + ->addStartGroupToSection('activityText') + ->fact(trans('mail.asset'), $item) + ->fact(trans('general.administrator'), $admin_user->present()->viewUrl() . '|' . $admin_user->present()->fullName()); + } + $message = class_basename(get_class($params['item'])) . ' Audited By '.$admin_user->present()->fullName(); + $details = [ + trans('mail.asset') => htmlspecialchars_decode($item->present()->name), + trans('mail.notes') => $note ?: '', + trans('general.location') => $location ?: '', + ]; + return [$message, $details]; + } } From 0ed49fa7a07a6e937c76405d6b844ad338db3eae Mon Sep 17 00:00:00 2001 From: snipe Date: Tue, 4 Mar 2025 22:55:58 +0000 Subject: [PATCH 3/5] Dev assets Signed-off-by: snipe --- public/css/dist/skins/_all-skins.css | 4 ++-- public/css/dist/skins/_all-skins.min.css | 4 ++-- public/css/dist/skins/skin-blue.css | 4 ++-- public/css/dist/skins/skin-blue.min.css | 4 ++-- public/mix-manifest.json | 8 ++++---- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/public/css/dist/skins/_all-skins.css b/public/css/dist/skins/_all-skins.css index b532ddb1f6..a3b3a6b031 100644 --- a/public/css/dist/skins/_all-skins.css +++ b/public/css/dist/skins/_all-skins.css @@ -966,9 +966,9 @@ a.btn-default:hover, /* Use same as Header picker */ --text-main: #BBB; --text-sub: #9b9b9b; - --link: #296282; + --link: #003366; /* Use same as Header picker, lighten by 70% */ - --visited-link: #5fa4cc; + --visited-link: #0066cc; /* Use same as Header picker, lighten by 70% */ --hover-link: #86bad8; /* Use same as Header picker, lighten by 70% */ diff --git a/public/css/dist/skins/_all-skins.min.css b/public/css/dist/skins/_all-skins.min.css index b532ddb1f6..a3b3a6b031 100644 --- a/public/css/dist/skins/_all-skins.min.css +++ b/public/css/dist/skins/_all-skins.min.css @@ -966,9 +966,9 @@ a.btn-default:hover, /* Use same as Header picker */ --text-main: #BBB; --text-sub: #9b9b9b; - --link: #296282; + --link: #003366; /* Use same as Header picker, lighten by 70% */ - --visited-link: #5fa4cc; + --visited-link: #0066cc; /* Use same as Header picker, lighten by 70% */ --hover-link: #86bad8; /* Use same as Header picker, lighten by 70% */ diff --git a/public/css/dist/skins/skin-blue.css b/public/css/dist/skins/skin-blue.css index cac9000174..89cfda27c4 100644 --- a/public/css/dist/skins/skin-blue.css +++ b/public/css/dist/skins/skin-blue.css @@ -185,9 +185,9 @@ a.btn-default:hover, /* Use same as Header picker */ --text-main: #BBB; --text-sub: #9b9b9b; - --link: #296282; + --link: #003366; /* Use same as Header picker, lighten by 70% */ - --visited-link: #5fa4cc; + --visited-link: #0066cc; /* Use same as Header picker, lighten by 70% */ --hover-link: #86bad8; /* Use same as Header picker, lighten by 70% */ diff --git a/public/css/dist/skins/skin-blue.min.css b/public/css/dist/skins/skin-blue.min.css index cac9000174..89cfda27c4 100644 --- a/public/css/dist/skins/skin-blue.min.css +++ b/public/css/dist/skins/skin-blue.min.css @@ -185,9 +185,9 @@ a.btn-default:hover, /* Use same as Header picker */ --text-main: #BBB; --text-sub: #9b9b9b; - --link: #296282; + --link: #003366; /* Use same as Header picker, lighten by 70% */ - --visited-link: #5fa4cc; + --visited-link: #0066cc; /* Use same as Header picker, lighten by 70% */ --hover-link: #86bad8; /* Use same as Header picker, lighten by 70% */ diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 057ebcf585..966a2ec320 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,7 +1,7 @@ { "/js/build/app.js": "/js/build/app.js?id=65d7af7b9fa7fd0e05737526a0d1d282", "/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=06c13e817cc022028b3f4a33c0ca303a", - "/css/dist/skins/_all-skins.css": "/css/dist/skins/_all-skins.css?id=e71ef4171dee5da63af390966ac60ffc", + "/css/dist/skins/_all-skins.css": "/css/dist/skins/_all-skins.css?id=a134dd4a0ba684f97088d0698e3e5b78", "/css/build/overrides.css": "/css/build/overrides.css?id=6528155ed5ed8fddf4047de7f0d0298d", "/css/build/app.css": "/css/build/app.css?id=3422f2ca2056b952c3c361adf00c10b8", "/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=4ea0068716c1bb2434d87a16d51b98c9", @@ -16,7 +16,7 @@ "/css/dist/skins/skin-green.css": "/css/dist/skins/skin-green.css?id=0a82a6ae6bb4e58fe62d162c4fb50397", "/css/dist/skins/skin-green-dark.css": "/css/dist/skins/skin-green-dark.css?id=bb302302d9566adf783a2b7dc31e840c", "/css/dist/skins/skin-contrast.css": "/css/dist/skins/skin-contrast.css?id=da6c7997d9de2f8329142399f0ce50da", - "/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=f677207c6cf9678eb539abecb408c374", + "/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=00459cc19228b28e7a4d70ce6a2ae1df", "/css/dist/skins/skin-blue-dark.css": "/css/dist/skins/skin-blue-dark.css?id=6ea836d8126de101081c49abbdb89417", "/css/dist/skins/skin-black.css": "/css/dist/skins/skin-black.css?id=76482123f6c70e866d6b971ba91de7bb", "/css/dist/all.css": "/css/dist/all.css?id=18ebb9c284b49dcf6c8e4fdb923ad923", @@ -92,11 +92,11 @@ "/css/webfonts/fa-v4compatibility.woff2": "/css/webfonts/fa-v4compatibility.woff2?id=331c85bd61ffa93af09273d1bc2add5a", "/js/dist/bootstrap-table-locale-all.min.js": "/js/dist/bootstrap-table-locale-all.min.js?id=02dfc50d5b951dc6d260bd508968d319", "/js/dist/bootstrap-table-en-US.min.js": "/js/dist/bootstrap-table-en-US.min.js?id=1c350eabf064c309f67d6779e5cc4afa", - "/css/dist/skins/_all-skins.min.css": "/css/dist/skins/_all-skins.min.css?id=e71ef4171dee5da63af390966ac60ffc", + "/css/dist/skins/_all-skins.min.css": "/css/dist/skins/_all-skins.min.css?id=a134dd4a0ba684f97088d0698e3e5b78", "/css/dist/skins/skin-black-dark.min.css": "/css/dist/skins/skin-black-dark.min.css?id=06c13e817cc022028b3f4a33c0ca303a", "/css/dist/skins/skin-black.min.css": "/css/dist/skins/skin-black.min.css?id=76482123f6c70e866d6b971ba91de7bb", "/css/dist/skins/skin-blue-dark.min.css": "/css/dist/skins/skin-blue-dark.min.css?id=6ea836d8126de101081c49abbdb89417", - "/css/dist/skins/skin-blue.min.css": "/css/dist/skins/skin-blue.min.css?id=f677207c6cf9678eb539abecb408c374", + "/css/dist/skins/skin-blue.min.css": "/css/dist/skins/skin-blue.min.css?id=00459cc19228b28e7a4d70ce6a2ae1df", "/css/dist/skins/skin-contrast.min.css": "/css/dist/skins/skin-contrast.min.css?id=da6c7997d9de2f8329142399f0ce50da", "/css/dist/skins/skin-green-dark.min.css": "/css/dist/skins/skin-green-dark.min.css?id=bb302302d9566adf783a2b7dc31e840c", "/css/dist/skins/skin-green.min.css": "/css/dist/skins/skin-green.min.css?id=0a82a6ae6bb4e58fe62d162c4fb50397", From cb5b0bd89c1ceb8f18290310f4fb5c9ce714f645 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Tue, 4 Mar 2025 15:11:37 -0800 Subject: [PATCH 4/5] Stop reporting report template creates, updates, and deletes to action log --- app/Models/ReportTemplate.php | 38 ------- ...ReportTemplateActionLogTransformerTest.php | 71 ------------- .../ReportTemplateActivityLoggingTest.php | 100 ------------------ 3 files changed, 209 deletions(-) delete mode 100644 tests/Unit/ActionLogTransformer/ReportTemplateActionLogTransformerTest.php delete mode 100644 tests/Unit/Models/ReportTemplates/ReportTemplateActivityLoggingTest.php diff --git a/app/Models/ReportTemplate.php b/app/Models/ReportTemplate.php index 06f0370a00..cdd05b6f50 100644 --- a/app/Models/ReportTemplate.php +++ b/app/Models/ReportTemplate.php @@ -44,44 +44,6 @@ class ReportTemplate extends Model $builder->where('created_by', auth()->id()); } }); - - static::created(function (ReportTemplate $reportTemplate) { - $logAction = new Actionlog([ - 'item_type' => ReportTemplate::class, - 'item_id' => $reportTemplate->id, - 'created_by' => auth()->id(), - ]); - - $logAction->logaction('create'); - }); - - static::updated(function (ReportTemplate $reportTemplate) { - $changed = []; - - foreach ($reportTemplate->getDirty() as $key => $value) { - $changed[$key] = [ - 'old' => $reportTemplate->getOriginal($key), - 'new' => $reportTemplate->getAttribute($key), - ]; - } - - $logAction = new Actionlog(); - $logAction->item_type = ReportTemplate::class; - $logAction->item_id = $reportTemplate->id; - $logAction->created_by = auth()->id(); - $logAction->log_meta = json_encode($changed); - $logAction->logaction('update'); - }); - - static::deleted(function (ReportTemplate $reportTemplate) { - $logAction = new Actionlog([ - 'item_type' => ReportTemplate::class, - 'item_id' => $reportTemplate->id, - 'created_by' => auth()->id(), - ]); - - $logAction->logaction('delete'); - }); } /** diff --git a/tests/Unit/ActionLogTransformer/ReportTemplateActionLogTransformerTest.php b/tests/Unit/ActionLogTransformer/ReportTemplateActionLogTransformerTest.php deleted file mode 100644 index e4d594b497..0000000000 --- a/tests/Unit/ActionLogTransformer/ReportTemplateActionLogTransformerTest.php +++ /dev/null @@ -1,71 +0,0 @@ -create(); - - $actionLogs = Actionlog::query() - ->whereMorphedTo('item', ReportTemplate::class) - ->where('action_type', 'create') - ->get(); - - // should be created when ActionLog is created - $this->assertCount(1, $actionLogs); - - $results = (new ActionlogsTransformer())->transformActionlogs($actionLogs, 10); - - $this->assertArrayHasKey('rows', $results); - $this->assertCount(1, $results['rows']); - } - - public function testLogEntryForUpdatingReportTemplateCanBeDisplayedTransformed() - { - $reportTemplate = ReportTemplate::factory()->create(); - - $reportTemplate->update([ - 'options' => ['new' => 'value'] - ]); - - $actionLogs = Actionlog::query() - ->whereMorphedTo('item', ReportTemplate::class) - ->where('action_type', 'update') - ->get(); - - $this->assertCount(1, $actionLogs); - - $results = (new ActionlogsTransformer())->transformActionlogs($actionLogs, 10); - - $this->assertArrayHasKey('rows', $results); - $this->assertCount(1, $results['rows']); - } - - public function testLogEntryForDeletingReportTemplateCanBeDisplayedTransformed() - { - $reportTemplate = ReportTemplate::factory()->create(); - - $reportTemplate->delete(); - - $actionLogs = Actionlog::query() - ->whereMorphedTo('item', ReportTemplate::class) - ->where('action_type', 'delete') - ->get(); - - $this->assertCount(1, $actionLogs); - - $results = (new ActionlogsTransformer())->transformActionlogs($actionLogs, 10); - - $this->assertArrayHasKey('rows', $results); - $this->assertCount(1, $results['rows']); - } -} diff --git a/tests/Unit/Models/ReportTemplates/ReportTemplateActivityLoggingTest.php b/tests/Unit/Models/ReportTemplates/ReportTemplateActivityLoggingTest.php deleted file mode 100644 index e30a7e2c79..0000000000 --- a/tests/Unit/Models/ReportTemplates/ReportTemplateActivityLoggingTest.php +++ /dev/null @@ -1,100 +0,0 @@ -create(); - $this->actingAs($user); - - $reportTemplate = ReportTemplate::factory()->create(); - - $this->assertDatabaseHas('action_logs', [ - 'created_by' => $user->id, - 'action_type' => 'create', - 'target_id' => null, - 'target_type' => null, - 'item_type' => ReportTemplate::class, - 'item_id' => $reportTemplate->id, - ]); - } - - public function testUpdatingReportTemplateIsLogged() - { - $user = User::factory()->create(); - $this->actingAs($user); - - $reportTemplate = ReportTemplate::factory()->create([ - 'name' => 'Name A', - 'options' => [ - 'company' => '1', - 'location' => '1', - 'by_company_id' => ['1'], - 'by_location_id' => ['17'], - ], - ]); - - $reportTemplate->update([ - 'name' => 'Another Name', - 'options' => [ - 'company' => '1', - 'by_company_id' => ['1'], - ], - ]); - - $this->assertDatabaseHas('action_logs', [ - 'created_by' => $user->id, - 'action_type' => 'update', - 'target_id' => null, - 'target_type' => null, - 'item_type' => ReportTemplate::class, - 'item_id' => $reportTemplate->id, - 'log_meta' => json_encode([ - 'name' => [ - 'old' => 'Name A', - 'new' => 'Another Name' - ], - 'options' => [ - 'old' => [ - 'company' => '1', - 'location' => '1', - 'by_company_id' => ['1'], - 'by_location_id' => ['17'], - ], - 'new' => [ - 'company' => '1', - 'by_company_id' => ['1'], - ], - ], - ]), - ]); - } - - public function testDeletingReportTemplateIsLogged() - { - $user = User::factory()->create(); - $this->actingAs($user); - - $reportTemplate = ReportTemplate::factory()->create(); - - $reportTemplate->delete(); - - $this->assertDatabaseHas('action_logs', [ - 'created_by' => $user->id, - 'action_type' => 'delete', - 'target_id' => null, - 'target_type' => null, - 'item_type' => ReportTemplate::class, - 'item_id' => $reportTemplate->id, - ]); - } -} From e8ee218f39b7dcf7e17da2acc5e7ef4a2e4e3938 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Tue, 4 Mar 2025 15:20:23 -0800 Subject: [PATCH 5/5] Purge activity log of report template data --- ...ction_logs_of_report_template_activity.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 database/migrations/2025_03_04_231256_purge_action_logs_of_report_template_activity.php diff --git a/database/migrations/2025_03_04_231256_purge_action_logs_of_report_template_activity.php b/database/migrations/2025_03_04_231256_purge_action_logs_of_report_template_activity.php new file mode 100644 index 0000000000..150df41a48 --- /dev/null +++ b/database/migrations/2025_03_04_231256_purge_action_logs_of_report_template_activity.php @@ -0,0 +1,26 @@ +where("item_type", ReportTemplate::class) + ->whereIn("action_type", ["create", "update", "delete"]) + ->delete(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // nothing to do here... + } +};