diff --git a/app/Entities/Projects/Project.php b/app/Entities/Projects/Project.php index 9834a57..fee1dd3 100755 --- a/app/Entities/Projects/Project.php +++ b/app/Entities/Projects/Project.php @@ -18,6 +18,14 @@ use Laracasts\Presenter\PresentableTrait; class Project extends Model { use PresentableTrait; + /** + * The event map for the model. + * + * @var array + */ + protected $dispatchesEvents = [ + 'updated' => 'App\Events\Projects\Updated', + ]; /** * @var \App\Entities\Projects\ProjectPresenter diff --git a/app/Entities/Users/Activity.php b/app/Entities/Users/Activity.php new file mode 100644 index 0000000..15b92db --- /dev/null +++ b/app/Entities/Users/Activity.php @@ -0,0 +1,12 @@ +project = $project; + } +} diff --git a/app/Listeners/Projects/LogProjectUpdateActivity.php b/app/Listeners/Projects/LogProjectUpdateActivity.php new file mode 100644 index 0000000..6c5e681 --- /dev/null +++ b/app/Listeners/Projects/LogProjectUpdateActivity.php @@ -0,0 +1,61 @@ +project->fresh()->toArray(), $event->project->getOriginal(), $event->project->getDirty()); + $project = $event->project; + // dd($project->getOriginal(), $project->getChanges()); + $originalProject = $project->getOriginal(); + $attributeChanges = $project->getChanges(); + $attributeKeys = array_keys($project->getChanges()); + // dd($attributeChanges, $attributeKeys); + + $activityEntry = [ + 'type' => 'project_updated', + 'parent_id' => null, + 'user_id' => auth()->id(), + 'object_id' => $project->id, + 'object_type' => 'projects', + 'data' => json_encode([ + 'before' => $this->getBeforeValues($originalProject, $attributeKeys), + 'after' => $this->getAfterValues($project->toArray(), $attributeKeys), + 'notes' => null, + ]), + ]; + + Activity::create($activityEntry); + } + + private function getBeforeValues(array $originalProject, array $attributeKeys) + { + $beforeValues = []; + foreach ($attributeKeys as $attributeKey) { + $beforeValues[$attributeKey] = $originalProject[$attributeKey]; + } + + return $beforeValues; + } + + private function getAfterValues(array $project, array $attributeKeys) + { + $afterValues = []; + foreach ($attributeKeys as $attributeKey) { + $afterValues[$attributeKey] = $project[$attributeKey]; + } + + return $afterValues; + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 907cff8..71878ea 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -13,8 +13,8 @@ class EventServiceProvider extends ServiceProvider * @var array */ protected $listen = [ - 'App\Events\SomeEvent' => [ - 'App\Listeners\EventListener', + 'App\Events\Projects\Updated' => [ + 'App\Listeners\Projects\LogProjectUpdateActivity', ], ]; diff --git a/database/migrations/2021_03_05_221708_create_user_activities_table.php b/database/migrations/2021_03_05_221708_create_user_activities_table.php new file mode 100644 index 0000000..a7750aa --- /dev/null +++ b/database/migrations/2021_03_05_221708_create_user_activities_table.php @@ -0,0 +1,40 @@ +increments('id'); + $table->string('type'); + $table->unsignedInteger('parent_id')->nullable()->comment('Parent Activity ID'); + $table->unsignedInteger('user_id')->nullable(); + $table->unsignedInteger('object_id'); + $table->string('object_type', 60); + $table->text('data')->nullable(); + $table->timestamps(); + + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->foreign('parent_id')->references('id')->on('activities')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_activities'); + } +} diff --git a/tests/Unit/Models/ActivityTest.php b/tests/Unit/Models/ActivityTest.php new file mode 100644 index 0000000..ed98b98 --- /dev/null +++ b/tests/Unit/Models/ActivityTest.php @@ -0,0 +1,39 @@ +adminUserSigningIn(); + $project = factory(Project::class)->create(['name' => 'New Project']); + + $project->name = 'Updated project'; + $project->save(); + + $this->seeInDatabase('user_activities', [ + 'type' => 'project_updated', + 'parent_id' => null, + 'user_id' => $admin->id, + 'object_id' => $project->id, + 'object_type' => 'projects', + 'data' => json_encode([ + 'before' => [ + 'name' => 'New Project', + ], + 'after' => [ + 'name' => 'Updated project', + ], + 'notes' => null, + ]), + ]); + } +}