AjaxController.php 4.15 KB
<?php

namespace app\controllers;


use app\models\Host;
use app\models\Filter;
use app\components\Collection;
use Yii;
use yii\db\Query;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\web\Response;
use yii\filters\VerbFilter;


class AjaxController extends Controller
{
    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['calc-status'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'contentNegotiator' => [
                'class' => 'yii\filters\ContentNegotiator',
                'formats' => [
                    'application/json' => Response::FORMAT_JSON,
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'get-plants' => ['GET']
                ],
            ],
        ];
    }

    /**
     * Displays homepage.
     *
     * @return string
     */
    public function actionCalcStatus()
    {
        $count_update = [Host::STATUS_OFF => 0, Host::STATUS_ON  => 0];
        $filters = [Filter::TYPE_1=>Collection::get_filter(Filter::TYPE_1), Filter::TYPE_2=>Collection::get_filter(Filter::TYPE_2), Filter::TYPE_3=>Collection::get_filter(Filter::TYPE_3)];
        $query = (new Query())->select('id, domain')->from('{{%host}}');
        if ($query)
            {
                foreach ($query->batch(1000) as $hosts)
                    {
                        foreach ($filters as $filter_type=>$filter)
                            {
                                $update = [Host::STATUS_OFF=>[],Host::STATUS_ON=>[]];
                                foreach ($hosts as $host)
                                    $update[
                                        (
                                            Collection::apply_filter($host['domain'], $filter) === false ?
                                                Host::STATUS_OFF :
                                                Host::STATUS_ON
                                        )
                                    ][] = $host['id'];
                                unset($host);

                                $filter_name = 'f'.($filter_type+1).'_status';
                                if (count($update[Host::STATUS_OFF])>0)
                                    {
                                        Yii::$app->db->createCommand()
                                            ->update('{{%host}}', [$filter_name => Host::STATUS_OFF], ['in', 'id', $update[Host::STATUS_OFF]])
                                            ->execute();
                                        $count_update[Host::STATUS_OFF]+=count($update[$filter_type][Host::STATUS_OFF]);
                                        $update[$filter_type][Host::STATUS_OFF] = [];
                                    }
                                if (count($update[Host::STATUS_ON])>0)
                                    {
                                        Yii::$app->db->createCommand()
                                            ->update('{{%host}}', [$filter_name => Host::STATUS_ON], ['in', 'id', $update[Host::STATUS_ON]])
                                            ->execute();
                                        $count_update[Host::STATUS_ON]+=count($update[$filter_type][Host::STATUS_ON]);
                                        $update[$filter_type][Host::STATUS_ON] = [];
                                    }
                                unset($filter_name);
                                unset($update);
                            }
                        unset($filter_type, $filter);
                    }
                unset($hosts);
            }
        unset($query);
        unset($filters);
        return [
            'controller' => 'ajax',
            'is_guest' => Yii::$app->user->isGuest,
            'user_id' => Yii::$app->user->getId(),
            'domains' => $count_update
        ];
    }


}