%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/space/models/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/space/models/Membership.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\space\models;
use humhub\components\ActiveRecord;
use humhub\modules\user\models\User;
use humhub\modules\content\models\Content;
use Yii;
use yii\db\Query;
/**
* This is the model class for table "space_membership".
*
* @property integer $id
* @property integer $space_id
* @property integer $user_id
* @property string|null $originator_user_id
* @property integer|null $status
* @property string|null $request_message
* @property string|null $last_visit
* @property integer $show_at_dashboard
* @property integer $can_cancel_membership
* @property string $group_id
* @property string|null $created_at
* @property integer|null $created_by
* @property string|null $updated_at
* @property integer|null $updated_by
* @property integer $send_notifications
*
* @property Space $space
* @property User $user
* @property User|null $originator
*/
class Membership extends ActiveRecord
{
/**
* @event \humhub\modules\space\MemberEvent
*/
const EVENT_MEMBER_REMOVED = 'memberRemoved';
/**
* @event \humhub\modules\space\MemberEvent
*/
const EVENT_MEMBER_ADDED = 'memberAdded';
/**
* Status Codes
*/
const STATUS_INVITED = 1;
const STATUS_APPLICANT = 2;
const STATUS_MEMBER = 3;
const USER_SPACES_CACHE_KEY = 'userSpaces_';
const USER_SPACEIDS_CACHE_KEY = 'userSpaceIds_';
/**
* @inheritdoc
*/
public static function tableName()
{
return 'space_membership';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['space_id', 'user_id'], 'required'],
[['space_id', 'user_id', 'originator_user_id', 'status', 'created_by', 'updated_by'], 'integer'],
[['request_message'], 'string'],
[['last_visit', 'created_at', 'group_id', 'updated_at'], 'safe']
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'space_id' => 'Space ID',
'user_id' => 'User ID',
'originator_user_id' => Yii::t('SpaceModule.base', 'Originator User ID'),
'status' => Yii::t('SpaceModule.base', 'Status'),
'request_message' => Yii::t('SpaceModule.base', 'Request Message'),
'last_visit' => Yii::t('SpaceModule.base', 'Last Visit'),
'created_at' => Yii::t('SpaceModule.base', 'Created At'),
'created_by' => Yii::t('SpaceModule.base', 'Created By'),
'updated_at' => Yii::t('SpaceModule.base', 'Updated At'),
'updated_by' => Yii::t('SpaceModule.base', 'Updated By'),
'can_leave' => 'Can Leave'
];
}
/**
* Determines if this membership is a full accepted membership.
*
* @return bool
* @since v1.2.1
*/
public function isMember()
{
return $this->status == self::STATUS_MEMBER;
}
/**
* @since 1.13
* @return bool
*/
public function isPrivileged(): bool
{
return ($this->isMember() &&
in_array($this->group_id, [
Space::USERGROUP_OWNER,
Space::USERGROUP_ADMIN,
Space::USERGROUP_MODERATOR
]));
}
public function getUser()
{
return $this->hasOne(User::class, ['id' => 'user_id']);
}
public function getOriginator()
{
return $this->hasOne(User::class, ['id' => 'originator_user_id']);
}
public function getSpace()
{
return $this->hasOne(Space::class, ['id' => 'space_id']);
}
public function beforeSave($insert)
{
Yii::$app->cache->delete(self::USER_SPACES_CACHE_KEY . $this->user_id);
Yii::$app->cache->delete(self::USER_SPACEIDS_CACHE_KEY . $this->user_id);
return parent::beforeSave($insert);
}
public function beforeDelete()
{
Yii::$app->cache->delete(self::USER_SPACES_CACHE_KEY . $this->user_id);
Yii::$app->cache->delete(self::USER_SPACEIDS_CACHE_KEY . $this->user_id);
return parent::beforeDelete();
}
/**
* Update last visit
*/
public function updateLastVisit()
{
$this->last_visit = date('Y-m-d G:i:s');
$this->update(false, ['last_visit']);
}
/**
* Counts all new Items for this membership
*/
public function countNewItems()
{
$query = Content::find();
$query->where(['stream_channel' => 'default']);
$query->andWhere(['contentcontainer_id' => $this->space->contentContainerRecord->id]);
$query->andWhere(['>', 'created_at', $this->last_visit]);
return $query->count();
}
/**
* Returns a list of all spaces of the given userId
*
* @param int|string $userId the user id or empty for current user
* @param boolean $cached use cached result if available
* @return Space[] an array of spaces
*/
public static function getUserSpaces($userId = '', $cached = true)
{
if ($userId === '') {
$userId = Yii::$app->user->id;
}
$cacheId = self::USER_SPACES_CACHE_KEY . $userId;
$spaces = Yii::$app->cache->get($cacheId);
if ($spaces === false || !$cached) {
$spaces = [];
foreach (static::getMembershipQuery($userId)->all() as $membership) {
$spaces[] = $membership->space;
}
Yii::$app->cache->set($cacheId, $spaces);
}
return $spaces;
}
/**
* Returns a list of all spaces' ids of the given userId
*
* @param integer $userId
* @return array|mixed
* @since 1.2.5
*/
public static function getUserSpaceIds($userId = '')
{
if ($userId === '') {
$userId = Yii::$app->user->id;
}
$cacheId = self::USER_SPACEIDS_CACHE_KEY . $userId;
$spaceIds = Yii::$app->cache->get($cacheId);
if ($spaceIds === false) {
$spaceIds = static::getMembershipQuery($userId)->select('space_id')->column();
Yii::$app->cache->set($cacheId, $spaceIds);
}
return $spaceIds;
}
private static function getMembershipQuery($userId)
{
$orderSetting = Yii::$app->getModule('space')->settings->get('spaceOrder');
$orderBy = 'name ASC';
if ($orderSetting != 0) {
$orderBy = 'last_visit DESC';
}
$query = self::find()->joinWith('space')->orderBy($orderBy);
$query->where(['user_id' => $userId, 'space_membership.status' => self::STATUS_MEMBER]);
return $query;
}
/**
* Returns Space for user space membership
*
* @param \humhub\modules\user\models\User $user
* @param boolean $memberOnly include only member status - no pending/invite states
* @param boolean|null $withNotifications include only memberships with sendNotification setting
* @return \yii\db\ActiveQuery for space model
* @since 1.0
*/
public static function getUserSpaceQuery(User $user, $memberOnly = true, $withNotifications = null)
{
$query = Space::find();
$query->visible();
$query->leftJoin(
'space_membership',
'space_membership.space_id=space.id and space_membership.user_id=:userId',
[':userId' => $user->id]
);
if ($memberOnly) {
$query->andWhere(['space_membership.status' => self::STATUS_MEMBER]);
}
if ($withNotifications === true) {
$query->andWhere(['space_membership.send_notifications' => 1]);
} elseif ($withNotifications === false) {
$query->andWhere(['space_membership.send_notifications' => 0]);
}
if (Yii::$app->getModule('space')->settings->get('spaceOrder') == 0) {
$query->orderBy('name ASC');
} else {
$query->orderBy('last_visit DESC');
}
$query->orderBy(['name' => SORT_ASC]);
return $query;
}
/**
* Returns an ActiveQuery selcting all memberships for the given $user.
*
* @param User $user
* @param integer $membershipStatus the status of the Space by default self::STATUS_MEMBER.
* @param integer $spaceStatus the status of the Space by default Space::STATUS_ENABLED.
* @return \yii\db\ActiveQuery
* @since 1.2
*/
public static function findByUser(
User $user = null,
$membershipStatus = self::STATUS_MEMBER,
$spaceStatus = Space::STATUS_ENABLED
)
{
if (!$user) {
$user = Yii::$app->user->getIdentity();
}
$query = Membership::find();
if (Yii::$app->getModule('space')->settings->get('spaceOrder') == 0) {
$query->orderBy('space.name ASC');
} else {
$query->orderBy('space_membership.last_visit DESC');
}
$query->joinWith('space')->where(['space_membership.user_id' => $user->id]);
$query->joinWith('space.contentContainerRecord');
if ($spaceStatus) {
$query->andWhere(['space.status' => $spaceStatus]);
}
if ($membershipStatus) {
$query->andWhere(['space_membership.status' => $membershipStatus]);
}
return $query;
}
/**
* Returns a user query for space memberships
*
* @param Space $space
* @param boolean $membersOnly Only return approved members
* @param boolean|null $withNotifications include only memberships with sendNotification setting
* @return \humhub\modules\user\components\ActiveQueryUser
* @since 1.1
*/
public static function getSpaceMembersQuery(Space $space, $membersOnly = true, $withNotifications = null)
{
$query = User::find()->active();
$query->join('LEFT JOIN', 'space_membership', 'space_membership.user_id=user.id');
if ($membersOnly) {
$query->andWhere(['space_membership.status' => self::STATUS_MEMBER]);
}
if ($withNotifications === true) {
$query->andWhere(['space_membership.send_notifications' => 1]);
} elseif ($withNotifications === false) {
$query->andWhere(['space_membership.send_notifications' => 0]);
}
$query->andWhere(['space_id' => $space->id])->defaultOrder();
return $query;
}
/**
* Selects the container id of spaces the given users is a member of.
*
* @param User $user
* @return Query
* @since 1.8
*/
public static function getMemberSpaceContainerIdQuery(User $user)
{
return (new Query())
->select("space.contentcontainer_id AS id")
->from('space')
->innerJoin('space_membership sm', 'space.id = sm.space_id')
->where('sm.user_id = :userId', [':userId' => $user->id])
->indexBy('id')
->andWhere('space.status = :spaceStatusEnabled', [':spaceStatusEnabled' => Space::STATUS_ENABLED]);
}
/**
* Checks if the current logged in user is the related user of this membership record.
*
* @return bool
* @since 1.3.9
*/
public function isCurrentUser(): bool
{
return !Yii::$app->user->isGuest && Yii::$app->user->identity->id === $this->user_id;
}}