From 0872b6ef1c6d41370a2df37699eb65e54feae174 Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sat, 6 Mar 2021 22:01:56 +0800 Subject: [PATCH] Add job update activity log --- app/Entities/Projects/Job.php | 1 + app/Events/Jobs/Updated.php | 15 +++++++++ app/Listeners/Jobs/LogJobUpdateActivity.php | 52 +++++++++++++++++++++++++++++ app/Providers/EventServiceProvider.php | 3 ++ tests/Unit/Models/ActivityTest.php | 27 +++++++++++++++ 5 files changed, 98 insertions(+) create mode 100644 app/Events/Jobs/Updated.php create mode 100644 app/Listeners/Jobs/LogJobUpdateActivity.php diff --git a/app/Entities/Projects/Job.php b/app/Entities/Projects/Job.php index 57086e3..3b3a491 100755 --- a/app/Entities/Projects/Job.php +++ b/app/Entities/Projects/Job.php @@ -23,6 +23,7 @@ class Job extends Model */ protected $dispatchesEvents = [ 'created' => 'App\Events\Jobs\Created', + 'updated' => 'App\Events\Jobs\Updated', ]; /** diff --git a/app/Events/Jobs/Updated.php b/app/Events/Jobs/Updated.php new file mode 100644 index 0000000..e6ed3f1 --- /dev/null +++ b/app/Events/Jobs/Updated.php @@ -0,0 +1,15 @@ +job = $job; + } +} diff --git a/app/Listeners/Jobs/LogJobUpdateActivity.php b/app/Listeners/Jobs/LogJobUpdateActivity.php new file mode 100644 index 0000000..7567f88 --- /dev/null +++ b/app/Listeners/Jobs/LogJobUpdateActivity.php @@ -0,0 +1,52 @@ +job; + $originalJob = $job->getOriginal(); + $attributeChanges = $job->getChanges(); + $attributeKeys = array_keys($job->getChanges()); + + $activityEntry = [ + 'type' => 'job_updated', + 'parent_id' => null, + 'user_id' => auth()->id(), + 'object_id' => $job->id, + 'object_type' => 'jobs', + 'data' => json_encode([ + 'before' => $this->getBeforeValues($originalJob, $attributeKeys), + 'after' => $this->getAfterValues($job->toArray(), $attributeKeys), + 'notes' => null, + ]), + ]; + + Activity::create($activityEntry); + } + + private function getBeforeValues(array $originalJob, array $attributeKeys) + { + $beforeValues = []; + foreach ($attributeKeys as $attributeKey) { + $beforeValues[$attributeKey] = $originalJob[$attributeKey]; + } + + return $beforeValues; + } + + private function getAfterValues(array $job, array $attributeKeys) + { + $afterValues = []; + foreach ($attributeKeys as $attributeKey) { + $afterValues[$attributeKey] = $job[$attributeKey]; + } + + return $afterValues; + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index d6d3121..8bd3a50 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -22,6 +22,9 @@ class EventServiceProvider extends ServiceProvider 'App\Events\Jobs\Created' => [ 'App\Listeners\Jobs\LogJobCreationActivity', ], + 'App\Events\Jobs\Updated' => [ + 'App\Listeners\Jobs\LogJobUpdateActivity', + ], ]; /** diff --git a/tests/Unit/Models/ActivityTest.php b/tests/Unit/Models/ActivityTest.php index 8f51c88..a13a33b 100644 --- a/tests/Unit/Models/ActivityTest.php +++ b/tests/Unit/Models/ActivityTest.php @@ -66,4 +66,31 @@ class ActivityTest extends TestCase 'data' => null, ]); } + + /** @test */ + public function it_records_job_data_update_activities() + { + $admin = $this->adminUserSigningIn(); + $project = factory(Project::class)->create(); + $job = factory(Job::class)->create([ + 'name' => 'New Job', + 'project_id' => $project->id, + ]); + + $job->name = 'Updated job'; + $job->save(); + + $this->seeInDatabase('user_activities', [ + 'type' => 'job_updated', + 'parent_id' => null, + 'user_id' => $admin->id, + 'object_id' => $job->id, + 'object_type' => 'jobs', + 'data' => json_encode([ + 'before' => ['name' => 'New Job'], + 'after' => ['name' => 'Updated job'], + 'notes' => null, + ]), + ]); + } }