| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 | 
							- <?php
 
- /**
 
-  *
 
-  * PHP Pro Bid $Id$ +UjQ0FR18P5+7L/CT5xJw6MQq0IH5RQawawSM7oSu5g=
 
-  *
 
-  * @link        http://www.phpprobid.com
 
-  * @copyright   Copyright (c) 2017 Online Ventures Software & CodeCube SRL
 
-  * @license     http://www.phpprobid.com/license Commercial License
 
-  *
 
-  * @version     7.9 [rev.7.9.01]
 
-  */
 
- /**
 
-  * messaging table service class
 
-  */
 
- namespace Ppb\Service;
 
- use Ppb\Db\Table\Messaging as MessagingTable,
 
-     Cube\Db\Expr;
 
- class Messaging extends AbstractService
 
- {
 
-     /**
 
-      * messaging topics types
 
-      */
 
-     const PUBLIC_QUESTION = 'public_question';
 
-     const PRIVATE_QUESTION = 'private_question';
 
-     const SALE_TRANSACTION = 'sale_transaction';
 
-     const ADMIN_MESSAGE = 'admin_message';
 
-     const ABUSE_REPORT_USER = 'abuse_report_user';
 
-     const ABUSE_REPORT_LISTING = 'abuse_report_listing';
 
-     const REFUND_REQUEST = 'refund_request';
 
-     const TITLE_RE = 'Re:';
 
-     const TITLE_FWD = 'Fwd:';
 
-     /**
 
-      *
 
-      * allowed topics types and their automatic titles
 
-      *
 
-      * @var array
 
-      */
 
-     protected $_topicTypes = array(
 
-         self::PUBLIC_QUESTION      => array(
 
-             'msg'  => 'Public Question - Listing ID: #%s',
 
-             'args' => array('listing_id'),
 
-         ),
 
-         self::PRIVATE_QUESTION     => array(
 
-             'msg'  => 'Private Message - Listing ID: #%s',
 
-             'args' => array('listing_id'),
 
-         ),
 
-         self::SALE_TRANSACTION     => array(
 
-             'msg'  => 'Sale Transaction - Invoice ID: #%s',
 
-             'args' => array('sale_id'),
 
-         ),
 
-         self::ADMIN_MESSAGE        => array(
 
-             'msg'  => 'Message from Site Admin',
 
-             'args' => array(),
 
-         ),
 
-         self::ABUSE_REPORT_USER    => array(
 
-             'msg'  => 'Abuse Report - User: %s',
 
-             'args' => array('username'),
 
-         ),
 
-         self::ABUSE_REPORT_LISTING => array(
 
-             'msg'  => 'Abuse Report - Listing ID: %s',
 
-             'args' => array('listing_id'),
 
-         ),
 
-         self::REFUND_REQUEST       => array(
 
-             'msg'  => 'Refund Request - Invoice ID: #%s',
 
-             'args' => array('sale_id'),
 
-         ),
 
-     );
 
-     protected $_replyPrefixes = array(
 
-         self::TITLE_RE,
 
-         self::TITLE_FWD,
 
-     );
 
-     /**
 
-      *
 
-      * topic type
 
-      *
 
-      * @var string
 
-      */
 
-     protected $_topicType = null;
 
-     /**
 
-      *
 
-      * class constructor
 
-      */
 
-     public function __construct()
 
-     {
 
-         parent::__construct();
 
-         $this->setTable(
 
-             new MessagingTable());
 
-     }
 
-     /**
 
-      *
 
-      * set topic types
 
-      *
 
-      * @param array $topicTypes
 
-      *
 
-      * @return $this
 
-      */
 
-     public function setTopicTypes($topicTypes)
 
-     {
 
-         $this->_topicTypes = $topicTypes;
 
-         return $this;
 
-     }
 
-     /**
 
-      *
 
-      * get topic types
 
-      *
 
-      * @return array
 
-      */
 
-     public function getTopicTypes()
 
-     {
 
-         return $this->_topicTypes;
 
-     }
 
-     /**
 
-      *
 
-      * set topic type
 
-      *
 
-      * @param string $topicType
 
-      *
 
-      * @return $this
 
-      * @throws \InvalidArgumentException
 
-      */
 
-     public function setTopicType($topicType)
 
-     {
 
-         if (!array_key_exists($topicType, $this->_topicTypes)) {
 
-             throw new \InvalidArgumentException(
 
-                 sprintf("The messaging topic type '%s' is not allowed.", $topicType));
 
-         }
 
-         $this->_topicType = $topicType;
 
-         return $this;
 
-     }
 
-     /**
 
-      *
 
-      * get topic type
 
-      *
 
-      * @return string
 
-      */
 
-     public function getTopicType()
 
-     {
 
-         return $this->_topicType;
 
-     }
 
-     /**
 
-      *
 
-      * create or update a row in the messaging table
 
-      * if topic_id is null, update data and topic_id = id
 
-      *
 
-      * @param array $post
 
-      *
 
-      * @return int  the id of the created/edited message
 
-      */
 
-     public function save($post)
 
-     {
 
-         $row = null;
 
-         $data = $this->_prepareSaveData($post);
 
-         if (array_key_exists('id', $data)) {
 
-             unset($data['id']);
 
-         }
 
-         $data['created_at'] = new Expr('now()');
 
-         $id = $this->_table->insert($data);
 
-         if (!isset($data['topic_id'])) {
 
-             $row = $this->findBy('id', $id);
 
-             $row->save(array(
 
-                 'topic_id' => $id,
 
-             ));
 
-         }
 
-         if (!empty($post['sale_id'])) {
 
-             $salesService = new Sales();
 
-             $sale = $salesService->findBy('id', (int)$post['sale_id']);
 
-             if (!$sale['messaging_topic_id']) {
 
-                 $sale->save(array(
 
-                     'messaging_topic_id' => $id,
 
-                 ));
 
-             }
 
-         }
 
-         return $id;
 
-     }
 
-     public function archive($id, $userId, $filter)
 
-     {
 
-         $updateColumn = ($filter == 'sent') ? 'sender_deleted' : 'receiver_deleted';
 
-         $userColumn = ($filter == 'sent') ? 'sender_id' : 'receiver_id';
 
-         $adapter = $this->_table->getAdapter();
 
-         $where = array(
 
-             $adapter->quoteInto('id IN (?)', $id),
 
-             $adapter->quoteInto("{$userColumn} = ?", $userId)
 
-         );
 
-         $this->_table->update(array($updateColumn => 1), $where);
 
-     }
 
-     /**
 
-      *
 
-      * messages can only be deleted by the administrator, and only from the admin area
 
-      *
 
-      * @param int|array $id sale id
 
-      *
 
-      * @return int the number of affected rows
 
-      */
 
-     public function delete($id)
 
-     {
 
-         return $this->_table->delete(
 
-             $this->_table->getAdapter()->quoteInto('id IN (?)', $id));
 
-     }
 
-     /**
 
-      *
 
-      * prepare save data
 
-      *
 
-      * @param array $data
 
-      *
 
-      * @return array
 
-      */
 
-     protected function _prepareSaveData($data = array())
 
-     {
 
-         if (empty($data['topic_id'])) {
 
-             if (!empty($data['sale_id'])) {
 
-                 $salesService = new Sales();
 
-                 $sale = $salesService->findBy('id', (int)$data['sale_id']);
 
-                 $data['receiver_id'] = ($data['sender_id'] == $sale['buyer_id']) ? $sale['seller_id'] : $sale['buyer_id'];
 
-             }
 
-             $data['topic_title'] = $this->generateTopicTitle($data);
 
-         }
 
-         $data['listing_id'] = (isset($data['public_question'])) ?
 
-             (($data['public_question']) ? $data['listing_id'] : null) : null;
 
-         $data = parent::_prepareSaveData($data);
 
-         return array_filter($data, function ($value) {
 
-             return trim($value) != null;
 
-         });
 
-     }
 
-     /**
 
-      *
 
-      * generate the topic title of a messaging topic
 
-      * TODO: review this code for private questions when public questions are disabled
 
-      *
 
-      * @param array $data
 
-      *
 
-      * @return string|null
 
-      */
 
-     public function generateTopicTitle(array $data)
 
-     {
 
-         if (!empty($data['topic_type'])) {
 
-             $this->setTopicType($data['topic_type']);
 
-         }
 
-         else {
 
-             $topicType = $this->getTopicType();
 
-             if (!isset($topicType)) {
 
-                 $publicQuestion = (isset($data['public_question'])) ? $data['public_question'] : null;
 
-                 $this->setTopicType(
 
-                     $publicQuestion ? self::PUBLIC_QUESTION : self::PRIVATE_QUESTION);
 
-             }
 
-         }
 
-         if ($topicType = $this->getTopicType() != null) {
 
-             $topicType = $this->_topicTypes[$this->getTopicType()];
 
-             $args = array();
 
-             foreach ($topicType['args'] as $arg) {
 
-                 $args[] = isset($data[$arg]) ? $data[$arg] : null;
 
-             }
 
-             $translate = $this->getTranslate();
 
-             return vsprintf($translate->_($topicType['msg']), $args);
 
-         }
 
-         return null;
 
-     }
 
-     /**
 
-      *
 
-      * generate topic reply title
 
-      *
 
-      * @param $topicId
 
-      *
 
-      * @return null|string
 
-      */
 
-     public function generateMessageReplyTitle($topicId)
 
-     {
 
-         $topic = $this->findBy('id', $topicId);
 
-         if ($topic) {
 
-             $translate = $this->getTranslate();
 
-             $messageTitle = $topic['title'];
 
-             foreach ($this->_replyPrefixes as $prefix) {
 
-                 $messageTitle = str_ireplace($translate->_($prefix), '', $messageTitle);
 
-             }
 
-             return $translate->_(self::TITLE_RE) . ' ' . trim($messageTitle);
 
-         }
 
-         return null;
 
-     }
 
- }
 
 
  |