View file upload/src/addons/BS/Contests/Setup.php

File size: 5.94Kb
<?php

namespace BS\Contests;

use XF\AddOn\AbstractSetup;
use XF\AddOn\StepRunnerInstallTrait;
use XF\AddOn\StepRunnerUninstallTrait;
use XF\AddOn\StepRunnerUpgradeTrait;
use BS\Contests\Install\ContestInstallHelperTrait;
use XF\Db\Schema\Alter;
use XF\Db\Schema\Create;

class Setup extends AbstractSetup
{
	use StepRunnerInstallTrait;
	use StepRunnerUpgradeTrait;
	use StepRunnerUninstallTrait;
    use ContestInstallHelperTrait;

    // ################################ INSTALLATION ####################

	public function installStep1()
	{
        $sm = $this->schemaManager();

        foreach ($this->getTables() AS $tableName => $closure)
        {
            $sm->createTable($tableName, $closure);
        }
	}

	public function installStep2()
	{
		$this->schemaManager()->alterTable('xf_user', function(Alter $table)
        {
            $table->addColumn('bs_contest_count', 'int')->setDefault(0);
            $table->addKey('bs_contest_count');
        });
	}

    // ################################ UPGRADE 2.1.1 ####################

    public function upgrade2010170Step1()
    {
        $this->schemaManager()->alterTable('xf_user', function(Alter $table)
        {
            $table->renameColumn('contest_count', 'bs_contest_count');
        });
    }

    public function upgrade2010170Step2()
    {
        $this->schemaManager()->alterTable('xf_contest', function(Alter $table)
        {
            $table->renameTo('xf_bs_contest');
            $table->addColumn('criteria', 'blob')->nullable();
            $table->addColumn('prizes', 'mediumblob')->nullable();
            $table->addColumn('count_members', 'int')->setDefault(0);
            $table->addColumn('end_date', 'int')->setDefault(0);
            $table->addColumn('count_winners', 'int')->setDefault(0);
            $table->addColumn('auto_give_prize', 'tinyint', 3)->setDefault(0);
            $table->addColumn('recipient_count', 'int')->setDefault(0);
            $table->addKey('count_members');
            $table->addKey('end_date');
            $table->addKey('recipient_count');
        });

        $this->schemaManager()->alterTable('xf_contest_participant', function(Alter $table)
        {
            $table->renameTo('xf_bs_contest_participant');
            $table->addColumn('win_date', 'int')->setDefault(0);
            $table->addKey('win_date');
        });
    }

    public function upgrade2010170Step3(array $stepParams)
    {
        $position = empty($stepParams[0]) ? 0 : $stepParams[0];

        return $this->convertOldContests($position, $stepParams);
    }

    public function upgrade2010170Step4(array $stepParams)
    {
        $this->query("
            UPDATE `xf_bs_contest` SET `recipient_count`=(
                SELECT COUNT(*)
                FROM `xf_bs_contest_participant`
                WHERE `xf_bs_contest_participant`.`contest_id` = `xf_bs_contest`.`contest_id`
            )
        ");
    }

    public function upgrade2010170Step5(array $stepParams)
    {
        $this->schemaManager()->alterTable('xf_bs_contest', function(Alter $table)
        {
            $table->dropColumns('data');
        });
    }

    // ############################### UNINSTALL #########################
    
	public function uninstallStep1()
	{
		$sm = $this->schemaManager();

        foreach (array_keys($this->getTables()) AS $tableName)
        {
            $sm->dropTable($tableName);
        }
	}

	public function uninstallStep2()
	{
		$this->schemaManager()->alterTable('xf_user', function(Alter $table)
        {
        	$table->dropColumns('bs_contest_count');
        });
	}

    // ############################# TABLE / DATA DEFINITIONS ##############################

    protected function getTables()
    {
        $tables = [];

        $tables['xf_bs_contest'] = function(Create $table)
        {
            $table->addColumn('contest_id', 'int')->autoIncrement();
            $table->addColumn('thread_id', 'int');
            $table->addColumn('user_id', 'int');
            $table->addColumn('type', 'enum', ['time', 'members']);
            $table->addColumn('criteria', 'blob')->nullable();
            $table->addColumn('prizes', 'mediumblob')->nullable();
            $table->addColumn('count_members', 'int')->setDefault(0);
            $table->addColumn('end_date', 'int')->setDefault(0);
            $table->addColumn('count_winners', 'int')->setDefault(0);
            $table->addColumn('recipient_count', 'int')->setDefault(0);
            $table->addColumn('is_finished', 'tinyint', 3)->setDefault(0);
            $table->addColumn('is_checked', 'tinyint', 3)->setDefault(0);
            $table->addColumn('auto_give_prize', 'tinyint', 3)->setDefault(0);
            $table->addKey('thread_id');
            $table->addKey('user_id');
            $table->addKey('type');
            $table->addKey('end_date');
            $table->addKey('is_finished');
            $table->addKey('is_checked');
            $table->addKey('recipient_count');
            $table->addKey('count_members');
        };

        $tables['xf_bs_contest_participant'] = function(Create $table)
        {
            $table->addColumn('participant_id', 'int')->autoIncrement();
            $table->addColumn('contest_id', 'int');
            $table->addColumn('user_id', 'int');
            $table->addColumn('username', 'varchar', 50);
            $table->addColumn('is_winner', 'tinyint', 3)->setDefault(0);
            $table->addColumn('place', 'int')->setDefault(0);
            $table->addColumn('win_date', 'int')->setDefault(0);
            $table->addUniqueKey(['contest_id', 'user_id']);
            $table->addKey('win_date');
            $table->addKey('place');
            $table->addKey('is_winner');
            $table->addKey('contest_id');
            $table->addKey('user_id');
            $table->addKey('username');
        };

        return $tables;
    }
}