Browse Source

Add user activites on a project update

pull/72/head
Nafies Luthfi 5 years ago
parent
commit
c99301797c
  1. 8
      app/Entities/Projects/Project.php
  2. 12
      app/Entities/Users/Activity.php
  3. 20
      app/Events/Projects/Updated.php
  4. 61
      app/Listeners/Projects/LogProjectUpdateActivity.php
  5. 4
      app/Providers/EventServiceProvider.php
  6. 40
      database/migrations/2021_03_05_221708_create_user_activities_table.php
  7. 39
      tests/Unit/Models/ActivityTest.php

8
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

12
app/Entities/Users/Activity.php

@ -0,0 +1,12 @@
<?php
namespace App\Entities\Users;
use Illuminate\Database\Eloquent\Model;
class Activity extends Model
{
protected $table = 'user_activities';
protected $fillable = ['type', 'parent_id', 'user_id', 'object_id', 'object_type', 'data'];
}

20
app/Events/Projects/Updated.php

@ -0,0 +1,20 @@
<?php
namespace App\Events\Projects;
use App\Entities\Projects\Project;
class Updated
{
public $project;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Project $project)
{
$this->project = $project;
}
}

61
app/Listeners/Projects/LogProjectUpdateActivity.php

@ -0,0 +1,61 @@
<?php
namespace App\Listeners\Projects;
use App\Entities\Users\Activity;
use App\Events\Projects\Updated;
class LogProjectUpdateActivity
{
/**
* Handle the event.
*
* @param Updated $event
* @return void
*/
public function handle(Updated $event)
{
// dd($event->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;
}
}

4
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',
],
];

40
database/migrations/2021_03_05_221708_create_user_activities_table.php

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUserActivitiesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('user_activities', function (Blueprint $table) {
$table->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');
}
}

39
tests/Unit/Models/ActivityTest.php

@ -0,0 +1,39 @@
<?php
namespace Tests\Unit\Models;
use App\Entities\Projects\Project;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ActivityTest extends TestCase
{
use RefreshDatabase;
/** @test */
public function it_records_project_data_update()
{
$admin = $this->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,
]),
]);
}
}
Loading…
Cancel
Save