jidaikobo-shibata/a11yc

View on GitHub
classes/Update/AddData.php

Summary

Maintainability
B
5 hrs
Test Coverage
<?php
/**
 * A11yc\Update\AddData
 *
 * @package    part of A11yc
 * @author     Jidaikobo Inc.
 * @license    The MIT License (MIT)
 * @copyright  Jidaikobo Inc.
 * @link       http://www.jidaikobo.com
 */
namespace A11yc\Update;

use A11yc\Model;

class AddData
{
    use AddDataUtil;

    /**
     * update
     *
     * @return Void
     */
    public static function update()
    {
        if ( ! Db::isTableExist(A11YC_TABLE_SETTINGS)) return;

        self::serialize2json(); // trait AddDataUtil
        self::updateSettings();
        self::updateVersion();
        self::updatePages();

        foreach (Model\Page::fetchAll(array(), true) as $page)
        {
            $url = $page['url'];
            self::updateChecklist($url);
            self::updateResults($url);
        }

        self::updateBulk();
        self::updateMaintenance();
        self::updateUa();
        self::updateIssues();
        self::updateCaches();

        // drop tables
        $drops = array(
            A11YC_TABLE_RESULTS,
            A11YC_TABLE_BRESULTS,
            A11YC_TABLE_BCHECKS,
            A11YC_TABLE_MAINTENANCE,
            A11YC_TABLE_VERSIONS,
            A11YC_TABLE_UAS,
            A11YC_TABLE_SETTINGS,
            A11YC_TABLE_PAGES,
            A11YC_TABLE_CACHES,
            A11YC_TABLE_CHECKS,
            A11YC_TABLE_ISSUES,
            A11YC_TABLE_ISSUESBBS,
        );

        foreach ($drops as $drop)
        {
            $sql = 'DROP TABLE '.$drop.';';
            Db::execute($sql);
        }
    }

    /**
     * updateSettings
     *
     * @return Void
     */
    private static function updateSettings()
    {
        $sql = 'SELECT `version` FROM '.A11YC_TABLE_SETTINGS.' GROUP BY `version`;';
        $versions = self::versionArray(Db::fetchAll($sql));

        foreach ($versions as $v)
        {
            $version = $v['version'];
            $sql = 'SELECT * FROM '.A11YC_TABLE_SETTINGS.' WHERE `version` = ?;';

            $vals = array();
            foreach (Db::fetchAll($sql, array($version)) as $v)
            {
                $vals[$v['key']] = $v['is_array'] ? json_decode($v['value'], true) : $v['value'];
            }

            // update urls
            $url = Arr::get($vals, 'base_url', 'https://example.com');
            Model\Data::insert('sites', 'global', array(1 => $url));
            unset($vals['base_url']);

            // update settings
            Model\Data::insert('setting', 'common', $vals, $version);
        }
    }

    /**
     * update pages
     *
     * @return Void
     */
    private static function updatePages()
    {
        $sql = 'SELECT `version` FROM '.A11YC_TABLE_PAGES.' GROUP BY `version`;';
        $versions = self::versionArray(Db::fetchAll($sql));

        foreach ($versions as $v)
        {
            $version = $v['version'];
            $sql = 'SELECT * FROM '.A11YC_TABLE_PAGES.' WHERE `version` = ?;';

            foreach (Db::fetchAll($sql, array($version)) as $vals)
            {
                // update settings
                $url = $vals['url'];
                unset($vals['url']);
                $vals['image_path'] = isset($vals['image_path']) ? $vals['image_path'] : '';
                $vals['type'] = $vals['type'] == 2 ? 'pdf' : 'html';
                Model\Data::insert('page', $url, $vals, $version);
            }
        }
    }

    /**
     * updateVersion
     *
     * @return Array
     */
    private static function updateVersion()
    {
        $sql = 'SELECT * FROM '.A11YC_TABLE_VERSIONS.';';
        $vals = array();
        foreach (Db::fetchAll($sql) as $v)
        {
            $vals[Model\Data::baseUrl(true)][$v['version']] = array(
                'name'    => $v['name'],
                'trash'   => $v['trash'],
            );
        }
        if (empty($vals)) return;

        Model\Data::insert('versions', 'common', $vals);
    }

    /**
     * updateChecklist
     *
     * @param String $url
     * @return Void
     */
    private static function updateChecklist($url)
    {
        $techs = Yaml::each('techs');
        $sql = 'SELECT `version` FROM '.A11YC_TABLE_CHECKS.' WHERE `url` = ? GROUP BY `version`;';
        $versions = self::versionArray(Db::fetchAll($sql, array($url)));

        foreach ($versions as $v)
        {
            $version = $v['version'];

            $sql = 'SELECT * FROM '.A11YC_TABLE_CHECKS.' WHERE `url` = ? AND `version` = ?;';
            $chks = array();
            foreach (Db::fetchAll($sql, array($url, $version)) as $v)
            {
                $chks[] = $v['code'];
            }

            $value = self::initKeysByCriterions();
            foreach ($chks as $chk)
            {
                foreach ($techs[$chk]['apps'] as $criterion)
                {
                    $value[$criterion][] = $chk;
                }
            }

            Model\Data::insert('check_failure', $url, Model\Checklist::filterFailure($value), $version);
            Model\Data::insert('check', $url, $value, $version);
        }
    }

