HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/xedaptot/hi.naniguide.com/app/Http/Controllers/Customer/WorkspaceInvitationController.php
<?php

namespace App\Http\Controllers\Customer;

use App\Http\Controllers\Controller;
use App\Models\Customer;
use App\Models\WorkspaceActivityLog;
use App\Models\WorkspaceInvitation;
use App\Models\WorkspaceMember;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\View\View;

class WorkspaceInvitationController extends Controller
{
    public function accept(Request $request, string $token): View|RedirectResponse
    {
        $invitation = WorkspaceInvitation::where('token', $token)
            ->with(['workspace', 'role'])
            ->first();

        if (!$invitation) {
            abort(404, __('Invitation not found.'));
        }

        if ($invitation->isAccepted()) {
            return redirect()->route('login')
                ->with('info', __('This invitation has already been accepted.'));
        }

        if ($invitation->isExpired()) {
            return redirect()->route('login')
                ->with('error', __('This invitation has expired. Please ask the workspace owner to send a new one.'));
        }

        $customer = Auth::guard('customer')->user();

        if ($customer) {
            return $this->acceptForCustomer($invitation, $customer);
        }

        $existingCustomer = Customer::where('email', $invitation->email)->first();
        if ($existingCustomer) {
            return redirect()->route('login')
                ->with('info', __('Please log in to accept the workspace invitation.'));
        }

        return view('customer.workspaces.accept-invitation', compact('invitation'));
    }

    public function acceptAndRegister(Request $request, string $token): RedirectResponse
    {
        $invitation = WorkspaceInvitation::where('token', $token)
            ->with(['workspace', 'role'])
            ->first();

        if (!$invitation || $invitation->isAccepted() || $invitation->isExpired()) {
            return redirect()->route('login')
                ->with('error', __('This invitation is no longer valid.'));
        }

        $existingCustomer = Customer::where('email', $invitation->email)->first();

        if ($existingCustomer) {
            return $this->acceptForCustomer($invitation, $existingCustomer);
        }

        $validated = $request->validate([
            'name'     => 'required|string|max:100',
            'password' => 'required|string|min:8|confirmed',
        ]);

        $nameParts = explode(' ', $validated['name'], 2);

        $customer = Customer::create([
            'first_name'        => $nameParts[0],
            'last_name'         => $nameParts[1] ?? '',
            'email'             => $invitation->email,
            'password'          => Hash::make($validated['password']),
            'status'            => 'active',
            'email_verified_at' => now(),
        ]);

        $member = $this->createMember($invitation, $customer);
        $invitation->update(['accepted_at' => now()]);

        WorkspaceActivityLog::log($invitation->workspace_id, 'member.joined', $member->id, WorkspaceMember::class, $member->id, [
            'email' => $customer->email,
            'via'   => 'registration',
        ]);

        Auth::guard('customer')->login($customer);
        session(['active_workspace_id' => $invitation->workspace_id]);

        return redirect()->route('customer.workspaces.show', $invitation->workspace)
            ->with('success', __('Welcome to ":name"!', ['name' => $invitation->workspace->name]));
    }

    private function acceptForCustomer(WorkspaceInvitation $invitation, Customer $customer): RedirectResponse
    {
        $existing = WorkspaceMember::where('workspace_id', $invitation->workspace_id)
            ->where('customer_id', $customer->id)
            ->where('status', 'active')
            ->first();

        if ($existing) {
            $invitation->update(['accepted_at' => now()]);

            return redirect()->route('customer.workspaces.show', $invitation->workspace)
                ->with('info', __('You are already a member of this workspace.'));
        }

        $member = $this->createMember($invitation, $customer);
        $invitation->update(['accepted_at' => now()]);

        WorkspaceActivityLog::log($invitation->workspace_id, 'member.joined', $member->id, WorkspaceMember::class, $member->id, [
            'email' => $customer->email,
            'via'   => 'existing_account',
        ]);

        session(['active_workspace_id' => $invitation->workspace_id]);

        return redirect()->route('customer.workspaces.show', $invitation->workspace)
            ->with('success', __('You\'ve joined ":name"!', ['name' => $invitation->workspace->name]));
    }

    private function createMember(WorkspaceInvitation $invitation, Customer $customer): WorkspaceMember
    {
        $existing = WorkspaceMember::where('workspace_id', $invitation->workspace_id)
            ->where('email', $invitation->email)
            ->first();

        if ($existing) {
            $existing->update([
                'customer_id'       => $customer->id,
                'workspace_role_id' => $invitation->workspace_role_id,
                'status'            => 'active',
                'accepted_at'       => now(),
            ]);

            return $existing;
        }

        return WorkspaceMember::create([
            'workspace_id'      => $invitation->workspace_id,
            'customer_id'       => $customer->id,
            'email'             => $invitation->email,
            'name'              => $customer->full_name,
            'workspace_role_id' => $invitation->workspace_role_id,
            'status'            => 'active',
            'invited_by'        => $invitation->invited_by,
            'invited_at'        => $invitation->created_at,
            'accepted_at'       => now(),
        ]);
    }
}