예제 #1
1
파일: Sns.php 프로젝트: pkdevboxy/df-aws
 /**
  * @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 [];
 }