%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/move-content/jobs/
Upload File :
Create Path :
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/move-content/jobs/MoveUserContentJob.php

<?php
/**
 * Move content
 * @link https://www.cuzy.app
 * @license https://www.cuzy.app/cuzy-license
 * @author [Marc FARRE](https://marc.fun)
 */

namespace humhub\modules\moveContent\jobs;

use humhub\modules\activity\models\Activity;
use humhub\modules\cfiles\models\File;
use humhub\modules\cfiles\models\Folder;
use humhub\modules\comment\models\Comment;
use humhub\modules\content\components\ContentActiveRecord;
use humhub\modules\content\models\Content;
use humhub\modules\content\models\ContentTag;
use humhub\modules\eventsManager\models\EventSpeaker;
use humhub\modules\like\models\Like;
use humhub\modules\queue\ActiveJob;
use humhub\modules\survey\models\Answer;
use humhub\modules\user\models\User;
use Yii;
use yii\db\IntegrityException;
use yii\queue\RetryableJobInterface;


class MoveUserContentJob extends ActiveJob implements RetryableJobInterface
{
    /**
     * @var string User guid
     */
    public $sourceUserGuid;

    /**
     * @var string User guid
     */
    public $targetUserGuid;

    /**
     * @var bool
     */
    public $moveProfileContent = false;

    /**
     * @var Content
     */
    protected $_content;

    /**
     * @var Content
     */
    protected $_model;

    /**
     * @var ContentActiveRecord
     */
    protected $_nbContentMoved = 0;

    /**
     * @var array
     */
    protected $_errors = [];

    /**
     * @inhertidoc
     * @var int maximum 1 hour
     */
    private $maxExecutionTime = 60 * 60;

    /**
     * @inheritdoc
     */
    public function run()
    {
        $sourceUser = User::findOne(['guid' => $this->sourceUserGuid]);
        $targetUser = User::findOne(['guid' => $this->targetUserGuid]);

        if (!$sourceUser || !$targetUser) {
            return;
        }

        $this->moveContent($sourceUser, $targetUser);
        $this->moveContentAddons($sourceUser, $targetUser);
    }

    /**
     * @param User $sourceUser
     * @param User $targetUser
     * @return void
     */
    protected function moveContent(User $sourceUser, User $targetUser)
    {
        $contentQuery = Content::find()
            ->where(['created_by' => $sourceUser->id])
            ->orWhere(['contentcontainer_id' => $sourceUser->contentcontainer_id]);

        /** @var Content $content */
        foreach ($contentQuery->each() as $content) {

            // Get and check Content and Model
            $this->_content = $content;
            try {
                $this->_model = $this->_content->getModel();
            } catch (IntegrityException $e) {
                continue;
            }
            if (
                !$this->_model
                || $this->_model instanceof Activity
            ) {
                continue;
            }

            // The content is in the user profile
            if ($this->_content->container instanceof User) {
                if (
                    $this->moveProfileContent
                    && !$this->_model instanceof File
                    && !$this->_model instanceof Folder
                    && $this->_content->container->moduleManager->isEnabled($this->_model->getModuleId())
                ) {
                    $this->_content->contentcontainer_id = $targetUser->contentcontainer_id;
                    $this->changeContentOwnerAndSave($targetUser);
                    $this->_model->afterMove($targetUser);
                }
            } // The content is global or in a space
            else {
                $this->changeContentOwnerAndSave($targetUser);
            }
        }

        // Log result
        Yii::warning($this->_nbContentMoved . ' contents of user "' . $sourceUser->username . '" have been transferred to user "' . $targetUser->username . '"', 'move-content');
        if ($this->_errors) {
            Yii::error('Errors while transferring content from user "' . $sourceUser->username . '" to user "' . $targetUser->username . '": ' . implode(' | ', $this->_errors), 'move-content');
        }
    }

    /**
     * @param User $sourceUser
     * @param User $targetUser
     * @return void
     */
    protected function moveContentAddons(User $sourceUser, User $targetUser)
    {
        $nbContentAddonsMoved = 0;
        $errors = [];

        $condition = ['created_by' => $sourceUser->id];
        $contentAddonQueries = [
            Comment::find()->where($condition),
            Like::find()->where($condition),
        ];
        if (class_exists(Answer::class)) {
            $contentAddonQueries[] = Answer::find()->where($condition);
        }
        if (class_exists(EventSpeaker::class)) {
            $contentAddonQueries[] = EventSpeaker::find()->where($condition);
        }

        foreach ($contentAddonQueries as $contentAddonQuery) {
            foreach ($contentAddonQuery->each() as $contentAddon) {
                $contentAddon->created_by = $targetUser->id;
                if ($contentAddon->save()) {
                    $nbContentAddonsMoved++;
                } else {
                    $this->_errors[] = 'Content addon ID ' . $contentAddon->id . ': ' . implode(' ', $contentAddon->getErrorSummary(true));
                }
            }
        }

        // Log result
        Yii::warning($nbContentAddonsMoved . ' content addons of user "' . $sourceUser->username . '" have been transferred to user "' . $targetUser->username . '"', 'move-content');
        if ($errors) {
            Yii::error('Errors while transferring content addons from user "' . $sourceUser->username . '" to user "' . $targetUser->username . '": ' . implode(' | ', $errors), 'move-content');
        }
    }

    /**
     * @param User $targetUser
     * @return void
     */
    protected function changeContentOwnerAndSave(User $targetUser)
    {
        $this->_content->created_by = $targetUser->id;

        if ($this->_content->save()) {
            ContentTag::deleteContentRelations($this->_content, false);
            $this->_model->populateRelation('content', $this->_content);
            if (isset($this->_model->created_by)) {
                $this->_model->created_by = $targetUser->id;
                $scenarios = $this->_model->scenarios();
                $scenario = $this->_model->getScenario();
                if (isset($scenarios[$scenario])) {
                    $this->_model->save();
                }
            }
            $this->_nbContentMoved++;
        } else {
            $this->_errors[] = 'Content ID ' . $this->_content->id . ': ' . implode(' ', $this->_content->getErrorSummary(true));
        }
    }

    /**
     * @inheritDoc
     */
    public function getTtr()
    {
        return $this->maxExecutionTime;
    }

    /**
     * @inheritDoc for RetryableJobInterface
     */
    public function canRetry($attempt, $error)
    {
        return true;
    }
}

Zerion Mini Shell 1.0