/** * 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]); }