Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 91 additions & 0 deletions app/HMS/Entities/RoleUpdate.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
<?php

namespace HMS\Entities;

use Carbon\Carbon;

class RoleUpdate
{
/**
* @var int
*/
protected $id;

/**
* @var User
*/
protected $user;

/**
* @var ?Role
*/
protected $roleAdded;

/**
* @var ?Role
*/
protected $roleRemoved;

/**
* @var Carbon
*/
protected $createdAt;

public function __construct(User $user, ?Role $roleAdded = null, ?Role $roleRemoved = null)
{
$this->user = $user;
$this->roleAdded = $roleAdded;
$this->roleRemoved = $roleRemoved;
$this->createdAt = Carbon::now();
}

/**
* Gets the value of id.
*
* @return int
*/
public function getId(): int
{
return $this->id;
}

/**
* Gets the value of user.
*
* @return User
*/
public function getUser(): User
{
return $this->user;
}

/**
* Gets the value of roleAdded.
*
* @return ?Role
*/
public function getRoleAdded(): ?Role
{
return $this->roleAdded;
}

/**
* Gets the value of roleRemoved.
*
* @return ?Role
*/
public function getRoleRemoved(): ?Role
{
return $this->roleRemoved;
}

/**
* Gets the value of createdAt.
*
* @return Carbon
*/
public function getCreatedAt(): Carbon
{
return $this->createdAt;
}
}
30 changes: 30 additions & 0 deletions app/HMS/Mappings/HMS.Entities.RoleUpdate.dcm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# HMS.Entities.RoleUpdate.dcm.yml
HMS\Entities\RoleUpdate:
type: entity
repositoryClass: HMS\Repository\RoleUpdateRepository
table: role_updates
id:
id:
type: integer
options:
unsigned: true
generator:
strategy: AUTO
fields:
createdAt:
type: datetime
gedmo:
timestampable:
on: create
manyToOne:
user:
targetEntity: User
nullable: false
roleAdded:
targetEntity: Role
joinColumn:
name: added_role_id
roleRemoved:
targetEntity: Role
joinColumn:
name: removed_role_id
39 changes: 39 additions & 0 deletions app/HMS/Repositories/Doctrine/DoctrineRoleUpdateRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

namespace HMS\Repositories\Doctrine;

use HMS\Entities\User;
use HMS\Entities\RoleUpdate;
use Doctrine\ORM\EntityRepository;
use HMS\Repositories\RoleUpdateRepository;

class DoctrineRoleUpdateRepository extends EntityRepository implements RoleUpdateRepository
{
/**
* @param $id
* @return array
*/
public function find($id)
{
return parent::find($id);
}

/**
* @param User $user
* @return array
*/
public function findByUser(User $user)
{
return parent::findByUser($user);
}

/**
* save RoleUpdate to the DB.
* @param RoleUpdate $roleUpdate
*/
public function save(RoleUpdate $roleUpdate)
{
$this->_em->persist($roleUpdate);
$this->_em->flush();
}
}
27 changes: 27 additions & 0 deletions app/HMS/Repositories/RoleUpdateRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace HMS\Repositories;

use HMS\Entities\User;
use HMS\Entities\RoleUpdate;

interface RoleUpdateRepository
{
/**
* @param $id
* @return array
*/
public function find($id);

/**
* @param User $user
* @return array
*/
public function findByUser(User $user);

/**
* save RoleUpdate to the DB.
* @param RoleUpdate $roleUpdate
*/
public function save(RoleUpdate $roleUpdate);
}
11 changes: 10 additions & 1 deletion app/HMS/User/Permissions/RoleManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use HMS\Repositories\RoleRepository;
use HMS\Repositories\UserRepository;
use App\Events\Roles\UserAddedToRole;
use Doctrine\ORM\EntityManagerInterface;
use App\Events\Roles\UserRemovedFromRole;
use HMS\Repositories\PermissionRepository;

Expand All @@ -27,16 +28,22 @@ class RoleManager
*/
protected $userRepository;

/**
* @var EntityManagerInterface
*/
protected $entityManager;

/**
* Create a new RoleManager instance.
*
* @param HMS\Repositories\RoleRepository $roleRepository An instance of a role repository
*/
public function __construct(RoleRepository $roleRepository, PermissionRepository $permissionRepository, UserRepository $userRepository)
public function __construct(RoleRepository $roleRepository, PermissionRepository $permissionRepository, UserRepository $userRepository, EntityManagerInterface $entityManager)
{
$this->roleRepository = $roleRepository;
$this->permissionRepository = $permissionRepository;
$this->userRepository = $userRepository;
$this->entityManager = $entityManager;
}

