Skip to content

Commit fd6b2be

Browse files
committed
RoleUpdateLogger: log changes in roles
Closes #126
1 parent 3f384d4 commit fd6b2be

File tree

9 files changed

+331
-1
lines changed

9 files changed

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

app/Providers/EventServiceProvider.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ class EventServiceProvider extends ServiceProvider
2121
],
2222
];
2323

24+
/**
25+
* The subscriber classes to register.
26+
*
27+
* @var array
28+
*/
29+
protected $subscribe = [
30+
'App\Listeners\RoleUpdateLogger',
31+
];
32+
2433
/**
2534
* Register any events for your application.
2635
*

app/Providers/RepositoryServiceProvider.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use HMS\Entities\User;
99
use HMS\Entities\Invite;
1010
use HMS\Entities\Profile;
11+
use HMS\Entities\RoleUpdate;
1112
use HMS\Entities\Banking\Account;
1213
use HMS\Repositories\LinkRepository;
1314
use HMS\Repositories\MetaRepository;
@@ -17,6 +18,7 @@
1718
use HMS\Repositories\ProfileRepository;
1819
use Illuminate\Support\ServiceProvider;
1920
use HMS\Repositories\PermissionRepository;
21+
use HMS\Repositories\RoleUpdateRepository;
2022
use HMS\Repositories\Banking\AccountRepository;
2123
use LaravelDoctrine\ACL\Permissions\Permission;
2224
use HMS\Repositories\Doctrine\DoctrineLinkRepository;
@@ -26,6 +28,7 @@
2628
use HMS\Repositories\Doctrine\DoctrineInviteRepository;
2729
use HMS\Repositories\Doctrine\DoctrineProfileRepository;
2830
use HMS\Repositories\Doctrine\DoctrinePermissionRepository;
31+
use HMS\Repositories\Doctrine\DoctrineRoleUpdateRepository;
2932
use HMS\Repositories\Banking\Doctrine\DoctrineAccountRepository;
3033

3134
class RepositoryServiceProvider extends ServiceProvider
@@ -78,5 +81,9 @@ public function register()
7881
$this->app->singleton(AccountRepository::class, function ($app) {
7982
return new DoctrineAccountRepository($app['em'], $app['em']->getClassMetaData(Account::class));
8083
});
84+
85+
$this->app->singleton(RoleUpdateRepository::class, function ($app) {
86+
return new DoctrineRoleUpdateRepository($app['em'], $app['em']->getClassMetaData(RoleUpdate::class));
87+
});
8188
}
8289
}

0 commit comments

Comments
 (0)