    /**
     * updateResults
     *
     * @param String $url
     * @return Array
     */
    private static function updateResults($url)
    {
        $sql = 'SELECT `version` FROM '.A11YC_TABLE_RESULTS.' WHERE `url` = ? GROUP BY `version`;';
        $versions = self::versionArray(Db::fetchAll($sql, array($url)));

        foreach ($versions as $v)
        {
            $version = $v['version'];

            $sql = 'SELECT * FROM '.A11YC_TABLE_RESULTS.' WHERE `url` = ? AND `version` = ?;';
            $results = Db::fetchAll($sql, array($url, $version));
            $value = self::initKeysByCriterions();
            foreach ($results as $v)
            {
                unset($v['version']);
                unset($v['url']);
                $criterion = $v['criterion'];
                unset($v['criterion']);
                $value[$criterion] = $v;
            }

            Model\Data::insert('result', $url, $value, $version);
        }
    }

    /**
     * updateBulk
     *
     * @return Array
     */
    private static function updateBulk()
    {
        $sql = 'SELECT * FROM '.A11YC_TABLE_BCHECKS.';';
        $value = array();
        foreach (Db::fetchAll($sql) as $v)
        {
            $value[$v['code']]['is_checked'] = $v['is_checked'];
        }
        Model\Setting::insert(array(
                'bulk_checks' => $value,
            ));

        $sql = 'SELECT * FROM '.A11YC_TABLE_BRESULTS.';';
        $value = array();
        foreach (Db::fetchAll($sql) as $v)
        {
            $value[$v['criterion']]['memo'] = Arr::get($v, 'memo');
            $value[$v['criterion']]['uid'] = $v['uid'];
            $value[$v['criterion']]['result'] = Arr::get($v, 'result');
            $value[$v['criterion']]['method'] = Arr::get($v, 'method');
        }
        Model\Setting::insert(array(
                'bulk_results' => $value,
            ));
    }

    /**
     * updateMaintenance
     *
     * @return Array
     */
    private static function updateMaintenance()
    {
        $sql = 'SELECT `last_checked` FROM '.A11YC_TABLE_MAINTENANCE.';';
        $ret = Db::fetch($sql);
        Model\Setting::insert(array(
                'last_checked' => $ret['last_checked'],
            ));
    }

    /**
     * update UA
     *
     * @return Array
     */
    private static function updateUa()
    {
        $sql = 'SELECT * FROM '.A11YC_TABLE_UAS.';';
        Model\Setting::insert(array(
                'user_agents' => Db::fetchAll($sql),
            ));
    }

    /**
     * updateIssues
     *
     * @return Void
     */
    private static function updateIssues()
    {
        $sql = 'SELECT `version` FROM '.A11YC_TABLE_ISSUES.' GROUP BY `version`;';
        $versions = self::versionArray(Db::fetchAll($sql));

        foreach ($versions as $v)
        {
            $version = $v['version'];
            $sql = 'SELECT * FROM '.A11YC_TABLE_ISSUES.' WHERE `version` = ?;';

            foreach (Db::fetchAll($sql, array($version)) as $vals)
            {
                $vals['bbs'] = self::issueBbs($vals);
                unset($vals['id']);

                $vals['title'] = Arr::get($vals, 'title', '');
                $vals['seq'] = 0;
                $vals['url'] = $vals['is_common'] == 1 || empty($vals['url']) ? 'common' : $vals['url'] ;
                $vals['is_common'] = $vals['url'] == 'common' ? 1 : $vals['is_common'];
                $vals['techs'] = array();
                $vals['other_urls'] = '';

                $vals = self::techVals($vals);

                $url = $vals['url'];
                if (empty($url)) continue;
                unset($vals['url']);

                Model\Data::insert('issue', $url, $vals, $version);
            }
        }
    }

    /**
     * issueBbs
     *
     * @param Array $vals
     * @return Array
     */
    private static function issueBbs($vals)
    {
        $bbses = array();
        $sql = 'SELECT * FROM '.A11YC_TABLE_ISSUESBBS.' WHERE `issue_id` = ?;';
        foreach (Db::fetchAll($sql, array($vals['id'])) as $bbs)
        {
            unset($bbs['id']);
            unset($bbs['issue_id']);
            $bbses[] = $bbs;
        }
        return $bbses;
    }

    /**
     * techVals
     *
     * @param Array $vals
     * @return Array
     */
    private static function techVals($vals)
    {
        if (isset($vals['tech_url']) && ! empty($vals['tech_url']))
        {
            $techs = array();
            $other_urls = array();
            foreach (explode("\n", $vals['tech_url']) as $tech)
            {
                if (strpos($tech, 'WCAG-TECHS') === false)
                {
                    $other_urls[] = $tech;
                    continue;
                }
                $tech = substr($tech, strrpos($tech, '/') + 1);
                $techs[] = trim(str_replace('.html', '', $tech));
            }
            $vals['techs'] = $techs;
            $vals['other_urls'] = join("\n", $other_urls);
        }
        unset($vals['tech_url']);

        return $vals;
    }

    /**
     * updateCaches
     *
     * @return Void
     */
    private static function updateCaches()
    {
        $sql = 'SELECT * FROM '.A11YC_TABLE_CACHES.';';
        foreach (Db::fetchAll($sql) as $vals)
        {
            $url = $vals['url'];
            $ua = $vals['ua'];
            unset($vals['url']);
            unset($vals['type']);
            unset($vals['ua']);

            $vals[$ua] = $vals['data'];
            unset($vals['data']);

            Model\Data::insert('html', $url, $vals);
        }
    }
}