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

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Model\Field;

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

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

        if (!$list) {
            return redirect()->action('SegmentController@noList');
        }

        return view('segments.index', [
            'list' => $list,
        ]);
    }

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

        $list = \App\Model\MailList::findByUid($request->list_uid);
        $segments = \App\Model\Segment::search($request)->paginate($request->per_page);

        foreach ($segments as $segment) {
            $segment->updateCacheDelayed();
        }

        return view('segments._list', [
            'segments' => $segments,
            'list' => $list,
        ]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->list_uid);
        $segment = new \App\Model\Segment();
        $segment->mail_list_id = $list->id;
        $segment->customer_id = $list->customer_id;

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

        // Get old post values
        if (isset($request->old()['conditions'])) {
            $segment->fill($request->old());

            $segment->segmentConditions = collect();
            foreach ($request->old()['conditions'] as $key => $item) {
                $condition = new \App\Model\SegmentCondition();
                $condition->customer_id = $segment->customer_id;
                $condition->uid = $key;
                $condition->fill($item);
                $segment->segmentConditions->push($condition);
            }
        }

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

    /**
     * Store a newly created resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $user = $request->user();
        $list = \App\Model\MailList::findByUid($request->list_uid);
        $segment = new \App\Model\Segment();
        $segment->mail_list_id = $list->id;
        $segment->customer_id = $list->customer_id;

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

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

            // addtion validates
            $empty = false;
            if (isset($request->conditions)) {
                foreach ($request->conditions as $key => $param) {
                    $rules['conditions.'.$key.'.field_id'] = 'required';
                    $rules['conditions.'.$key.'.operator'] = 'required';
                    if (!in_array($param['operator'], ['blank', 'not_blank'])) {
                        $rules['conditions.'.$key.'.value'] = 'required';
                    }
                }
            } else {
                $empty = true;
            }
            if ($empty) {
                $rules['segment_conditions_empty'] = 'required';
            }

            // Check validation
            $this->validate($request, $rules);

            // Save segment
            $segment->fill($request->all());
            $segment->save();

            // save conditions
            $segment->updateConditions($request->conditions);

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

            return redirect()->action('SegmentController@index', $list->uid);
        }
    }

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

    /**
     * Display segment's subscribers.
     *
     * @param int $id
     *
     * @return \Illuminate\Http\Response
     */
    public function subscribers(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->list_uid);
        $segment = \App\Model\Segment::findByUid($request->uid);

        return view('segments.subscribers', [
            'subscribers' => $segment->subscribers(),
            'list' => $list,
            'segment' => $segment,
        ]);
    }

    /**
     * Display segment's subscribers.
     *
     * @param int $id
     *
     * @return \Illuminate\Http\Response
     */
    public function listing_subscribers(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->list_uid);
        $segment = \App\Model\Segment::findByUid($request->uid);

        $subscribers = $segment->subscribers()
            ->search($request->keyword)
            ->filter($request);


        if ($request->sort_order) {
            $subscribers->orderBy($request->sort_order, $request->sort_direction);
        }

        $total = $subscribers->count();

        $subscribers = $subscribers->orderBy($request->sort_order, $request->sort_direction)
            ->paginate($request->per_page);

        $fields = $list->getFields->whereIn('uid', $request->columns_);

        return view('subscribers._list', [
            'subscribers' => $subscribers,
            'total' => $total,
            'list' => $list,
            'fields' => $fields,
            'segment' => $segment,
        ]);
    }

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

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

        // Get old post values
        if (isset($request->old()['conditions'])) {
            $segment->fill($request->old());

            $segment->segmentConditions = collect([]);
            foreach ($request->old()['conditions'] as $key => $item) {
                $condition = new \App\Model\SegmentCondition();
                $condition->uid = $key;
                $condition->fill($item);
                $segment->segmentConditions->push($condition);
            }
        }

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

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

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

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

            // addtion validates
            $empty = false;
            if (isset($request->conditions)) {
                foreach ($request->conditions as $key => $param) {
                    $rules['conditions.'.$key.'.field_id'] = 'required';
                    $rules['conditions.'.$key.'.operator'] = 'required';
                    if (!in_array($param['operator'], ['blank', 'not_blank'])) {
                        $rules['conditions.'.$key.'.value'] = 'required';
                    }
                }
            } else {
                $empty = true;
            }
            if ($empty) {
                $rules['segment_conditions_empty'] = 'required';
            }

            // Check validation
            $this->validate($request, $rules);

            // Save segment
            $segment->fill($request->all());
            $segment->save();

            // save conditions
            $segment->updateConditions($request->conditions);

            // update cached information
            event(new \App\Events\MailListUpdated($segment->mailList));

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

            return redirect()->action('SegmentController@index', $list->uid);
        }
    }

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

        foreach ($items->get() as $item) {
            // authorize
            if (\Gate::denies('delete', $item)) {
                return;
            }
        }

        foreach ($items->get() as $item) {
            $item->delete();
        }

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

    /**
     * Get sample option line.
     *
     * @param int $id
     *
     * @return \Illuminate\Http\Response
     */
    public function sample_condition(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->list_uid);

        return view('segments._sample_condition', [
            'list' => $list,
        ]);
    }

    /**
     * Select box with list.
     *
     * @param int $id
     *
     * @return \Illuminate\Http\Response
     */
    public function selectBox(Request $request)
    {
        $list = \App\Model\MailList::findByUid($request->list_uid);

        return view('segments._select_box', [
            'options' => collect(\App\Library\Cache\AppCache::for($list)->read('SegmentSelectOptions', [])),
            'index' => $request->index,
        ]);
    }

    /**
     * Segment condition value control.
     *
     * @param int $field_uid
     *
     * @return \Illuminate\Http\Response
     */
    public function conditionValueControl(Request $request)
    {
        $field = \App\Model\Field::findByUid($request->field_uid);

        // legacy code
        return view('segments._condition_value_control', [
            'operator' => $request->operator,
            'field_uid' => $request->field_uid,
            'field' => $field,
            'index' => $request->index,
        ]);
    }

    public function noList()
    {
        return view('segments.noList');
    }

    public function copy(Request $request, $uid)
    {
        $segment = \App\Model\Segment::findByUid($uid);

        // authorize
        if (\Gate::denies('update', $segment)) {
            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('segments.copy', [
                    'segment' => $segment,
                    'errors' => $validator->errors(),
                ], 400);
            }

            // copy
            $segment->copy($request->name);

            // update cached information
            event(new \App\Events\MailListUpdated($segment->mailList));

            return trans('messages.segment.copied');
        }

        return view('segments.copy', [
            'segment' => $segment,
        ]);
    }
}