Skip to content

Commit 5263914

Browse files
authored
Merge pull request #147 from NottingHack/role-status-log
RoleUpdateLogger: log changes in roles
2 parents 7d5c05d + 621adfd commit 5263914

File tree

9 files changed

+339
-1
lines changed

9 files changed

+339
-1
lines changed

app/HMS/Entities/RoleUpdate.php

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?php
2+
3+
namespace HMS\Entities;
4+
5+
use Carbon\Carbon;
6+
7+
class RoleUpdate
8+
{
9+
/**
10+
* @var int
11+
*/
12+
protected $id;
13+
14+
/**
15+
* @var User
16+
*/
17+
protected $user;
18+
19+
/**
20+
* @var ?Role
21+
*/
22+
protected $roleAdded;
23+
24+
/**
25+
* @var ?Role
26+
*/
27+
protected $roleRemoved;
28+
29+
/**
30+
* @var Carbon
31+
*/
32+
protected $createdAt;
33+
34+
public function __construct(User $user, ?Role $roleAdded = null, ?Role $roleRemoved = null)
35+
{
36+
$this->user = $user;
37+
$this->roleAdded = $roleAdded;
38+
$this->roleRemoved = $roleRemoved;
39+
$this->createdAt = Carbon::now();
40+
}
41+
42+
/**
43+
* Gets the value of id.
44+
*
45+
* @return int
46+
*/
47+
public function getId(): int
48+
{
49+
return $this->id;
50+
}
51+
52+
/**
53+
* Gets the value of user.
54+
*
55+
* @return User
56+
*/
57+
public function getUser(): User
58+
{
59+
return $this->user;
60+
}
61+
62+
/**
63+
* Gets the value of roleAdded.
64+
*
65+
* @return ?Role
66+
*/
67+
public function getRoleAdded(): ?Role
68+
{
69+
return $this->roleAdded;
70+
}
71+
72+
/**
73+
* Gets the value of roleRemoved.
74+
*
75+
* @return ?Role
76+
*/
77+
public function getRoleRemoved(): ?Role
78+
{
79+
return $this->roleRemoved;
80+
}
81+
82+
/**
83+
* Gets the value of createdAt.
84+
*
85+
* @return Carbon
86+
*/
87+
public function getCreatedAt(): Carbon
88+
{
89+
return $this->createdAt;
90+
}
91+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# HMS.Entities.RoleUpdate.dcm.yml
2+
HMS\Entities\RoleUpdate:
3+
type: entity
4+
repositoryClass: HMS\Repository\RoleUpdateRepository
5+
table: role_updates
6+
id:
7+
id:
8+
type: integer
9+
options:
10+
unsigned: true
11+
generator:
12+
strategy: AUTO
13+
fields:
14+
createdAt:
15+
type: datetime
16+
gedmo:
17+
timestampable:
18+
on: create
19+
manyToOne:
20+
user:
21+
targetEntity: User
22+
nullable: false
23+
roleAdded:
24+
targetEntity: Role
25+
joinColumn:
26+
name: added_role_id
27+
roleRemoved:
28+
targetEntity: Role
29+
joinColumn:
30+
name: removed_role_id
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace HMS\Repositories\Doctrine;
4+
5+
use HMS\Entities\User;
6+
use HMS\Entities\RoleUpdate;
7+
use Doctrine\ORM\EntityRepository;
8+
use HMS\Repositories\RoleUpdateRepository;
9+
10+
class DoctrineRoleUpdateRepository extends EntityRepository implements RoleUpdateRepository
11+
{
12+
/**
13+
* @param $id
14+
* @return array
15+
*/
16+
public function find($id)
17+
{
18+
return parent::find($id);
19+
}
20+
21+
/**
22+
* @param User $user
23+
* @return array
24+
*/
25+
public function findByUser(User $user)
26+
{
27+
return parent::findByUser($user);
28+
}
29+
30+
/**
31+
* save RoleUpdate to the DB.
32+
* @param RoleUpdate $roleUpdate
33+
*/
34+
public function save(RoleUpdate $roleUpdate)
35+
{
36+
$this->_em->persist($roleUpdate);
37+
$this->_em->flush();
38+
}
39+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace HMS\Repositories;
4+
5+
use HMS\Entities\User;
6+
use HMS\Entities\RoleUpdate;
7+
8+
interface RoleUpdateRepository
9+
{
10+
/**
11+
* @param $id
12+
* @return array
13+
*/
14+
public function find($id);
15+
16+
/**
17+
* @param User $user
18+
* @return array
19+
*/
20+
public function findByUser(User $user);
21+
22+
/**
23+
* save RoleUpdate to the DB.
24+
* @param RoleUpdate $roleUpdate
25+
*/
26+
public function save(RoleUpdate $roleUpdate);
27+
}

app/HMS/User/Permissions/RoleManager.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use HMS\Repositories\RoleRepository;
88
use HMS\Repositories\UserRepository;
99
use App\Events\Roles\UserAddedToRole;
10+
use Doctrine\ORM\EntityManagerInterface;
1011
use App\Events\Roles\UserRemovedFromRole;
1112
use HMS\Repositories\PermissionRepository;
1213

@@ -27,16 +28,22 @@ class RoleManager
2728
*/
2829
protected $userRepository;
2930

31+
/**
32+
* @var EntityManagerInterface
33+
*/
34+
protected $entityManager;
35+
3036
/**
3137
* Create a new RoleManager instance.
3238
*
3339
* @param HMS\Repositories\RoleRepository $roleRepository An instance of a role repository
3440
*/
35-
public function __construct(RoleRepository $roleRepository, PermissionRepository $permissionRepository, UserRepository $userRepository)
41+
public function __construct(RoleRepository $roleRepository, PermissionRepository $permissionRepository, UserRepository $userRepository, EntityManagerInterface $entityManager)
3642
{
3743
$this->roleRepository = $roleRepository;
3844
$this->permissionRepository = $permissionRepository;
3945
$this->userRepository = $userRepository;
46+
$this->entityManager = $entityManager;
4047
}
4148

4249
/**
@@ -89,6 +96,7 @@ public function addUserToRole(User $user, Role $role)
8996
$user->getRoles()->add($role);
9097
$this->userRepository->save($user);
9198
event(new UserAddedToRole($user, $role));
99+
$this->entityManager->refresh($user);
92100
}
93101

94102
/**
@@ -114,5 +122,6 @@ public function removeUserFromRole(User $user, Role $role)
114122
$user->getRoles()->removeElement($role);
115123
$this->userRepository->save($user);
116124
event(new UserRemovedFromRole($user, $role));
125+
$this->entityManager->refresh($user);
117126
}
118127
}

app/Listeners/RoleUpdateLogger.php

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
3+
namespace App\Listeners;
4+
5+
use HMS\Entities\Role;
6+
use HMS\Entities\RoleUpdate;
7+
use HMS\Repositories\RoleRepository;
8+
use HMS\Repositories\UserRepository;
9+
use App\Events\Roles\UserAddedToRole;
10+
use Doctrine\ORM\EntityManagerInterface;
11+
use Illuminate\Queue\InteractsWithQueue;
12+
use App\Events\Roles\UserRemovedFromRole;
13+
use HMS\Repositories\RoleUpdateRepository;
14+
use Illuminate\Contracts\Queue\ShouldQueue;
15+
16+
class RoleUpdateLogger implements ShouldQueue
17+
{
18+
use InteractsWithQueue;
19+
20+
/**
21+
* @var RoleUpdateRepository
22+
*/
23+
protected $roleUpdateRepository;
24+
25+
/**
26+
* @var EntityManagerInterface
27+
*/
28+
protected $entityManager;
29+
30+
/**
31+
* @var UserRepository
32+
*/
33+
protected $userRepository;
34+
35+
/**
36+
* @var RoleRepository
37+
*/
38+
protected $roleRepository;
39+
40+
/**
41+
* Create the event listener.
42+
*
43+
* @param RoleUpdateRepository $roleUpdateRepository
44+
*/
45+
public function __construct(RoleUpdateRepository $roleUpdateRepository, EntityManagerInterface $entityManager, UserRepository $userRepository, RoleRepository $roleRepository)
46+
{
47+
$this->roleUpdateRepository = $roleUpdateRepository;
48+
$this->entityManager = $entityManager;
49+
$this->userRepository = $userRepository;
50+
$this->roleRepository = $roleRepository;
51+
}
52+
53+
/**
54+
* Handle user added to role events.
55+
*
56+
* @param UserAddedToRole $event
57+
*/
58+
public function onUserAddedToRole(UserAddedToRole $event)
59+
{
60+
if ($event->role->getName() == Role::MEMBER_APPROVAL) {
61+
return;
62+
}
63+
64+
$user = $this->userRepository->find($event->user->getId());
65+
$role = $this->roleRepository->find($event->role->getId());
66+
$roleUpdate = new RoleUpdate($user, $role);
67+
$this->roleUpdateRepository->save($roleUpdate);
68+
}
69+
70+
/**
71+
* Handle user removed from role events.
72+
*
73+
* @param UserRemovedFromRole $event
74+
*/
75+
public function onUserRemovedFromRole(UserRemovedFromRole $event)
76+
{
77+
$user = $this->userRepository->find($event->user->getId());
78+
$role = $this->roleRepository->find($event->role->getId());
79+
$roleUpdate = new RoleUpdate($user, null, $role);
80+
$this->roleUpdateRepository->save($roleUpdate);
81+
}
82+
83+
/**
84+
* Register the listeners for the subscriber.
85+
*
86+
* @param Illuminate\Events\Dispatcher $events
87+
*/
88+
public function subscribe($events)
89+
{
90+
$events->listen(
91+
'App\Events\Roles\UserAddedToRole',
92+
'App\Listeners\RoleUpdateLogger@onUserAddedToRole'
93+
);
94+
95+
$events->listen(
96+
'App\Events\Roles\UserRemovedFromRole',
97+
'App\Listeners\RoleUpdateLogger@onUserRemovedFromRole'
98+
);
99+
}
100+
}

app/Providers/EventServiceProvider.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ class EventServiceProvider extends ServiceProvider
2525
],
2626
];
2727

