AjaxController.php 3.42 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];
        $update = [Host::STATUS_OFF => [], Host::STATUS_ON  => []];
        $filters = Collection::get_filter(Filter::TYPE_AFTER);
        $query = (new Query())->select('id, domain')->from('{{%host}}');
        if ($query)
            {
                foreach ($query->batch(1000) as $hosts)
                    {
                        foreach ($hosts as $host)
                            $update[
                                (
                                    Collection::apply_filter($host['domain'], $filters) === false ?
                                        Host::STATUS_OFF :
                                        Host::STATUS_ON
                                )
                            ][] = $host['id'];
                        unset($host);
                        if (count($update[Host::STATUS_OFF])>0)
                            {
                                Yii::$app->db->createCommand()
                                    ->update('{{%host}}', ['status' => Host::STATUS_OFF], ['in', 'id', $update[Host::STATUS_OFF]])
                                    ->execute();
                                $count_update[Host::STATUS_OFF]+=count($update[Host::STATUS_OFF]);
                                $update[Host::STATUS_OFF] = [];
                            }
                        if (count($update[Host::STATUS_ON])>0)
                            {
                                Yii::$app->db->createCommand()
                                    ->update('{{%host}}', ['status' => Host::STATUS_ON], ['in', 'id', $update[Host::STATUS_ON]])
                                    ->execute();
                                $count_update[Host::STATUS_ON]+=count($update[Host::STATUS_ON]);
                                $update[Host::STATUS_ON] = [];
                            }
                    }
                unset($hosts);
            }
        unset($query);
        unset($filters);
        unset($update);
        return [
            'controller' => 'ajax',
            'is_guest' => Yii::$app->user->isGuest,
            'user_id' => Yii::$app->user->getId(),
            'domains' => $count_update
        ];
    }


}