Files
izyim/app/Classes/Modules/ControllersLogic/Accounts/RegistrationInvitationLogic.php
T
2019-02-18 14:38:28 +08:00

68 lines
2.3 KiB
PHP

<?php
namespace App\Classes\Modules\ControllersLogic\Accounts;
use App\Classes\Modules\Accounts\DataTransferObjects\UserInvitationObject;
use App\Classes\Modules\Accounts\Services\CreatesUserInvitation;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\ControllerLogic\Exceptions\ResourceConflictException;
use App\Classes\ValueObjects\Constants\HttpStatus;
use App\Events\Accounts\UserInvited;
use App\Models\UserInvitation;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RegistrationInvitationLogic
{
/** @var UserInvitation */
private $repository;
/** @var CreatesUserInvitation */
private $createUserInvitation;
/**
* RegistrationInvitationLogic constructor.
* @param UserInvitation $repository
* @param CreatesUserInvitation $createUserInvitation
*/
public function __construct(
UserInvitation $repository,
CreatesUserInvitation $createUserInvitation
) {
$this->repository = $repository;
$this->createUserInvitation = $createUserInvitation;
}
/**
* @param Request $request
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(Request $request) {
try {
// the email doesn't exist in the database, so create the user
$object = new UserInvitationObject($request->get('role_id'), $request->get('email'));
// ensure that there is not already an invitation for the email
$existingInvitations = $this->repository->where('email', $object->getInviteeEmail())->get();
if ($existingInvitations->count() !== 0) {
throw new ResourceConflictException("An existing invitation already exists for the email {$object->getInviteeEmail()}");
}
$invitation = $this->createUserInvitation->execute($object);
// dispatch event for user invited
event(new UserInvited($invitation));
return new JsonResponse("Invitation have been sent!", HttpStatus::RESOURCE_CREATED);
} catch (ResourceConflictException $exception) {
throw new InternalServerErrorException("Failed to send user invitation because {$exception->getMessage()}");
}
}
}