Example #1
0
 /**
  * Perform message extraction.
  * @param mixed $subscriber_id
  * @param int $limit
  * @param int $mode one of: self::GET_DELETE, self::GET_RESERVE or self::GET_PEEK
  * @return models\DbMessage[]
  * @throws \yii\db\Exception
  */
 protected function receiveInternal($subscriber_id = null, $limit = -1, $mode = self::GET_RESERVE)
 {
     $primaryKey = models\DbMessage::primaryKey();
     $trx = models\DbMessage::getDb()->transaction !== null ? null : models\DbMessage::getDb()->beginTransaction();
     $messages = models\DbMessage::find()->withQueue($this->id)->withSubscriber($subscriber_id)->available($this->timeout)->limit($limit)->indexBy($primaryKey[0])->all();
     if (!empty($messages)) {
         $now = new \DateTime('now', new \DateTimezone('UTC'));
         if ($mode === self::GET_DELETE) {
             $attributes = ['status' => Message::DELETED, 'deleted_on' => $now->format('Y-m-d H:i:s')];
         } elseif ($mode === self::GET_RESERVE) {
             $attributes = ['status' => Message::RESERVED, 'reserved_on' => $now->format('Y-m-d H:i:s')];
         }
         if (isset($attributes)) {
             models\DbMessage::updateAll($attributes, ['in', models\DbMessage::primaryKey(), array_keys($messages)]);
         }
     }
     if ($trx !== null) {
         $trx->commit();
     }
     return models\DbMessage::createMessages($messages);
 }
 /**
  * Fetches details of a single message, allows to release or delete it or sends a new message.
  * @param string $queue_name
  * @param string $subscriber_id
  * @param string $message_id
  * @return string|\yii\web\Response
  * @throws ForbiddenHttpException
  * @throws NotFoundHttpException
  */
 public function actionMessage($queue_name, $subscriber_id = null, $message_id = null)
 {
     if (($subscriber_id = trim($subscriber_id)) === '') {
         $subscriber_id = null;
     }
     /** @var QueueInterface $queue */
     list($queue, $authItems) = $this->loadQueue($queue_name, ['nfy.message.read', 'nfy.message.create']);
     $this->verifySubscriber($queue, $subscriber_id);
     if ($queue instanceof components\DbQueue) {
         $query = models\DbMessage::find()->withQueue($queue->id);
         if ($subscriber_id !== null) {
             $query->withSubscriber($subscriber_id);
         }
         $dbMessage = $query->andWhere(['in', models\DbMessage::tableName() . '.' . models\DbMessage::primaryKey()[0], $message_id])->one();
         if ($dbMessage === null) {
             throw new NotFoundHttpException(Yii::t("app", 'Message with given ID was not found.'));
         }
         $messages = models\DbMessage::createMessages($dbMessage);
         $message = reset($messages);
     } else {
         $dbMessage = null;
         //! @todo should we even bother to locate a single message by id?
         $message = new components\Message();
         $message->setAttributes(['id' => $message_id, 'subscriber_id' => $subscriber_id, 'status' => components\Message::AVAILABLE]);
     }
     if (isset($_POST['delete'])) {
         $queue->delete($message->id, $message->subscriber_id);
         return $this->redirect(['messages', 'queue_name' => $queue_name, 'subscriber_id' => $message->subscriber_id]);
     }
     return $this->render('message', ['queue' => $queue, 'queue_name' => $queue_name, 'dbMessage' => $dbMessage, 'message' => $message, 'authItems' => $authItems]);
 }