%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/behaviors/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/behaviors/Followable.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2018 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\user\behaviors;
use humhub\modules\space\models\Space;
use humhub\modules\user\components\ActiveQueryUser;
use humhub\modules\user\models\Follow;
use humhub\modules\user\models\User;
use Yii;
use yii\base\Behavior;
use yii\db\ActiveQuery;
/**
* HFollowableBehavior adds following methods to HActiveRecords
*
* @author Lucas Bartholemy <lucas.bartholemy@humhub.com>
* @package humhub.modules_core.user.behaviors
* @since 0.5
*/
class Followable extends Behavior
{
private $_followerCache = [];
/**
* Return the follow record based on the owner record and the given user id
*
* @param int $userId
* @return Follow
*/
public function getFollowRecord($userId)
{
$userId = ($userId instanceof User) ? $userId->id : $userId;
return Follow::find()->where(['object_model' => $this->owner->className(), 'object_id' => $this->owner->getPrimaryKey(), 'user_id' => $userId])->one();
}
/**
* Follows the owner object
*
* @param int $userId
* @param boolean $withNotifications (since 1.2) sets the send_notifications setting of the membership default true
* @return boolean
*/
public function follow($userId = null, $withNotifications = true)
{
if ($userId instanceof User) {
$userId = $userId->id;
} elseif (!$userId || $userId == "") {
$userId = Yii::$app->user->id;
}
// User cannot follow himself
if ($this->owner instanceof User && $this->owner->id == $userId) {
return false;
} elseif ($this->owner instanceof Space && $this->owner->isMember($userId)) {
return false;
}
$follow = $this->getFollowRecord($userId);
if ($follow === null) {
$follow = new Follow(['user_id' => $userId]);
$follow->setPolyMorphicRelation($this->owner);
}
$follow->send_notifications = $withNotifications;
if (!$follow->save()) {
return false;
}
return true;
}
/**
* Unfollows the owner object
*
* @param int $userId
* @return boolean
*/
public function unfollow($userId = null)
{
if ($userId instanceof User) {
$userId = $userId->id;
} elseif (!$userId || $userId == "") {
$userId = Yii::$app->user->id;
}
$record = $this->getFollowRecord($userId);
if ($record !== null) {
if ($record->delete()) {
return true;
}
} else {
// Not follow this object
return false;
}
return false;
}
/**
* Checks if the given user follows this owner record.
*
* Note that the followers for this owner will be cached.
*
* @param int $userId
* @param boolean $withNotifications if true, only return true when also notifications enabled
* @return boolean Is object followed by user
*/
public function isFollowedByUser($userId = null, $withNotifications = false)
{
if ($userId instanceof User) {
$userId = $userId->id;
} elseif (!$userId || $userId == "") {
$userId = \Yii::$app->user->id;
}
if (!isset($this->_followerCache[$userId])) {
$this->_followerCache[$userId] = $this->getFollowRecord($userId);
}
$record = $this->_followerCache[$userId];
if ($record) {
if ($withNotifications && $record->send_notifications == 1) {
return true;
} elseif (!$withNotifications) {
return true;
}
}
return false;
}
/**
* Get a query of users which are followers of this object.
*
* @return ActiveQueryUser
* @since 1.10
*/
public function getFollowersQuery()
{
return User::find()
->leftJoin('user_follow', 'user.id = user_follow.user_id AND user_follow.object_id=:object_id AND user_follow.object_model = :object_model', [
':object_model' => get_class($this->owner),
':object_id' => $this->owner->getPrimaryKey(),
])
->where('user_follow.user_id IS NOT null')
->visible();
}
/**
* Get a query of users which are followers with enabled notifications of this object.
*
* @return ActiveQueryUser
* @since 1.10
*/
public function getFollowersWithNotificationQuery()
{
return $this->getFollowersQuery()
->andWhere('user_follow.send_notifications=1');
}
/**
* Get a query of objects which the owner object follows
*
* @param $query ActiveQuery e.g. `$user->getFollowingQuery(Content::find())`
* @return ActiveQuery
* @since 1.10
*/
public function getFollowingQuery($query)
{
$query->leftJoin('user_follow', 'user.id=user_follow.object_id AND user_follow.object_model=:object_model',
['object_model' => get_class($this->owner)]);
$query->andWhere(['user_follow.user_id' => $this->owner->id]);
return $query;
}
}