/**
Expand Down Expand Up @@ -89,6 +96,7 @@ public function addUserToRole(User $user, Role $role)
$user->getRoles()->add($role);
$this->userRepository->save($user);
event(new UserAddedToRole($user, $role));
$this->entityManager->refresh($user);
}

/**
Expand All @@ -114,5 +122,6 @@ public function removeUserFromRole(User $user, Role $role)
$user->getRoles()->removeElement($role);
$this->userRepository->save($user);
event(new UserRemovedFromRole($user, $role));
$this->entityManager->refresh($user);
}
}
86 changes: 86 additions & 0 deletions app/Listeners/RoleUpdateLogger.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<?php

namespace App\Listeners;

use HMS\Entities\Role;
use HMS\Entities\RoleUpdate;
use App\Events\Roles\UserAddedToRole;
use Doctrine\ORM\EntityManagerInterface;
use Illuminate\Queue\InteractsWithQueue;
use App\Events\Roles\UserRemovedFromRole;
use HMS\Repositories\RoleUpdateRepository;
use Illuminate\Contracts\Queue\ShouldQueue;

class RoleUpdateLogger implements ShouldQueue
{
use InteractsWithQueue;

/**
* @var RoleUpdateRepository
*/
protected $roleUpdateRepository;

/**
* @var EntityManagerInterface
*/
protected $entityManager;

/**
* Create the event listener.
*
* @param RoleUpdateRepository $roleUpdateRepository
*/
public function __construct(RoleUpdateRepository $roleUpdateRepository, EntityManagerInterface $entityManager)
{
$this->roleUpdateRepository = $roleUpdateRepository;
$this->entityManager = $entityManager;
}

/**
* Handle user added to role events.
*
* @param UserAddedToRole $event
*/
public function onUserAddedToRole(UserAddedToRole $event)
{
if ($event->role->getName() == Role::MEMBER_APPROVAL) {
return;
}

$user = $this->entityManager->merge($event->user);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The thing gets done before the log update entity gets persisted. What are the needs around atomicity?

$role = $this->entityManager->merge($event->role);
$roleUpdate = new RoleUpdate($user, $role);
$this->roleUpdateRepository->save($roleUpdate);
}

/**
* Handle user removed from role events.
*
* @param UserRemovedFromRole $event
*/
public function onUserRemovedFromRole(UserRemovedFromRole $event)
{
$user = $this->entityManager->merge($event->user);
$role = $this->entityManager->merge($event->role);
$roleUpdate = new RoleUpdate($user, null, $role);
$this->roleUpdateRepository->save($roleUpdate);
}

/**
* Register the listeners for the subscriber.
*
* @param Illuminate\Events\Dispatcher $events
*/
public function subscribe($events)
{
$events->listen(
'App\Events\Roles\UserAddedToRole',
'App\Listeners\RoleUpdateLogger@onUserAddedToRole'
);

$events->listen(
'App\Events\Roles\UserRemovedFromRole',
'App\Listeners\RoleUpdateLogger@onUserRemovedFromRole'
);
}
}
9 changes: 9 additions & 0 deletions app/Providers/EventServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,15 @@ class EventServiceProvider extends ServiceProvider
],
];

/**
* The subscriber classes to register.
*
* @var array
*/
protected $subscribe = [
'App\Listeners\RoleUpdateLogger',
];

/**
* Register any events for your application.
*
Expand Down
7 changes: 7 additions & 0 deletions app/Providers/RepositoryServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use HMS\Entities\User;
use HMS\Entities\Invite;
use HMS\Entities\Profile;
use HMS\Entities\RoleUpdate;
use HMS\Entities\Banking\Account;
use HMS\Repositories\LinkRepository;
use HMS\Repositories\MetaRepository;
Expand All @@ -17,6 +18,7 @@
use HMS\Repositories\ProfileRepository;
use Illuminate\Support\ServiceProvider;
use HMS\Repositories\PermissionRepository;
use HMS\Repositories\RoleUpdateRepository;
use HMS\Repositories\Banking\AccountRepository;
use LaravelDoctrine\ACL\Permissions\Permission;
use HMS\Repositories\Doctrine\DoctrineLinkRepository;
Expand All @@ -26,6 +28,7 @@
use HMS\Repositories\Doctrine\DoctrineInviteRepository;
use HMS\Repositories\Doctrine\DoctrineProfileRepository;
use HMS\Repositories\Doctrine\DoctrinePermissionRepository;
use HMS\Repositories\Doctrine\DoctrineRoleUpdateRepository;
use HMS\Repositories\Banking\Doctrine\DoctrineAccountRepository;

class RepositoryServiceProvider extends ServiceProvider
Expand Down Expand Up @@ -78,5 +81,9 @@ public function register()
$this->app->singleton(AccountRepository::class, function ($app) {
return new DoctrineAccountRepository($app['em'], $app['em']->getClassMetaData(Account::class));
});

$this->app->singleton(RoleUpdateRepository::class, function ($app) {
return new DoctrineRoleUpdateRepository($app['em'], $app['em']->getClassMetaData(RoleUpdate::class));
});
}
}
Loading