예제 #1
0
        public async Task <PublishToTagResult> PublishToTagAsync()
        {
            if (!tagOperator.IsTaggingAvailable())
            {
                return(new PublishToTagFailedResult(new TaggingNotAvailableException()));
            }

            string    tag      = model.Tag;
            DynamoTag tagEntry = await tagOperator.tagTableOperator.GetTagAsync(tag);

            if (tagEntry == null)
            {
                return(new PublishToTagFailedResult(new TagNotFoundException(tag)));
            }
            switch (tagEntry.TaggingTypeEnum)
            {
            case PNTagType.Iterative:
                List <DynamoIterativeTag> tags = await tagOperator.iterativeTagTableOperator.GetAllSubscribersForTagAsync(tagEntry.Tag);

                IterativeTagResponseTuple resultTuples = await PublishToIterativeTagAsync(tags);
                await RemoveUnsuccessfulEndpoints(resultTuples);

                var returnTuples = resultTuples.Select(t => new Tuple <PublishToSNSResult, PushNotificationSubscriber>(t.Item1, PushNotificationSubscriber.From(t.Item2.Subscriber)));
                return(new PublishToIterativeTagResult(tag, returnTuples));

            case PNTagType.SNSTopic:
                PublishToSNSResult result = await PublishToSnsTopicTag(tagEntry.SnsTopicArn);

                return(new PublishToSNSTopicTagResult(tag, result));

            default:
                throw new TagNotFoundException(tag);
            }
        }
예제 #2
0
        private async Task <IterativeTagResponseTuple> PublishToIterativeTagAsync(List <DynamoIterativeTag> entries)
        {
            // Parallel tasks are not implemented because of AWS-SDK SNS bug in parellel execution cause high memory usage
            // List<Task> tasks = new List<Task>();
            IterativeTagResponseTuple resultTuples = new IterativeTagResponseTuple();

            foreach (var tagEntry in entries)
            {
                if (IsTargetPlatformRestrictsSubscriber(model.TargetPlatform, tagEntry.Platform))
                {
                    var failed = new PublishToSNSFailedResult(new PlatformUnmatchedException(model.TargetPlatform, tagEntry.Platform));
                    resultTuples.Add(new Tuple <PublishToSNSResult, DynamoIterativeTag>(failed, tagEntry));
                    continue;
                }

                string message = SerializeMessageFromProperties(tagEntry.Platform);
                if (string.IsNullOrEmpty(message))
                {
                    var failed = new PublishToSNSFailedResult(new SNSNotificationMessageNullException());
                    resultTuples.Add(new Tuple <PublishToSNSResult, DynamoIterativeTag>(failed, tagEntry));
                    continue;
                }

                var result = await PublishToEndpointAsync(tagEntry.EndpointArn, message);

                result.UserId = tagEntry.Subscriber.UserId;
                resultTuples.Add(new Tuple <PublishToSNSResult, DynamoIterativeTag>(result, tagEntry));
            }
            return(resultTuples);
        }
예제 #3
0
        private async Task RemoveUnsuccessfulEndpoints(IterativeTagResponseTuple resultTuples)
        {
            // Parallel tasks are not implemented because of AWS-SDK SNS bug in parellel execution cause high memory usage
            // List<Task> tasks = new List<Task>();

            foreach (var responseTagTuple in resultTuples)
            {
                PublishToSNSResult result = responseTagTuple.Item1;
                DynamoIterativeTag tag    = responseTagTuple.Item2;

                if (result.ErrorAlias == ErrorReason.SNSEndpointDisabled ||
                    result.ErrorAlias == ErrorReason.SNSEndpointNotFound)
                {
                    await unRegisterService.UnRegisterSubscriberAsync(tag.Subscriber.UserId, tag.Subscriber.Token);
                }
            }
        }