%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/mail/models/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/mail/models/Message.php |
<?php
namespace humhub\modules\mail\models;
use humhub\components\ActiveRecord;
use humhub\modules\content\widgets\richtext\RichText;
use humhub\modules\mail\Module;
use humhub\modules\user\models\User;
use Yii;
use yii\helpers\Html;
/**
* This class represents a single conversation.
*
* The followings are the available columns in table 'message':
* @property integer $id
* @property string $title
* @property string $created_at
* @property integer $created_by
* @property string $updated_at
* @property integer $updated_by
* @property-read User $originator
* @property-read MessageEntry $lastEntry
*
* The followings are the available model relations:
* @property MessageEntry[] $messageEntries
* @property User[] $users
*
* @package humhub.modules.mail.models
* @since 0.5
*/
class Message extends ActiveRecord
{
/**
* @return string the associated database table name
*/
public static function tableName()
{
return 'message';
}
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return [
[['created_by', 'updated_by'], 'integer'],
[['title'], 'string', 'max' => 255],
[['created_at', 'updated_at'], 'safe'],
];
}
public function getEntryUpdates($from = null)
{
$query = $this->hasMany(MessageEntry::class, ['message_id' => 'id']);
$query->addOrderBy(['created_at' => SORT_ASC]);
if ($from) {
$query->andWhere(['>', 'message_entry.id', $from]);
}
return $query;
}
/**
* @param int|null $from
* @return MessageEntry[]
*/
public function getEntryPage($from = null)
{
$query = $this->getEntries();
$query->addOrderBy(['created_at' => SORT_DESC]);
if ($from) {
$query->andWhere(['<', 'message_entry.id', $from]);
}
$module = Module::getModuleInstance();
$limit = $from ? $module->conversationUpdatePageSize : $module->conversationInitPageSize;
$query->limit($limit);
return array_reverse($query->all());
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEntries()
{
return $this->hasMany(MessageEntry::class, ['message_id' => 'id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getAuthor()
{
return $this->hasOne(User::class, ['id' => 'created_by']);
}
/**
* @return \yii\db\ActiveQuery
* @throws \yii\base\InvalidConfigException
*/
public function getUsers()
{
return $this->hasMany(User::class, ['id' => 'user_id'])
->viaTable('user_message', ['message_id' => 'id']);
}
/**
* @param null $userId
* @return UserMessage|null
*/
public function getUserMessage($userId = null)
{
if (!$userId) {
$userId = Yii::$app->user->id;
}
return UserMessage::findOne([
'user_id' => $userId,
'message_id' => $this->id
]);
}
/**
* @param $user
* @return bool
*/
public function isParticipant($user)
{
foreach ($this->users as $participant) {
if ($participant->guid === $user->guid) {
return true;
}
}
return false;
}
/**
* @return \yii\db\ActiveQuery
*/
public function getOriginator()
{
return $this->hasOne(User::class, ['id' => 'created_by']);
}
/**
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
'id' => 'ID',
'title' => Yii::t('MailModule.base', 'Title'),
'created_at' => Yii::t('MailModule.base', 'Created At'),
'created_by' => Yii::t('MailModule.base', 'Created By'),
'updated_at' => Yii::t('MailModule.base', 'Updated At'),
'updated_by' => Yii::t('MailModule.base', 'Updated By'),
);
}
/**
* Returns the last message of this conversation
* @return MessageEntry
*/
public function getLastEntry()
{
return MessageEntry::find()->where(['message_id' => $this->id])->orderBy('created_at DESC')->limit(1)->one();
}
/**
* @param bool $includeMe
* @return \yii\web\IdentityInterface|null
* @throws \Throwable
* @throws \yii\base\InvalidConfigException
*/
public function getLastActiveParticipant($includeMe = false)
{
$query = MessageEntry::find()->where(['message_id' => $this->id])->orderBy('created_at DESC')->limit(1);
if (!$includeMe) {
$query->andWhere(['<>', 'user_id', Yii::$app->user->id]);
}
$entry = $query->one();
$user = $entry ? $entry->user : $this->getUsers()->andWhere(['<>', 'user.id', Yii::$app->user->id])->one();
return $user ?: Yii::$app->user->getIdentity();
}
/**
* Deletes message entry by given Id
* If it's the last entry, the whole message will be deleted.
*
* @param MessageEntry $entry
* @throws \Throwable
* @throws \yii\db\StaleObjectException
*/
public function deleteEntry($entry)
{
if ($entry->message->id == $this->id) {
if($this->getEntries()->count() > 1) {
$entry->delete();
} else {
$this->delete();
}
}
}
/**
* User leaves a message
*
* If it's the last user, the whole message will be deleted.
*
* @param int $userId
* @throws \Throwable
* @throws \yii\db\StaleObjectException
*/
public function leave($userId)
{
$userMessage = UserMessage::findOne([
'message_id' => $this->id,
'user_id' => $userId
]);
if(!$userMessage) {
return;
}
if (count($this->users) > 1) {
$userMessage->delete();
} else {
$this->delete();
}
}
/**
* Marks a message as seen for given userId
*
* @param int $userId
*/
public function seen($userId)
{
// Update User Message Entry
$userMessage = UserMessage::findOne(array(
'user_id' => $userId,
'message_id' => $this->id
));
if ($userMessage !== null) {
$userMessage->last_viewed = date('Y-m-d G:i:s');
$userMessage->save();
}
}
/**
* Deletes a message, including all dependencies.
*/
public function delete()
{
foreach (MessageEntry::findAll(array('message_id' => $this->id)) as $messageEntry) {
$messageEntry->delete();
}
foreach (UserMessage::findAll(array('message_id' => $this->id)) as $userMessage) {
$userMessage->delete();
}
parent::delete();
}
public function getPreview()
{
if(!$this->lastEntry) {
return 'No message found';
}
return RichText::preview($this->lastEntry->content, 80);
}
/**
* @param User $recipient
* @return bool
*/
public function addRecepient(User $recipient, $originator = false)
{
$userMessage = new UserMessage([
'message_id' => $this->id,
'user_id' => $recipient->id
]);
if ($originator) {
$userMessage->is_originator = 1;
$userMessage->last_viewed = date('Y-m-d G:i:s');
}
return $userMessage->save();
}
/**
* Get users which don't want to receive messages from the current User
*
* @return User[]
*/
public function getBlockers(): array
{
$blockerUsers = [];
foreach ($this->users as $user) {
if (!$user->isCurrentUser() && $user->isBlockedForUser()) {
$blockerUsers[] = $user;
}
}
return $blockerUsers;
}
/**
* Get names of the users which don't want to receive messages from the current User
*
* @param bool Encode names
* @return string[]
*/
public function getBlockerNames(bool $encode = true): array
{
$blockerNames = [];
foreach ($this->getBlockers() as $user) {
$blockerName = $user->getDisplayName();
if ($encode) {
$blockerName = Html::encode($blockerName);
}
$blockerNames[] = $blockerName;
}
return $blockerNames;
}
/**
* Check if current user cannot reply to at least one recipient of this conversation
*
* @return bool
*/
public function isBlocked(): bool
{
foreach ($this->users as $user) {
if (!$user->isCurrentUser() && $user->isBlockedForUser()) {
return true;
}
}
return false;
}
}