protected virtual async Task <GetItemResult <T> > GetMessageProperty <T>(Ideas.Shared.ServiceBus.Message message, string propertyName, bool allowNull = false)
        {
            if (message == null)
            {
                throw new ArgumentNullException("msg");
            }

            var result = new GetItemResult <T>();

            if (!message.MessageProperties.ContainsKey(propertyName))
            {
                string errorMessage = $"{ propertyName } not found in message";
                result.SetMessageDeadLettered(errorMessage);
                await _messageReceiver.DeadLetterAsync(message.LockToken, errorMessage);
            }
            else
            {
                object propertyObj = message.MessageProperties[propertyName];
                if (propertyObj == null)
                {
                    if (!allowNull)
                    {
                        string errorMessage = $"{ propertyName } was null";
                        _logger.Error("{PropertyName} was empty in Service Bus message", propertyName);
                        result.SetMessageDeadLettered(errorMessage);
                        await _messageReceiver.DeadLetterAsync(message.LockToken, errorMessage);
                    }
                    // else return null (or default) and don't dead letter
                }
                else
                {
                    try
                    {
                        result.Item = (T)propertyObj;
                    }
                    catch (Exception)
                    {
                        string errorMessage = $"{ propertyName } was not of type { typeof(T).FullName }";
                        _logger.Error("{PropertyName} had value {Value}, which was not of the expected type '{Type}", propertyName, propertyObj, typeof(T).FullName);
                        result.SetMessageDeadLettered(errorMessage);
                        await _messageReceiver.DeadLetterAsync(message.LockToken, errorMessage);
                    }
                }
            }

            return(result);
        }
Esempio n. 2
0
        protected virtual async Task <GetItemResult <ClaimsPrincipal> > GetMessageOwner(Message message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("msg");
            }

            var ownerClaimsResult = await GetMessageString(message, propertyName : "OwnerClaims");

            var result = new GetItemResult <ClaimsPrincipal>();

            if (ownerClaimsResult.WasMessageDeadLettered)
            {
                result.SetMessageDeadLettered(ownerClaimsResult.Errors.FirstOrDefault());
            }
            else
            {
                try
                {
                    result.Item = CreatePrincipal(ownerClaimsResult.Item);
                    _logger.Information("Message owner is {UserName} with email {Email}", result?.Item?.Identity?.Name, result?.Item?.GetEmail());
                }
                catch (Exception err)
                {
                    string errorMessage = $"Unable to get Owner from token { ownerClaimsResult.Item }: { err.Message }";
                    _logger.Error(err, "Unable to get Owner from token {Token}: {ErrorMessage}", ownerClaimsResult.Item, err.Message);
                    result.SetMessageDeadLettered(errorMessage);
                    await _messageReceiver.DeadLetterAsync(message.LockToken, errorMessage);
                }
            }

            // last fail safe
            if (!result.WasMessageDeadLettered && result.Item == null)
            {
                string errorMessage = $"Unable to get Owner, reason unknown";
                _logger.Error(errorMessage);
                result.SetMessageDeadLettered(errorMessage);
                await _messageReceiver.DeadLetterAsync(message.LockToken, errorMessage);
            }

            return(result);
        }
Esempio n. 3
0
        protected virtual async Task <GetItemResult <Initiative> > GetMessageInitiative(Message message, ClaimsPrincipal owner = null)
        {
            if (message == null)
            {
                throw new ArgumentNullException("msg");
            }

            var initiativeIdResult = await GetMessageProperty <int>(message, propertyName : "InitiativeId");

            var result = new GetItemResult <Initiative>();

            if (initiativeIdResult.WasMessageDeadLettered)
            {
                result.SetMessageDeadLettered(initiativeIdResult.Errors.FirstOrDefault());
            }
            else
            {
                try
                {
                    _logger.Information("Message is for initiative {InitiativeId}, retrieving initiative...", initiativeIdResult.Item);

                    // if the remote repositoty factory is populated, we'll use that,
                    // otherwise we'll just use the default
                    var ideaRepository = GetInitiativeRepository(owner);

                    result.Item = await ideaRepository.GetInitiativeAsync(initiativeIdResult.Item);

                    _logger.Information("Retrieved initiative {InitiativeId}, has title '{Title}'", initiativeIdResult.Item, result?.Item?.Title);
                }
                catch (Exception err)
                {
                    string errorMessage = $"Unable to get Initiative { initiativeIdResult.Item }: { err.Message }";
                    _logger.Error(err, "Unable to get Initiative {InitiativeId}: {ErrorMessage}", initiativeIdResult.Item, err.Message);
                    result.SetMessageDeadLettered(errorMessage);
                    await _messageReceiver.DeadLetterAsync(message.LockToken, errorMessage);
                }
            }

            return(result);
        }