%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/move-content/jobs/ |
| 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;
}
}