Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Api/Controller/ConversationMessages.php
<?php

namespace XF\Api\Controller;

use
XF\Mvc\Entity\Entity;
use
XF\Mvc\ParameterBag;

/**
 * @api-group Conversations
 */
class ConversationMessages extends AbstractController
{
    protected function
preDispatchController($action, ParameterBag $params)
    {
       
$this->assertApiScopeByRequestMethod('conversation');
    }

   
/**
     * @api-desc Replies to a conversation
     *
     * @api-in <req> int $conversation_id
     * @api-in <req> str $message
     * @api-in str $attachment_key API attachment key to upload files. Attachment key content type must be conversation_message with context[conversation_id] set to this conversation ID.
     *
     * @api-out true $success
     * @api-out ConversationMessage $message The newly inserted message
     */
   
public function actionPost(ParameterBag $params)
    {
       
$this->assertRequiredApiInput(['conversation_id', 'message']);

       
$conversationId = $this->filter('conversation_id', 'uint');

       
/** @var \XF\Entity\ConversationUser $userConv */
       
$userConv = $this->assertViewableUserConversation($conversationId);
       
$conversation = $userConv->Master;

        if (\
XF::isApiCheckingPermissions() && !$conversation->canReply())
        {
            return
$this->noPermission();
        }

       
$replier = $this->setupConversationReply($conversation);
       
$replier->setAutoSpamCheck(false);

        if (\
XF::isApiCheckingPermissions())
        {
           
$replier->checkForSpam();
        }

        if (!
$replier->validate($errors))
        {
            return
$this->error($errors);
        }

       
/** @var \XF\Entity\ConversationMessage $message */
       
$message = $replier->save();
       
$this->finalizeConversationReply($replier);

        return
$this->apiSuccess([
           
'message' => $message->toApiResult(Entity::VERBOSITY_VERBOSE)
        ]);
    }

   
/**
     * @param \XF\Entity\ConversationMaster $conversation
     *
     * @return \XF\Service\Conversation\Replier
     */
   
protected function setupConversationReply(\XF\Entity\ConversationMaster $conversation)
    {
       
/** @var \XF\Service\Conversation\Replier $replier */
       
$replier = $this->service('XF:Conversation\Replier', $conversation, \XF::visitor());

       
$message = $this->filter('message', 'str');
       
$replier->setMessageContent($message);

        if (\
XF::isApiBypassingPermissions() || $conversation->canUploadAndManageAttachments())
        {
           
$attachmentKey = $this->filter('attachment_key', 'str');
           
$hash = $this->getAttachmentTempHashFromKey(
               
$attachmentKey, 'conversation_message', ['conversation_id' => $conversation->conversation_id]
            );
           
$replier->setAttachmentHash($hash);
        }

        return
$replier;
    }

    protected function
finalizeConversationReply(\XF\Service\Conversation\Replier $replier)
    {
    }

   
/**
     * @param int $id
     * @param string|array $with
     *
     * @return \XF\Entity\ConversationUser
     *
     * @throws \XF\Mvc\Reply\Exception
     */
   
protected function assertViewableUserConversation($id, $with = 'api')
    {
       
/** @var \XF\Api\ControllerPlugin\Conversation $conversationPlugin */
       
$conversationPlugin = $this->plugin('XF:Api:Conversation');
        return
$conversationPlugin->assertViewableUserConversation($id, $with);
    }
}