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/ai.naniguide.com/app/Http/Controllers/LegacyMailListController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Model\MailList;
use App\Model\Setting;
use App\Model\Customer;
use App\Services\SubscriberService;
use Exception;

class LegacyMailListController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        // authorize
        if (\Gate::denies('list', MailList::class)) {
            return $this->notAuthorized();
        }

        $customer = $request->user()->customer;
        return view('lists.index');
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function listing(Request $request)
    {
        // authorize
        if (\Gate::denies('list', MailList::class)) {
            return $this->notAuthorized();
        }

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

        $lists = $customer->local()->mailLists()
            ->search($request->keyword)
            ->orderBy($request->sort_order, $request->sort_direction)
            ->paginate($request->per_page);

        $settings = [
            'list.clone_for_others' => Setting::isYes('list.clone_for_others')
        ];
        return view('lists._list', [
            'lists' => $lists,
            'settings' => $settings,
        ]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create(Request $request)
    {
        // Generate info
        $user = $request->user();
        $customer = $user->customer;
        $list = $customer->newMailList();

        if ($customer->contact) {
            $list->send_to = $customer->contact->email;
        } else {
            $list->send_to = $user->email;
        }

        // default values
        $list->subscribe_confirmation = \App\Model\Setting::isYes('list.default.double_optin');
        $list->send_welcome_email = false;
        $list->unsubscribe_notification = false;

        // authorize
        if (\Gate::denies('create', $list)) {
            return $this->noMoreItem();
        }

        // Get old post values
        if (null !== $request->old()) {
            $list->fill($request->old());
        }

        $allowedSingleOptin = Setting::isYes('list.allow_single_optin');

        return view('lists.create', [
            'list' => $list,
            'allowedSingleOptin' => $allowedSingleOptin
        ]);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        // Generate info
        $customer = $request->user()->customer;
        $list = $customer->newMailList();

        // authorize
        if (\Gate::denies('create', $list)) {
            return $this->noMoreItem();
        }

        // validate and save posted data
        if ($request->isMethod('post')) {
            $this->validate($request, \App\Model\MailList::$rules);

            $list->fill($request->all());
            $list->customer_id = $customer->id;
            $list->save();

            // default list templates
            $list->resetDefaultTemplates();

            // Trigger updating related campaigns cache
            event(new \App\Events\MailListUpdated($list));

            // Redirect to my lists page
            $request->session()->flash('alert-success', trans('messages.list.created'));

            return redirect()->action('LegacyMailListController@index');
        }
    }

    /**
     * Display the specified resource.
     *
     * @param int $id
     *
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param int $id
     *
     * @return \Illuminate\Http\Response
     */
    public function edit(Request $request, $uid)
    {
        // Generate info
        $customer = $request->user()->customer;
        $list = \App\Model\MailList::findByUid($uid);

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

        // Get old post values
        if (null !== $request->old()) {
            $list->fill($request->old());
        }

        $allowedSingleOptin = Setting::isYes('list.allow_single_optin');

        return view('lists.edit', [
            'list' => $list,
            'allowedSingleOptin' => $allowedSingleOptin
        ]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @param int                      $id
     *
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        // Generate info
        $customer = $request->user()->customer;
        $list = \App\Model\MailList::findByUid($id);

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

        // validate and save posted data
        if ($request->isMethod('patch')) {
            $this->validate($request, \App\Model\MailList::$rules);

            $list->fill($request->all());
            $list->save();

            // Redirect to my lists page
            $request->session()->flash('alert-success', trans('messages.list.updated'));

            return redirect()->action('LegacyMailListController@edit', $list->uid);
        }
    }

    /**
     * Custom sort items.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function sort(Request $request)
    {
        $sort = json_decode($request->sort);
        foreach ($sort as $row) {
            $list = \App\Model\MailList::findByUid($row[0]);

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

            $list->save();
        }

        echo trans('messages.lists._deleted_');
    }

    /**
     * Delete confirm message.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function deleteConfirm(Request $request)
    {
        $lists = \App\Model\MailList::whereIn(
            'uid',
            is_array($request->uids) ? $request->uids : explode(',', $request->uids)
        );

        return view('lists.delete_confirm', [
            'lists' => $lists,
        ]);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function delete(Request $request)
    {
        $lists = \App\Model\MailList::whereIn(
            'uid',
            is_array($request->uids) ? $request->uids : explode(',', $request->uids)
        );

        foreach ($lists->get() as $item) {
            // authorize
            if (\Gate::allows('delete', $item)) {
                $item->delete();

                // not needed as the related campaigns will be deleted as well
                // $item->updateCachedInfo();

                // update MailList cache
                event(new \App\Events\MailListUpdated($item));
            }
        }

        // Redirect to my lists page
        echo trans('messages.lists.deleted');
    }

    /**
     * List overview.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function overview(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->uid);

        // authorize
        if (\Gate::denies('read', $list)) {
            return $this->notAuthorized();
        }

        event(new \App\Events\MailListUpdated($list));

        // authorize
        if (\Gate::denies('read', $list)) {
            return $this->notAuthorized();
        }

        return view('lists.overview', [
            'list' => $list,
        ]);
    }

    /**
     * List growth chart content.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function listGrowthChart(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->uid);

        if ($list) {
            $list_id = $list->id;
        } else {
            $list_id = null;
            $list = new \App\Model\MailList();
            $list->customer_id = $request->user()->customer->id;
        }

        // authorize
        if (\Gate::denies('read', $list)) {
            return $this->notAuthorized();
        }

        $result = [
            'columns' => [],
            'data' => [],
            'bar_names' => [trans('messages.subscriber_growth')],
        ];

        // columns
        for ($i = 4; $i >= 0; --$i) {
            $result['columns'][] = \Carbon\Carbon::now()->subMonthsNoOverflow($i)->format('m/Y');
        }

        // datas
        foreach ($result['bar_names'] as $bar) {
            for ($i = 4; $i >= 0; --$i) {
                $result['data'][] = \App\Model\LocalCustomer::subscribersCountByTime(
                    \Carbon\Carbon::now()->subMonthsNoOverflow($i)->startOfMonth(),
                    \Carbon\Carbon::now()->subMonthsNoOverflow($i)->endOfMonth(),
                    $request->user()->customer->id,
                    $list_id
                );
            }
        }

        return response()->json($result);
    }

    /**
     * Chart statistics chart.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function statisticsChart(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->uid);
        $customer = $request->user()->customer;

        if ($list) {
            $list_id = $list->id;
        } else {
            $list_id = null;
            $list = new \App\Model\MailList();
            $list->customer_id = $request->user()->customer->id;
        }

        // authorize
        if (\Gate::denies('read', $list)) {
            return $this->notAuthorized();
        }

        $result = [
            'data' => [],
        ];

        if (isset($list->id)) {
            if (\App\Library\Cache\AppCache::for($list)->read('SubscribeCount', 0)) {
                $result['data'][] = ['value' => \App\Library\Cache\AppCache::for($list)->read('SubscribeCount', 0), 'name' => trans('messages.subscribed')];
            }

            if (\App\Library\Cache\AppCache::for($list)->read('UnsubscribeCount', 0)) {
                $result['data'][] = ['value' => \App\Library\Cache\AppCache::for($list)->read('UnsubscribeCount', 0), 'name' => trans('messages.unsubscribed')];
            }

            if (\App\Library\Cache\AppCache::for($list)->read('UnconfirmedCount', 0)) {
                $result['data'][] = ['value' => \App\Library\Cache\AppCache::for($list)->read('UnconfirmedCount', 0), 'name' => trans('messages.unconfirmed')];
            }

            if (\App\Library\Cache\AppCache::for($list)->read('BlacklistedCount', 0)) {
                $result['data'][] = ['value' => \App\Library\Cache\AppCache::for($list)->read('BlacklistedCount', 0), 'name' => trans('messages.blacklisted')];
            }

            if (\App\Library\Cache\AppCache::for($list)->read('SpamReportedCount', 0)) {
                $result['data'][] = ['value' => \App\Library\Cache\AppCache::for($list)->read('SpamReportedCount', 0), 'name' => trans('messages.spam_reported')];
            }
        } else {
            if (\App\Library\Cache\AppCache::for($customer->local())->read('SubscribedCount', 0)) {
                $result['data'][] = ['value' => \App\Library\Cache\AppCache::for($customer->local())->read('SubscribedCount', 0), 'name' => trans('messages.subscribed')];
            }

            if (\App\Library\Cache\AppCache::for($customer->local())->read('UnsubscribedCount', 0)) {
                $result['data'][] = ['value' => \App\Library\Cache\AppCache::for($customer->local())->read('UnsubscribedCount', 0), 'name' => trans('messages.unsubscribed')];
            }

            if (\App\Library\Cache\AppCache::for($customer->local())->read('UnconfirmedCount', 0)) {
                $result['data'][] = ['value' => \App\Library\Cache\AppCache::for($customer->local()->local())->read('UnconfirmedCount', 0), 'name' => trans('messages.unconfirmed')];
            }

            if (\App\Library\Cache\AppCache::for($customer->local())->read('BlacklistedCount', 0)) {
                $result['data'][] = ['value' => \App\Library\Cache\AppCache::for($customer->local())->read('BlacklistedCount', 0), 'name' => trans('messages.blacklisted')];
            }

            if (\App\Library\Cache\AppCache::for($customer->local())->read('SpamReportedCount', 0)) {
                $result['data'][] = ['value' => \App\Library\Cache\AppCache::for($customer->local())->read('SpamReportedCount', 0), 'name' => trans('messages.spam_reported')];
            }
        }

        // // datas
        // $result['data'][] = [
        //     'name' => trans('messages.statistics'),
        //     'type' => 'pie',
        //     'radius' => '70%',
        //     'center' => ['50%', '57.5%'],
        //     'data' => $datas
        // ];

        // $result['pie'] = 1;
        return response()->json($result);
    }

    /**
     * Copy list.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function copy(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->copy_list_uid);

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

        if ($request->isMethod('post')) {
            // make validator
            $validator = \Validator::make($request->all(), [
                'name' => 'required',
            ]);

            // redirect if fails
            if ($validator->fails()) {
                return response()->view('lists.copy', [
                    'list' => $list,
                    'errors' => $validator->errors(),
                ], 400);
            }

            $list->copy($request->name);
            return trans('messages.list.copied');
        }

        return view('lists.copy', [
            'list' => $list,
        ]);
    }

    /**
     * Embedded Forms.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function embeddedForm(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->uid);

        // authorize
        if (\Gate::denies('read', $list)) {
            return $this->notAuthorized();
        }

        if ($request->isMethod('post')) {
            $list->setEmbeddedFormOptions($request->options);
        }

        return view('lists.embedded_form', [
            'list' => $list,
        ]);
    }

    /**
     * Embedded Forms.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function embeddedFormFrame(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->uid);

        // authorize
        if (\Gate::denies('read', $list)) {
            return $this->notAuthorized();
        }

        return view('lists.embedded_form_frame', [
            'list' => $list,
        ]);
    }

    /**
     * reCaptcha check.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function embeddedFormCaptcha(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->uid);

        // Check if list does exist
        if (!$list) {
            return view('somethingWentWrong', ['message' => trans('messages.embedded_form.list_not_exsit')]);
        }

        $request->session()->put('form_url', \AppUrl::previous());

        return view('lists.embedded_form_captcha', [
            'list' => $list,
        ]);
    }

    /**
     * Subscribe user from embedded Forms.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function embeddedFormSubscribe(Request $request)
    {
        $subscriberService = app(SubscriberService::class);
        $customerUid = $request->customer_uid;
        $customer = \App\Model\Customer::findByUid($customerUid);

        if (is_null($customer)) {
            throw new \Exception('Cannot find customer');
        } else {
            $customer->setUserDbConnection();
        }

        $list = \App\Model\MailList::findByUid($request->uid);

        if (\App\Model\Setting::isYes('embedded_form_recaptcha')) {
            if ($request->hasCaptcha) {
                // Fail-open: any vendor rejection still lets the request through
                // but dispatches an admin notification. See
                // App\Library\Tool::verifyCaptchaOrAlert.
                $success = \App\Library\Tool::verifyCaptchaOrAlert($request, 'embedded-form');
            } else {
                return view('lists.embedded_form_captcha', [
                    'list' => $list,
                ]);
            }
        } else {
            $success = true;
        }

        // Language
        if ($list->customer && $list->customer->language) {
            \App::setLocale($list->customer->language->code);
            \Carbon\Carbon::setLocale($list->customer->language->code);
        }

        // Check if list does exist
        if (!$list) {
            return view('somethingWentWrong', ['message' => trans('messages.embedded_form.list_not_exsit')]);
        }

        if (!$success) {
            $url = $request->session()->pull('form_url');
            $errs = [trans("messages.invalid_captcha")];
            return view('lists.embedded_form_captcha_invalid', [
                'errors' => collect($errs),
                'list' => $list,
                'back_link' => $url,
            ]);
        }

        try {
            // Create subscriber
            [$validator, $subscriber] = $subscriberService->optInFromEmbeddedForm($list, $request);
        } catch (\Exception $ex) {
            return view('somethingWentWrong', ['message' => $ex->getMessage()]);
        }

        if ($validator->fails()) {
            $url = $request->session()->pull('form_url');
            // $validator->errors()
            $errs = [];
            foreach ($validator->errors()->toArray() as $key => $error) {
                $field = $list->getFieldByTag($key);
                $errs[] = $error[0];
            }

            if (strpos($url, '?') !== false) {
                $url = $url . "&" . implode('&', $errs);
            } else {
                $url = $url . "?" . implode('&', $errs);
            }

            // return redirect()->away($url);
            return view('lists.embedded_form_errors', [
                'errors' => collect($errs),
                'list' => $list,
                'back_link' => $url,
            ]);
        }

        // custom redirect
        if ($request->redirect_url) {
            return redirect()->away($request->redirect_url);
        } elseif ($list->subscribe_confirmation && !$subscriber->isSubscribed()) {
            // tell subscriber to check email for confirmation
            return redirect()->action('Pub\MailListController@signUpThankyouPage', ['list_uid' => $list->uid, 'subscriber_id' => $subscriber->id, 'customer_uid' => $list->customer->uid]);
        } else {
            // All done, confirmed
            return redirect()->away($subscriberService->generateSignedConfirmationUrl($subscriber));
        }
    }

    /**
     * Check email
     *
     */
    public function checkEmail(Request $request)
    {
        header("Access-Control-Allow-Origin: *");

        $list = \App\Model\MailList::findByUid($request->uid);
        $subscriber = $list->subscribers()->where('email', '=', strtolower(trim($request->EMAIL)))->first();

        if ($subscriber && $subscriber->status == \App\Model\Subscriber::STATUS_SUBSCRIBED) {
            $result = trans('messages.email_already_subscribed');
        } else {
            $result = true;
        }

        return response()->json($result);
    }

    /**
     * Clone list for other users
     *
     */
    public function cloneForCustomersChoose(Request $request, $uid)
    {
        $list = \App\Model\MailList::findByUid($request->uid);
        $customers = Customer::where('id', '!=', $list->customer_id);

        $options = [];
        foreach ($customers->get() as $customer) {
            $options[] = ['text' => $customer->displayName(), 'value' => $customer->uid];
        }

        return view('lists.cloneForCustomersChoose', [
            'list' => $list,
            'options' => $options,
        ]);
    }

    /**
     * Clone list for other users
     *
     */
    public function cloneForCustomers(Request $request, $uid)
    {
        $list = \App\Model\MailList::findByUid($request->uid);
        $customers = Customer::WhereIn('uid', $request->customers);

        $list->cloneForCustomers($customers->get());

        return response()->json([
            'status' => 'success',
            'message' => trans('messages.list.clone_for.success'),
        ]);
    }

    public function selectList(Request $request)
    {
        if ($request->isMethod('post')) {
            // make validator
            $validator = \Validator::make($request->all(), [
                'list_uid' => 'required',
            ]);

            // redirect if fails
            if ($validator->fails()) {
                return response()->view('lists.selectList', [
                    'errors' => $validator->errors(),
                ], 400);
            }

            $url = str_replace('list_uid', $request->list_uid, $request->redirect);
            return response()->json([
                'url' => $url,
            ]);
        }

        return view('lists.selectList');
    }

    public function emailVerificationChart(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->uid);

        // authorize
        if (\Gate::denies('read', $list)) {
            return $this->notAuthorized();
        }

        $result = [
            'data' => [
                [
                    'name' => trans('messages.email_verification_result_deliverable'),
                    'value' => $list->subscribers()->deliverable()->count(),
                ],
                [
                    'name' => trans('messages.email_verification_result_undeliverable'),
                    'value' => $list->subscribers()->undeliverable()->count(),
                ],
                [
                    'name' => trans('messages.email_verification_result_risky'),
                    'value' =>  $list->subscribers()->risky()->count(),
                ],
                [
                    'name' => trans('messages.email_verification_result_unverified'),
                    'value' => $list->subscribers()->unverified()->count(),
                ],
                [
                    'name' => trans('messages.email_verification_result_unknown'),
                    'value' => $list->subscribers()->unknown()->count(),
                ],
            ],
        ];

        // usort($result['data'], function ($a, $b) {
        //     return strcmp($a['value'], $b['value']);
        // });
        // $result['data'] = array_reverse($result['data']);

        return response()->json($result);
    }

    public function webhookJson(Request $request, $uid)
    {
        $list = MailList::findByUid($uid);

        return view('lists.webhookJson', [
            'list' => $list,
        ]);
    }

    public function webhookForm(Request $request, $uid)
    {
        $list = MailList::findByUid($uid);

        return view('lists.webhookForm', [
            'list' => $list,
        ]);
    }

    public function listFieldOptions(Request $request, $uid)
    {
        $list = MailList::findByUid($uid);

        return response()->json($list->fields->map(function ($field) {
            return [
                'text' => $field->tag,
                'id' => $field->id,
            ];
        })->toArray());
    }

    public function listFieldOptionsUid(Request $request, $uid)
    {
        $list = MailList::findByUid($uid);

        return response()->json($list->fields->map(function ($field) {
            return [
                'text' => $field->tag,
                'uid' => $field->uid,
            ];
        })->toArray());
    }

}