%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/models/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/models/Follow.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\user\models;
use humhub\components\behaviors\PolymorphicRelation;
use humhub\modules\user\activities\UserFollow;
use humhub\modules\user\notifications\Followed;
use Yii;
use yii\base\InvalidConfigException;
use yii\db\ActiveQuery;
use yii\db\ActiveRecord;
use yii\db\Query;
use humhub\modules\user\components\ActiveQueryUser;
use humhub\modules\user\events\FollowEvent;
use humhub\modules\activity\models\Activity;
use humhub\modules\space\models\Space;
/**
* This is the model class for table "user_follow".
*
* @property integer $id
* @property string $object_model
* @property integer $object_id
* @property integer $user_id
* @property integer $send_notifications
*/
class Follow extends ActiveRecord
{
/**
* @event \humhub\modules\user\events\FollowEvent
*/
const EVENT_FOLLOWING_CREATED = 'followCreated';
/**
* @event \humhub\modules\user\events\FollowEvent
*/
const EVENT_FOLLOWING_REMOVED = 'followRemoved';
/**
* @inheritdoc
*/
public static function tableName()
{
return 'user_follow';
}
/**
* @inheritdoc
*/
public function init()
{
// Set send_notifications to 0 by default
if ($this->send_notifications === null) {
$this->send_notifications = 0;
}
}
/**
* @inheritdoc
*/
public function behaviors()
{
return [
[
'class' => PolymorphicRelation::class,
'mustBeInstanceOf' => [
ActiveRecord::class,
]
]
];
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['object_model', 'object_id', 'user_id'], 'required'],
[['object_id', 'user_id'], 'integer'],
[['send_notifications'], 'boolean'],
[['object_model'], 'string', 'max' => 100]
];
}
/**
* @inheritdoc
* @throws InvalidConfigException
*/
public function afterSave($insert, $changedAttributes)
{
if ($insert && $this->send_notifications && $this->object_model == User::class) {
Followed::instance()
->from($this->user)
->about($this)
->send($this->getTarget());
UserFollow::instance()
->from($this->user)
->container($this->user)
->about($this)
->save();
}
$this->trigger(Follow::EVENT_FOLLOWING_CREATED, new FollowEvent(['user' => $this->user, 'target' => $this->getTarget()]));
parent::afterSave($insert, $changedAttributes);
}
/**
* @inheritdoc
*/
public function beforeDelete()
{
if($this->getTarget()) {
$this->trigger(Follow::EVENT_FOLLOWING_REMOVED, new FollowEvent(['user' => $this->user, 'target' => $this->getTarget()]));
// ToDo: Handle this via event of User Module
if ($this->object_model === User::class) {
$notification = new Followed();
$notification->originator = $this->user;
$notification->delete($this->getTarget());
foreach (Activity::findAll(['object_model' => static::class, 'object_id' => $this->id]) as $activity) {
$activity->delete();
}
}
}
return parent::beforeDelete();
}
public function getUser()
{
return $this->hasOne(User::class, ['id' => 'user_id']);
}
public function getTarget()
{
try {
$targetClass = $this->object_model;
if ($targetClass != "" && is_subclass_of($targetClass, ActiveRecord::class)) {
return $targetClass::findOne(['id' => $this->object_id]);
}
} catch(\Exception $e) {
// Avoid errors in integrity check
Yii::error($e);
}
return null;
}
/**
* Returns all followed spaces of the given user as ActiveQuery.
* If $withNotifications is set only follower with the given send_notifications setting are returned.
*
* @param User $user
* @param boolean|null $withNotifications by notification setting (default is null without notification handling)
* @return ActiveQuery Space query of all followed spaces
* @since 1.2
*/
public static function getFollowedSpacesQuery(User $user, $withNotifications = null)
{
$subQuery = self::find()
->where(['user_follow.user_id' => $user->id, 'user_follow.object_model' => Space::class])
->andWhere('user_follow.object_id=space.id');
if ($withNotifications === true) {
$subQuery->andWhere(['user_follow.send_notifications' => 1]);
} elseif ($withNotifications === false) {
$subQuery->andWhere(['user_follow.send_notifications' => 0]);
}
return Space::find()->where(['exists', $subQuery]);
}
/**
* @param User $user
* @param null $withNotifications
* @return ActiveQueryUser
*/
public static function getFollowedUserQuery(User $user, $withNotifications = null)
{
$subQuery = self::find()
->where(['user_follow.user_id' => $user->id, 'user_follow.object_model' => User::class])
->andWhere('user_follow.object_id=user.id');
if ($withNotifications === true) {
$subQuery->andWhere(['user_follow.send_notifications' => 1]);
} elseif ($withNotifications === false) {
$subQuery->andWhere(['user_follow.send_notifications' => 0]);
}
return User::find()->where(['exists', $subQuery]);
}
/**
* Returns a query searching for all container ids the user is following. If $containerClass is given we only search
* for a certain container type.
*
* @param User $user
* @param string $containerClass
* @return Query
* @since 1.8
*/
public static function getFollowedContainerIdQuery(User $user, $containerClass = null)
{
return (new Query())
->select("contentcontainer.id AS id")
->from('user_follow')
->innerJoin('contentcontainer', 'contentcontainer.pk = user_follow.object_id AND contentcontainer.class = user_follow.object_model')
->where(['user_follow.user_id' => $user->id])
->indexBy('id')
->andWhere($containerClass
? ['user_follow.object_model' => $containerClass]
: ['OR', ['user_follow.object_model' => Space::class], ['user_follow.object_model' => User::class]]);
}
/**
* Returns all active users following the given $target record.
* If $withNotifications is set only follower with the given send_notifications setting are returned.
*
* @param ActiveRecord $target
* @param boolean $withNotifications
* @return ActiveQueryUser
*/
public static function getFollowersQuery(ActiveRecord $target, $withNotifications = null)
{
$subQuery = self::find()
->where(['user_follow.object_model' => $target->className(), 'user_follow.object_id' => $target->getPrimaryKey()])
->andWhere('user_follow.user_id=user.id');
if ($withNotifications === true) {
$subQuery->andWhere(['user_follow.send_notifications' => 1]);
} elseif ($withNotifications === false) {
$subQuery->andWhere(['user_follow.send_notifications' => 0]);
}
return User::find()->visible()->andWhere(['exists', $subQuery]);
}
}