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/TrackingDomainController.php
<?php

namespace App\Http\Controllers\Customer;

use App\Http\Controllers\Controller;
use App\Models\TrackingDomain;
use App\Services\TrackingDomainService;
use Illuminate\Http\Request;

class TrackingDomainController extends Controller
{
    public function __construct(
        protected TrackingDomainService $trackingDomainService
    ) {
        $this->middleware('customer.access:domains.tracking_domains.permissions.can_access_tracking_domains')->only([
            'index',
            'show',
        ]);
        $this->middleware('customer.access:domains.tracking_domains.permissions.can_create_tracking_domains')->only([
            'create',
            'store',
        ]);
        $this->middleware('customer.access:domains.tracking_domains.permissions.can_edit_tracking_domains')->only([
            'edit',
            'update',
            'verify',
            'markVerified',
        ]);
        $this->middleware('customer.access:domains.tracking_domains.permissions.can_delete_tracking_domains')->only([
            'destroy',
        ]);
    }

    protected function authorizeManage(TrackingDomain $trackingDomain): TrackingDomain
    {
        $customer = auth('customer')->user();

        if (!$customer || !$this->workspaceResourceMatches($trackingDomain, $customer)) {
            abort(404);
        }

        return $trackingDomain;
    }

    protected function authorizeView(TrackingDomain $trackingDomain): TrackingDomain
    {
        $customer = auth('customer')->user();
        if (!$customer) {
            abort(404);
        }

        if ($this->workspaceResourceMatches($trackingDomain, $customer)) {
            return $trackingDomain;
        }

        $canUseSystem = (bool) $customer->groupSetting('servers.permissions.can_use_system_servers', false);
        $mustAddOwn = (bool) $customer->groupSetting('domains.tracking_domains.must_add', false);

        if (!$mustAddOwn && $canUseSystem && $trackingDomain->customer_id === null) {
            return $trackingDomain;
        }

        abort(404);
    }

    /**
     * Display a listing of the resource.
     */
    public function index(Request $request)
    {
        $filters = $request->only(['search', 'status']);
        $trackingDomains = $this->trackingDomainService->getPaginated(auth('customer')->user(), $filters);

        return view('customer.tracking-domains.index', compact('trackingDomains', 'filters'));
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        return view('customer.tracking-domains.create');
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        $customer = auth('customer')->user();
        $customer->enforceGroupLimit('domains.tracking_domains.max_tracking_domains', $customer->trackingDomains()->count(), 'Tracking domain limit reached.');

        $validated = $request->validate([
            'domain' => ['required', 'string', 'max:255', 'regex:/^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$/'],
            'notes' => ['nullable', 'string'],
        ]);

        $trackingDomain = $this->trackingDomainService->create($customer, $validated);

        return redirect()
            ->route('customer.tracking-domains.show', $trackingDomain)
            ->with('success', 'Tracking domain created successfully. Please verify it by adding the DNS records.');
    }

    /**
     * Display the specified resource.
     */
    public function show(TrackingDomain $trackingDomain)
    {
        $this->authorizeView($trackingDomain);
        return view('customer.tracking-domains.show', compact('trackingDomain'));
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(TrackingDomain $trackingDomain)
    {
        $this->authorizeManage($trackingDomain);
        return view('customer.tracking-domains.edit', compact('trackingDomain'));
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, TrackingDomain $trackingDomain)
    {
        $this->authorizeManage($trackingDomain);
        $validated = $request->validate([
            'notes' => ['nullable', 'string'],
        ]);

        $this->trackingDomainService->update($trackingDomain, $validated);

        return redirect()
            ->route('customer.tracking-domains.show', $trackingDomain)
            ->with('success', 'Tracking domain updated successfully.');
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(TrackingDomain $trackingDomain)
    {
        $this->authorizeManage($trackingDomain);
        $this->trackingDomainService->delete($trackingDomain);

        return redirect()
            ->route('customer.tracking-domains.index')
            ->with('success', 'Tracking domain deleted successfully.');
    }

    /**
     * Verify a tracking domain.
     */
    public function verify(TrackingDomain $trackingDomain)
    {
        $this->authorizeManage($trackingDomain);

        $results = $this->trackingDomainService->verify($trackingDomain);

        if (!empty($results['cname'])) {
            return redirect()
                ->route('customer.tracking-domains.show', $trackingDomain)
                ->with('success', 'Tracking domain verified successfully! CNAME record found in DNS.');
        }

        $errorMessage = 'Domain verification failed. ';
        if (!empty($results['errors'])) {
            $errorMessage .= implode(' ', $results['errors']);
        } else {
            $errorMessage .= 'CNAME record not found in DNS. Please add the CNAME record and try again.';
        }

        return redirect()
            ->route('customer.tracking-domains.show', $trackingDomain)
            ->with('error', $errorMessage)
            ->with('verification_results', $results);
    }

    public function markVerified(TrackingDomain $trackingDomain)
    {
        $this->authorizeManage($trackingDomain);

        $trackingDomain->update([
            'status' => 'verified',
            'verified_at' => now(),
        ]);

        return redirect()
            ->route('customer.tracking-domains.show', $trackingDomain)
            ->with('success', 'Tracking domain marked as verified.');
    }
}