| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | <?php
namespace App\Actions\FilamentCompanies;
use App\Models\Company;
use App\Models\User;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Support\Facades\Gate;
use Illuminate\Validation\ValidationException;
use Wallo\FilamentCompanies\Contracts\RemovesCompanyEmployees;
use Wallo\FilamentCompanies\Events\CompanyEmployeeRemoved;
class RemoveCompanyEmployee implements RemovesCompanyEmployees
{
    /**
     * Remove the company employee from the given company.
     *
     * @throws AuthorizationException
     */
    public function remove(User $user, Company $company, User $companyEmployee): void
    {
        $this->authorize($user, $company, $companyEmployee);
        $this->ensureUserDoesNotOwnCompany($companyEmployee, $company);
        $company->removeUser($companyEmployee);
        CompanyEmployeeRemoved::dispatch($company, $companyEmployee);
    }
    /**
     * Authorize that the user can remove the company employee.
     *
     * @throws AuthorizationException
     */
    protected function authorize(User $user, Company $company, User $companyEmployee): void
    {
        if (! Gate::forUser($user)->check('removeCompanyEmployee', $company) &&
            $user->id !== $companyEmployee->id) {
            throw new AuthorizationException;
        }
    }
    /**
     * Ensure that the currently authenticated user does not own the company.
     */
    protected function ensureUserDoesNotOwnCompany(User $companyEmployee, Company $company): void
    {
        if ($companyEmployee->id === $company->owner->id) {
            throw ValidationException::withMessages([
                'company' => [__('filament-companies::default.errors.cannot_leave_company')],
            ])->errorBag('removeCompanyEmployee');
        }
    }
}
 |