pulsarvp/vps-tools

View on GitHub
src/modules/queue/models/search/QueueInformationSearch.php

Summary

Maintainability
C
7 hrs
Test Coverage
<?php

    namespace vps\tools\modules\queue\models\search;

    use Yii;
    use vps\tools\modules\queue\redis\QueueInformation;
    use yii\base\Model;
    use yii\data\ArrayDataProvider;

    class QueueInformationSearch extends Model
    {
        /** @var  array */
        public $queueJobs;

        public $id;
        public $status;
        public $ttr;
        public $delay;
        public $reserve;
        public $attempts;
        public $classJob;
        public $paramsJob;

        public static $statuses = [
            QueueInformation::STATUS_WAITING  => 'Waiting',
            QueueInformation::STATUS_RESERVED => 'Reserved',
            QueueInformation::STATUS_DELAYED  => 'Delayed',
        ];

        /**
         * @param bool|int $id
         * @return array
         */
        public static function statusesRus ($id = false)
        {
            $items = [];
            foreach (static::$statuses as $key => $status)
            {
                $items [ $key ] = Yii::tr($status, [], 'queue');
            }

            if ($id !== false)
            {
                return $items[ $id ];
            }

            return $items;
        }

        /**
         * @inheritdoc
         */
        public function rules ()
        {
            return [
                [ [ 'id', 'status', 'ttr', 'classJob', 'attempts' ], 'integer' ],
                [ [ 'delay', 'reserve' ], 'safe' ],

            ];
        }

        public function attributeLabels ()
        {
            return [
                'id'             => Yii::tr('Id', [], 'queue'),
                'status'         => Yii::tr('Status', [], 'queue'),
                'ttr'            => Yii::tr('TTR', [], 'queue'),
                'delay'          => Yii::tr('Delay time', [], 'queue'),
                'reserve'        => Yii::tr('Reserve time', [], 'queue'),
                'attempts'       => Yii::tr('Attempts', [], 'queue'),
                'classJob'       => Yii::tr('Class job', [], 'queue'),
                'paramsAsString' => Yii::tr('Params', [], 'queue'),
            ];
        }

        /**
         * @param $params
         * @return string
         */
        public static function paramsAsString ($params)
        {
            return json_encode($params);
        }

        /**
         * Creates data provider instance with search query applied
         *
         * @param array $params
         *
         * @return ArrayDataProvider
         */
        public function search ($params)
        {
            $this->load($params);

            if (!empty($this->status))
            {
                $this->queueJobs = array_filter($this->queueJobs, function ($value)
                {
                    return $value[ 'status' ] == $this->status;
                });
            }

            if (!empty($this->id))
            {
                $this->queueJobs = array_filter($this->queueJobs, function ($value)
                {
                    return $value[ 'id' ] == $this->id;
                });
            }

            if (!empty($this->attempts))
            {
                $this->queueJobs = array_filter($this->queueJobs, function ($value)
                {
                    return $value[ 'attempts' ] == $this->attempts;
                });
            }

            if (!empty($this->ttr))
            {
                $this->queueJobs = array_filter($this->queueJobs, function ($value)
                {
                    return $value[ 'ttr' ] == $this->ttr;
                });
            }

            if (!empty($this->classJob))
            {
                $this->queueJobs = array_filter($this->queueJobs, function ($value)
                {
                    $result = stripos($value[ 'classJob' ], $this->classJob);
                    if ($result === false)
                    {
                        return false;
                    }

                    return true;
                });
            }

            $provider = new ArrayDataProvider([
                'allModels'  => $this->queueJobs,
                'sort'       => [
                    'attributes' => [ 'id', 'status', 'ttr', 'delay', 'reserve', 'classJob' ],
                ],
                'pagination' => [
                    'pageSize' => 10,
                ],
            ]);

            return $provider;
        }

    }