mirror of
https://github.com/solidtime-io/solidtime.git
synced 2026-05-07 20:32:26 +00:00
44 lines
1.3 KiB
PHP
44 lines
1.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Service;
|
|
|
|
use App\Enums\Role;
|
|
use App\Exceptions\Api\UserIsAlreadyMemberOfOrganizationApiException;
|
|
use App\Mail\OrganizationInvitationMail;
|
|
use App\Models\Member;
|
|
use App\Models\Organization;
|
|
use App\Models\OrganizationInvitation;
|
|
use Illuminate\Support\Facades\Mail;
|
|
use Laravel\Jetstream\Events\InvitingTeamMember;
|
|
|
|
class InvitationService
|
|
{
|
|
/**
|
|
* @throws UserIsAlreadyMemberOfOrganizationApiException
|
|
*/
|
|
public function inviteUser(Organization $organization, string $email, Role $role): OrganizationInvitation
|
|
{
|
|
if (Member::query()
|
|
->whereBelongsTo($organization, 'organization')
|
|
->whereRelation('user', 'email', '=', $email)
|
|
->where('role', '!=', Role::Placeholder->value)
|
|
->exists()) {
|
|
throw new UserIsAlreadyMemberOfOrganizationApiException();
|
|
}
|
|
|
|
InvitingTeamMember::dispatch($organization, $email, $role->value);
|
|
|
|
$invitation = new OrganizationInvitation();
|
|
$invitation->email = $email;
|
|
$invitation->role = $role->value;
|
|
$invitation->organization()->associate($organization);
|
|
$invitation->save();
|
|
|
|
Mail::to($email)->queue(new OrganizationInvitationMail($invitation));
|
|
|
|
return $invitation;
|
|
}
|
|
}
|