%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/friendship/models/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/friendship/models/Friendship.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2016 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\modules\friendship\models; use humhub\modules\user\models\User; use humhub\modules\friendship\FriendshipEvent; use humhub\modules\friendship\notifications\RequestDeclined; use humhub\modules\friendship\notifications\Request; use humhub\modules\friendship\notifications\RequestApproved; use yii\db\Expression; use yii\db\Query; /** * This is the model class for table "user_friendship". * * @property integer $id * @property integer $user_id * @property integer $friend_user_id * @property string $created_at * * @property User $friendUser * @property User $user */ class Friendship extends \humhub\components\ActiveRecord { /** * @event \humhub\modules\friendship\FriendshipEvent */ const EVENT_FRIENDSHIP_CREATED = 'friendshipCreated'; /** * @event \humhub\modules\friendship\FriendshipEvent */ const EVENT_FRIENDSHIP_REMOVED = 'friendshipRemoved'; /** * Friendship States */ const STATE_NONE = 0; const STATE_FRIENDS = 1; const STATE_REQUEST_RECEIVED = 2; const STATE_REQUEST_SENT = 3; /** * @inheritdoc */ public static function tableName() { return 'user_friendship'; } /** * @inheritdoc */ public function rules() { return [ [['user_id', 'friend_user_id'], 'required'], [['user_id', 'friend_user_id'], 'integer'], [['user_id', 'friend_user_id'], 'unique', 'targetAttribute' => ['user_id', 'friend_user_id'], 'message' => 'The combination of User ID and Friend User ID has already been taken.'] ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'id' => 'ID', 'user_id' => 'User ID', 'friend_user_id' => 'Friend User ID', 'created_at' => 'Created At', ]; } /** * @return \yii\db\ActiveQuery */ public function getFriendUser() { return $this->hasOne(User::class, ['id' => 'friend_user_id']); } /** * @return \yii\db\ActiveQuery */ public function getUser() { return $this->hasOne(User::class, ['id' => 'user_id']); } /** * @inheritdoc */ public function afterSave($insert, $changedAttributes) { if ($insert) { // Check if this is an request (friend has no entry in table) $state = self::getStateForUser($this->user, $this->friendUser); if ($state === self::STATE_REQUEST_SENT) { // Send Request Notification Request::instance()->from($this->user)->about($this)->send($this->friendUser); } elseif ($state === self::STATE_FRIENDS) { // Remove request notification Request::instance()->from($this->friendUser)->delete($this->user); // User approved friends request notification RequestApproved::instance()->from($this->user)->about($this)->send($this->friendUser); $this->trigger(self::EVENT_FRIENDSHIP_CREATED, new FriendshipEvent([ 'user1' => $this->user, 'user2' => $this->friendUser, ])); } } return parent::afterSave($insert, $changedAttributes); } /** * Returns the friendship state between to users * * @param User $user * @param User $friend * * @return int the request state see self::STATE_* */ public static function getStateForUser($user, $friend) { $state = self::STATE_NONE; if (self::getSentRequestsQuery($user)->andWhere(['user.id' => $friend->id])->one() !== null) { $state = self::STATE_REQUEST_SENT; } elseif (self::getFriendsQuery($user)->andWhere(['user.id' => $friend->id])->one() !== null) { $state = self::STATE_FRIENDS; } elseif (self::getReceivedRequestsQuery($user)->andWhere(['user.id' => $friend->id])->one() !== null) { $state = self::STATE_REQUEST_RECEIVED; } return $state; } /** * Returns a query for friends of a user * * @return \yii\db\ActiveQuery * @param User $user */ public static function getFriendsQuery(User $user) { $query = User::find(); // Users which received a friend requests from given user $query->leftJoin('user_friendship recv', 'user.id=recv.friend_user_id AND recv.user_id=:userId', [':userId' => $user->id]); $query->andWhere(['IS NOT', 'recv.id', new Expression('NULL')]); // Users which send a friend request to given user $query->leftJoin('user_friendship snd', 'user.id=snd.user_id AND snd.friend_user_id=:userId', [':userId' => $user->id]); $query->andWhere(['IS NOT', 'snd.id', new Expression('NULL')]); return $query; } /** * Returns a query selecting container ids of users the given $user has a friendship relation. * * @param User $user * @return Query * @since 1.8 */ public static function getFriendshipContainerIdQuery(User $user) { return (new Query()) ->select('ufr.contentcontainer_id AS id') ->distinct() ->from('user ufr') ->indexBy('id') ->innerJoin('user_friendship recv', 'ufr.id = recv.friend_user_id AND recv.user_id = :userId', [':userId' => $user->id]) ->innerJoin('user_friendship snd', 'ufr.id = snd.user_id AND snd.friend_user_id = :userId', [':userId' => $user->id]); } /** * Returns a query for sent and not approved friend requests of an user * * @param User $user * @return \yii\db\ActiveQuery */ public static function getSentRequestsQuery(User $user) { $query = User::find(); // Users which received a friend requests from given user $query->leftJoin('user_friendship recv', 'user.id=recv.friend_user_id AND recv.user_id=:userId', [':userId' => $user->id]); $query->andWhere(['IS NOT', 'recv.id', new Expression('NULL')]); // Users which NOT send a friend request to given user $query->leftJoin('user_friendship snd', 'user.id=snd.user_id AND snd.friend_user_id=:userId', [':userId' => $user->id]); $query->andWhere(['IS', 'snd.id', new Expression('NULL')]); return $query; } /** * Returns a query for received and not responded friend requests of an user * * @param User $user * @return \yii\db\ActiveQuery */ public static function getReceivedRequestsQuery($user) { $query = User::find(); // Users which NOT received a friend requests from given user $query->leftJoin('user_friendship recv', 'user.id=recv.friend_user_id AND recv.user_id=:userId', [':userId' => $user->id]); $query->andWhere(['IS', 'recv.id', new Expression('NULL')]); // Users which send a friend request to given user $query->leftJoin('user_friendship snd', 'user.id=snd.user_id AND snd.friend_user_id=:userId', [':userId' => $user->id]); $query->andWhere(['IS NOT', 'snd.id', new Expression('NULL')]); return $query; } /** * Adds a friendship or sends a request * * @param User $user * @param User $friend * @return bool */ public static function add($user, $friend) { $friendship = new Friendship(); $friendship->user_id = $user->id; $friendship->friend_user_id = $friend->id; if ($friendship->save()) { $friend->follow($user, false); return true; } return false; } /** * Cancels a friendship or request to a friend * * @param User $user * @param User $friend */ public static function cancel($user, $friend) { // Delete friends entry $myFriendship = Friendship::findOne(['user_id' => $user->id, 'friend_user_id' => $friend->id]); $friendsFriendship = Friendship::findOne(['user_id' => $friend->id, 'friend_user_id' => $user->id]); if ($friendsFriendship !== null) { $friendsFriendship->delete(); } if ($myFriendship !== null) { $myFriendship->delete(); } elseif ($friendsFriendship !== null) { // Is declined friendship request - send declined notification RequestDeclined::instance()->from($user)->send($friend); } if ($myFriendship !== null && $friendsFriendship !== null) { // Trigger event is friendship was mutual FriendshipEvent::trigger(Friendship::class, Friendship::EVENT_FRIENDSHIP_REMOVED, new FriendshipEvent([ 'user1' => $user, 'user2' => $friend ])); } } }