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/be.naniguide.com/app/Http/Controllers/Refactor/EmailTemplateController.php
<?php

namespace App\Http\Controllers\Refactor;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Model\CustomerEmailTemplate;
use App\Model\SystemEmailTemplate;
use App\Model\Template;
use App\Model\TemplateCategory;
use Gate;

class EmailTemplateController extends Controller
{
    /**
     * Template listing page.
     */
    public function index(Request $request)
    {
        if (Gate::denies('list', new CustomerEmailTemplate())) {
            return $this->notAuthorized();
        }

        $customer = $request->user()->customer;
        $totalTemplates = $customer->customerEmailTemplates()->count();
        $categories = TemplateCategory::forEmail()->get();

        return view('refactor.pages.templates.index', compact('totalTemplates', 'categories'));
    }

    /**
     * AJAX listing — grid cards with thumbnails.
     */
    public function listing(Request $request)
    {
        $customer = $request->user()->customer;
        $templates = $customer->customerEmailTemplates();

        if ($request->keyword) {
            $templates = $templates->search($request->keyword);
        }

        if ($request->category_uid) {
            $templates = $templates->categoryUid($request->category_uid);
        }

        $templates = $templates
            ->orderBy($request->sort_order ?: 'created_at', $request->sort_direction ?: 'desc')
            ->paginate($request->per_page ?: 12);

        $view = $request->view === 'list' ? '_list' : '_listing';

        return view('refactor.pages.templates.' . $view, compact('templates'));
    }

    /**
     * Create template — show gallery + name input.
     */
    public function create(Request $request)
    {
        if (Gate::denies('create', new CustomerEmailTemplate())) {
            return $this->notAuthorized();
        }

        $customer = $request->user()->customer;

        if ($request->isMethod('post')) {
            $this->validate($request, ['name' => 'required', 'template' => 'required']);

            $systemTemplate = SystemEmailTemplate::findByUid($request->template);
            if (!$systemTemplate) {
                return redirect()->back()->with('alert-error', 'Template not found.');
            }

            $customerEmailTemplate = new CustomerEmailTemplate();
            $customerEmailTemplate->customer_id = $customer->id;
            \App\Services\TemplateService::for($customerEmailTemplate)
                ->setTemplate($systemTemplate->template, $request->name);

            // Redirect to old builder (complex, separate refactor)
            return redirect()->route('refactor.templates.builder', $customerEmailTemplate->uid);
        }

        $categories = TemplateCategory::forEmail()->get();

        return view('refactor.pages.templates.create', compact('categories'));
    }

    /**
     * AJAX: System template gallery for selection.
     */
    public function gallery(Request $request)
    {
        $templates = SystemEmailTemplate::query();

        if ($request->category_uid) {
            $templates = $templates->categoryUid($request->category_uid);
        }

        if ($request->keyword) {
            $templates = $templates->search($request->keyword);
        }

        $templates = $templates->orderBy('created_at', 'desc')->paginate(12);

        return view('refactor.pages.templates._gallery', compact('templates'));
    }

    /**
     * Preview template HTML.
     */
    public function preview(Request $request)
    {
        $customerTemplate = CustomerEmailTemplate::findByUid($request->uid);

        if (Gate::denies('preview', $customerTemplate)) {
            return $this->notAuthorized();
        }

        return response($customerTemplate->template->getPreviewContent());
    }

    /**
     * Rename template — popup form.
     */
    public function rename(Request $request)
    {
        $customerTemplate = CustomerEmailTemplate::findByUid($request->uid);

        if (Gate::denies('update', $customerTemplate)) {
            return $this->notAuthorized();
        }

        if ($request->isMethod('post')) {
            $this->validate($request, ['name' => 'required']);
            $customerTemplate->name = $request->name;
            $customerTemplate->save();

            return response()->json(['status' => 'success', 'message' => trans('refactor/templates.flash.renamed')]);
        }

        return view('refactor.pages.templates.rename', compact('customerTemplate'));
    }

    /**
     * Copy template — popup form.
     */
    public function copy(Request $request)
    {
        $customerTemplate = CustomerEmailTemplate::findByUid($request->uid);

        if (Gate::denies('copy', $customerTemplate)) {
            return $this->notAuthorized();
        }

        if ($request->isMethod('post')) {
            $this->validate($request, ['name' => 'required']);

            $newCustomerTemplate = new CustomerEmailTemplate();
            $newCustomerTemplate->customer_id = $customerTemplate->customer_id;
            \App\Services\TemplateService::for($newCustomerTemplate)
                ->setTemplate($customerTemplate->template, $request->name);

            return response()->json(['status' => 'success', 'message' => trans('refactor/templates.flash.copied')]);
        }

        return view('refactor.pages.templates.copy', compact('customerTemplate'));
    }

    /**
     * Delete templates.
     */
    public function delete(Request $request)
    {
        $uids = is_array($request->uids) ? $request->uids : explode(',', $request->uids);

        foreach ($uids as $uid) {
            $template = CustomerEmailTemplate::findByUid($uid);
            if ($template && Gate::allows('delete', $template)) {
                $template->deleteAndCleanup();
            }
        }

        return response()->json(['status' => 'success', 'message' => trans('refactor/templates.flash.deleted')]);
    }

    public function builder(Request $request, $uid)
    {
        $customerEmailTemplate = $request->user()->customer->customerEmailTemplates()
            ->where('uid', $uid)->first();

        if (!$customerEmailTemplate) {
            return redirect()->route('refactor.templates.index');
        }

        if (\Gate::denies('update', $customerEmailTemplate)) {
            return $this->notAuthorized();
        }

        // Handle POST (builder save)
        if ($request->isMethod('post')) {
            $validator = $customerEmailTemplate->template->updateContent($request->json, $request->content);

            if ($validator->fails()) {
                return response()->json($validator->errors(), 400);
            }

            return response()->json([
                'status' => 'success',
            ]);
        }

        $templates = $request->user()->customer->getBuilderTemplates();

        return view('refactor.pages.templates.builder', [
            'customerEmailTemplate' => $customerEmailTemplate,
            'templates' => $templates,
        ]);
    }

    public function changeTemplate(Request $request, $uid)
    {
        $customerEmailTemplate = $request->user()->customer->customerEmailTemplates()
            ->where('uid', $uid)->first();

        if (!$customerEmailTemplate) {
            return response()->json(['error' => 'Not found'], 404);
        }

        if (Gate::denies('update', $customerEmailTemplate)) {
            return response()->json(['error' => 'Forbidden'], 403);
        }

        $fromTemplate = Template::findByUid($request->template_uid);
        if (!$fromTemplate) {
            return response()->json(['error' => 'Source template not found'], 404);
        }

        $customerEmailTemplate->template->applyTemplateFrom($fromTemplate);

        return response()->json(['status' => 'success']);
    }
}