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

namespace App\Http\Controllers;

use App\ListModel;
use App\Services\Lists\DeleteLists;
use App\Services\Lists\LoadListContent;
use App\Services\Lists\UpdateListsContent;
use Arr;
use Auth;
use Common\Core\BaseController;
use Common\Database\Datasource\MysqlDataSource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;

class ListController extends BaseController
{
    /**
     * @var Request
     */
    private $request;

    /**
     * @var ListModel
     */
    private $list;

    public function __construct(Request $request, ListModel $list)
    {
        $this->request = $request;
        $this->list = $list;
    }

    public function index()
    {
        $this->authorize('index', [ListModel::class, Auth::id()]);

        $builder = $this->list->newQuery();

        if ($userId = $this->request->get('userId')) {
            $builder->where('user_id', $userId);
        }

        if ($listIds = $this->request->get('listIds')) {
            $builder->whereIn('id', explode(',', $listIds));
        }

        if ($excludeSystem = $this->request->get('excludeSystem')) {
            $builder->where('system', false);
        }

        $paginator = new MysqlDataSource($builder, $this->request->all());

        $pagination = $paginator->paginate();

        return $this->success(['pagination' => $pagination]);
    }

    public function show(int $id)
    {
        $list = $this->list->with('user')->findOrFail($id);

        $this->authorize('show', $list);

        $items = app(LoadListContent::class)->execute($list);
        $items = $items
            ->sortBy(
                $this->request->get('sortBy', 'pivot.order'),
                SORT_REGULAR,
                $this->request->get('sortDir') === 'desc',
            )
            ->values();

        $paginator = new LengthAwarePaginator(
            $items,
            $items->count(),
            $items->count() ?: 1,
        );

        return $this->success([
            'list' => $list,
            'items' => $paginator,
        ]);
    }

    public function store()
    {
        $this->authorize('store', ListModel::class);

        $this->validate($this->request, [
            'details.name' => 'required|string|max:100',
            'details.description' => 'nullable|string|max:500',
            'details.public' => 'boolean',
            'details.auto_update' => 'nullable|string',
            'items' => 'array',
        ]);

        $details = $this->request->get('details');
        $autoUpdate = Arr::get($details, 'auto_update');

        $list = $this->list->create([
            'name' => $details['name'],
            'description' => $details['description'],
            'auto_update' => $autoUpdate,
            'public' => $details['public'],
            'user_id' => Auth::id(),
        ]);

        if ($items = $this->request->get('items')) {
            $list->attachItems($items);
        }

        if ($autoUpdate) {
            app(UpdateListsContent::class)->execute([$list]);
        }

        return $this->success(['list' => $list]);
    }

    public function update(int $id)
    {
        $list = $this->list->findOrFail($id);

        $this->authorize('update', $list);

        $this->validate($this->request, [
            'details.name' => 'required|string|max:100',
            'details.description' => 'nullable|string|max:500',
        ]);

        $originalAutoUpdate = $list->auto_update;
        $list->fill($this->request->get('details'))->save();

        if ($originalAutoUpdate !== $list->auto_update) {
            app(UpdateListsContent::class)->execute([$list]);
        }

        return $this->success(['list' => $list]);
    }

    public function destroy(string $ids)
    {
        $listIds = explode(',', $ids);

        // make sure system lists can't be deleted
        $lists = $this->list
            ->whereIn('id', $listIds)
            ->where('system', false)
            ->get();

        $this->authorize('destroy', [ListModel::class, $lists]);

        app(DeleteLists::class)->execute($lists->pluck('id'));

        return $this->success();
    }

    /**
     * @return JsonResponse
     */
    public function autoUpdateContent()
    {
        $this->authorize('store', ListModel::class);

        $lists = $this->list
            ->whereNotNull('auto_update')
            ->limit(10)
            ->get();

        app(UpdateListsContent::class)->execute($lists);

        return $this->success();
    }
}