28+
/**
29+
* The subscriber classes to register.
30+
*
31+
* @var array
32+
*/
33+
protected $subscribe = [
34+
'App\Listeners\RoleUpdateLogger',
35+
];
36+
2837
/**
2938
* Register any events for your application.
3039
*

config/repositories.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@
4141
'Profile',
4242
'Banking\Account',
4343
'Email',
44+
'RoleUpdate',
4445
],
4546
];
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace Database\Migrations;
4+
5+
use Doctrine\DBAL\Schema\Schema as Schema;
6+
use Doctrine\DBAL\Migrations\AbstractMigration;
7+
8+
class Version20170512090722_add_role_update_table extends AbstractMigration
9+
{
10+
/**
11+
* @param Schema $schema
12+
*/
13+
public function up(Schema $schema)
14+
{
15+
$this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.');
16+
17+
$this->addSql('CREATE TABLE role_updates (id INT UNSIGNED AUTO_INCREMENT NOT NULL, user_id INT UNSIGNED DEFAULT NULL, added_role_id INT UNSIGNED DEFAULT NULL, removed_role_id INT UNSIGNED DEFAULT NULL, created_at DATETIME NOT NULL, INDEX IDX_6123F820A76ED395 (user_id), INDEX IDX_6123F820E660F4B0 (added_role_id), INDEX IDX_6123F82085D15B53 (removed_role_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
18+
$this->addSql('ALTER TABLE role_updates ADD CONSTRAINT FK_6123F820A76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
19+
$this->addSql('ALTER TABLE role_updates ADD CONSTRAINT FK_6123F820E660F4B0 FOREIGN KEY (added_role_id) REFERENCES roles (id)');
20+
$this->addSql('ALTER TABLE role_updates ADD CONSTRAINT FK_6123F82085D15B53 FOREIGN KEY (removed_role_id) REFERENCES roles (id)');
21+
}
22+
23+
/**
24+
* @param Schema $schema
25+
*/
26+
public function down(Schema $schema)
27+
{
28+
$this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.');
29+
30+
$this->addSql('DROP TABLE role_updates');
31+
}
32+
}

0 commit comments

Comments
 (0)