%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/mail/models/forms/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/mail/models/forms/CreateMessage.php |
<?php
namespace humhub\modules\mail\models\forms;
use humhub\modules\mail\models\Config;
use humhub\modules\mail\models\Message;
use humhub\modules\mail\models\MessageEntry;
use humhub\modules\mail\models\MessageTag;
use humhub\modules\mail\permissions\SendMail;
use humhub\modules\user\models\User;
use Yii;
use yii\base\Model;
use yii\helpers\Html;
/**
* @package humhub.modules.mail.forms
* @since 0.5
*/
class CreateMessage extends Model
{
public $recipient;
public $recipientUser;
public $message;
public $title;
/**
* @var Message new message
*/
public $messageInstance;
/**
* Parsed recipients in array of user objects
*
* @var type
*/
public $recipients = [];
/**
* @var array
*/
public $tags = [];
/**
* Declares the validation rules.
*/
public function rules()
{
return [
[['message', 'recipient', 'title'], 'required'],
[['tags'], 'safe'],
['recipient', 'checkRecipient']
];
}
/**
* Declares customized attribute labels.
* If not declared here, an attribute would have a label that is
* the same as its name with the first letter in upper case.
*/
public function attributeLabels()
{
return [
'recipient' => Yii::t('MailModule.forms_CreateMessageForm', 'Recipient'),
'tags' => Yii::t('MailModule.forms_CreateMessageForm', 'Tags'),
'title' => Yii::t('MailModule.forms_CreateMessageForm', 'Subject'),
'message' => Yii::t('MailModule.forms_CreateMessageForm', 'Message'),
];
}
/**
* Form Validator which checks the recipient field
*
* @param string $attribute
* @param array $params
*/
public function checkRecipient($attribute, $params)
{
if (empty($this->$attribute)) {
return;
}
foreach ($this->recipient as $userGuid) {
$user = User::findOne(['guid' => $userGuid]);
if (!$user) {
continue;
}
if ($user->isCurrentUser()) {
$this->addError($attribute, Yii::t('MailModule.base', 'You cannot send a message to yourself!'));
} else if(!$this->canSendToUser($user)) {
$this->addError($attribute, Yii::t('MailModule.base', 'You are not allowed to start a conversation with {userName}!', [
'userName' => Html::encode($user->getDisplayName())
]));
} else {
$this->recipients[] = $user;
}
}
}
private function canSendToUser(User $user): bool
{
if ($user->isBlockedForUser()) {
return false;
}
if (Yii::$app->user->isAdmin()) {
return true;
}
return $user->getPermissionManager()->can(SendMail::class);
}
public function save()
{
$transaction = Message::getDb()->beginTransaction();
try {
if (!$this->validate()) {
$transaction->rollBack();
return false;
}
if (!$this->saveMessage()) {
$transaction->rollBack();
return false;
}
if (!$this->saveRecipients()) {
$transaction->rollBack();
return false;
}
if (!$this->saveMessageEntry()) {
$transaction->rollBack();
return false;
}
if(!$this->saveOriginatorUserMessage()) {
$transaction->rollBack();
return false;
}
$this->saveTags();
(new Config())->incrementConversationCount(Yii::$app->user->getIdentity());
$transaction->commit();
} catch (\Exception $e) {
$transaction->rollBack();
throw $e;
} catch (\Throwable $e) {
$transaction->rollBack();
throw $e;
}
return true;
}
private function saveTags()
{
return MessageTag::attach(Yii::$app->user->id, $this->messageInstance, $this->tags);
}
private function saveRecipients()
{
// Attach also Recipients
foreach ($this->getRecipients() as $recipient) {
$this->messageInstance->addRecepient($recipient);
}
return true;
}
private function saveMessage()
{
$this->messageInstance = new Message([
'title' => $this->title
]);
if(!(new Config())->canCreateConversation(Yii::$app->user->getIdentity())) {
$this->addError('message', Yii::t('MailModule.base', 'You\'ve exceeded your daily amount of new conversations.'));
return false;
}
return $this->messageInstance->save();
}
/**
* Returns an Array with selected recipients
*/
public function getRecipients()
{
return $this->recipients;
}
private function saveMessageEntry()
{
$entry = MessageEntry::createForMessage($this->messageInstance, Yii::$app->user->getIdentity(), $this->message);
$result = $entry->save();
$entry->notify(true);
return $result;
}
private function saveOriginatorUserMessage()
{
return $this->messageInstance->addRecepient(Yii::$app->user->getIdentity(), true);
}
}