Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Entity/AddOnInstallBatch.php
<?php

namespace XF\Entity;

use
XF\Mvc\Entity\Entity;
use
XF\Mvc\Entity\Structure;

/**
 * COLUMNS
 * @property int|null $batch_id
 * @property int $start_date
 * @property int $complete_date
 * @property array $addon_ids
 * @property array $results
 */
class AddOnInstallBatch extends Entity
{
    protected
$pendingAddOnFiles = [];

    public function
getAbstractedBatchPath()
    {
        if (!
$this->batch_id)
        {
            throw new \
LogicException("Cannot get batch path until saved");
        }

        return
"internal-data://addon_batch/{$this->batch_id}";
    }

    public function
getAbstractedAddOnBatchPath($addOnId)
    {
       
/** @var \XF\Repository\AddOn $addOnRepo */
       
$addOnRepo = $this->repository('XF:AddOn');

       
$addOnIdPath = $addOnRepo->convertAddOnIdToUrlVersion($addOnId);
       
$addOnIdPath = preg_replace('#[^a-z0-9_\\-]#i', '', $addOnIdPath);

        return
$this->getAbstractedBatchPath() . "/{$addOnIdPath}.zip";
    }

    public function
getPlannedActions()
    {
       
$addOnManager = $this->app()->addOnManager();
       
$installedAddOns = $addOnManager->getInstalledAddOns();

       
$actions = [];
        foreach (
$this->addon_ids AS $addOnId => $newInfo)
        {
           
$newTitle = $newInfo['title'];
           
$newVersionId = $newInfo['version_id'];
           
$newVersionString = $newInfo['version_string'];

            if (!isset(
$installedAddOns[$addOnId]))
            {
               
$actions[$addOnId] = [
                   
'action' => 'install',
                   
'title' => $newTitle,
                   
'version' => $newVersionString
               
];
            }
            else
            {
               
$installed = $installedAddOns[$addOnId];
               
$existingVersionId = $installed->version_id;
                if (
$existingVersionId === $newVersionId)
                {
                   
$actions[$addOnId] = [
                       
'action' => 'rebuild',
                       
'title' => $installed->title,
                       
'version' => $newVersionString
                   
];
                }
                else
                {
                   
$actions[$addOnId] = [
                       
'action' => 'upgrade',
                       
'title' => $installed->title,
                       
'version' => $newVersionString,
                       
'oldVersion' => $installed->version_string
                   
];
                }
            }
        }

        return
$actions;
    }

    public function
addAddOn($addOnId, $title, $newVersionId, $newVersionString, $tempFile)
    {
       
$addOnIds = $this->addon_ids;
       
$addOnIds[$addOnId] = [
           
'title' => $title,
           
'version_id' => $newVersionId,
           
'version_string' => $newVersionString,
        ];
       
$this->addon_ids = $addOnIds;

       
$this->pendingAddOnFiles[$addOnId] = $tempFile;
    }

    protected function
_preSave()
    {
        if (!
$this->addon_ids)
        {
           
$this->error(\XF::phrase('cannot_proceed_with_installation_batch_without_any_valid_add_ons'));
        }
    }

    protected function
_postSave()
    {
        if (
$this->pendingAddOnFiles)
        {
            foreach (
$this->pendingAddOnFiles AS $addOnId => $tempFile)
            {
               
$abstractedPath = $this->getAbstractedAddOnBatchPath($addOnId);
                \
XF\Util\File::copyFileToAbstractedPath($tempFile, $abstractedPath);
            }
           
$this->pendingAddOnFiles = [];
        }
    }

    protected function
_postDelete()
    {
        \
XF\Util\File::deleteAbstractedDirectory($this->getAbstractedBatchPath());
    }

    public static function
getStructure(Structure $structure)
    {
       
$structure->table = 'xf_addon_install_batch';
       
$structure->shortName = 'XF:AddOnInstallBatch';
       
$structure->primaryKey = 'batch_id';
       
$structure->columns = [
           
'batch_id' => ['type' => self::UINT, 'autoIncrement' => true, 'nullable' => true],
           
'start_date' => ['type' => self::UINT, 'default' => \XF::$time],
           
'complete_date' => ['type' => self::UINT, 'default' => 0],
           
'addon_ids' => ['type' => self::JSON_ARRAY, 'default' => []],
           
'results' => ['type' => self::JSON_ARRAY, 'default' => []]
        ];
       
$structure->getters = [];
       
$structure->relations = [];

        return
$structure;
    }
}