/** * @param string $request * @param string|null $resource_type * @param string|null $resource_id * * @return array * @throws BadRequestException * @throws InternalServerErrorException * @throws NotFoundException * @throws null */ public function publish($request, $resource_type = null, $resource_id = null) { /** http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.Sns.SnsClient.html#_publish */ $data = []; if (is_array($request)) { if (null !== ($message = ArrayUtils::get($request, 'Message'))) { $data = array_merge($data, $request); if (is_array($message)) { $data['Message'] = json_encode($message); if (!ArrayUtils::has($request, 'MessageStructure')) { $data['MessageStructure'] = 'json'; } } } else { // This array is the message $data['Message'] = json_encode($request); $data['MessageStructure'] = 'json'; } } else { // This string is the message $data['Message'] = $request; } switch ($resource_type) { case SnsTopic::RESOURCE_NAME: $data['TopicArn'] = $this->addArnPrefix($resource_id); break; case SnsEndpoint::RESOURCE_NAME: $data['TargetArn'] = $this->addArnPrefix($resource_id); break; default: // Must contain resource, either Topic or Endpoint ARN $topic = ArrayUtils::get($data, 'Topic', ArrayUtils::get($data, 'TopicArn')); $endpoint = ArrayUtils::get($data, 'Endpoint', ArrayUtils::get($data, 'EndpointArn', ArrayUtils::get($data, 'TargetArn'))); if (!empty($topic)) { $data['TopicArn'] = $this->addArnPrefix($topic); } elseif (!empty($endpoint)) { $data['TargetArn'] = $this->addArnPrefix($endpoint); } else { throw new BadRequestException("Publish request does not contain resource, either 'Topic' or 'Endpoint'."); } break; } try { if (null !== ($result = $this->conn->publish($data))) { $id = ArrayUtils::get($result->toArray(), 'MessageId', ''); return ['MessageId' => $id]; } } catch (\Exception $ex) { if (null !== ($newEx = static::translateException($ex))) { throw $newEx; } throw new InternalServerErrorException("Failed to push message.\n{$ex->getMessage()}", $ex->getCode()); } return []; }