public async Task <MessageHandlerResult> HandleAsync(Events.AccountCreateFailed payload, string trackingId)
        {
            ThreadContext.Properties[INTERNAL_ID] = payload.InternalId;

            try
            {
                if (Validator.IsAllowedEvent(payload))
                {
                    _logger.EventReceived(trackingId, payload);

                    if (Validator.IsValidPayload(payload))
                    {
                        var operationFailed = Mapper.Map <AccountCreateFailedTransferObject>(payload);

                        // only StarChef account can be found by loginId, so this filters messages and only StarChef related will make effect
                        var isUserExists = await DbCommands.IsUserExists(operationFailed.LoginId);

                        if (isUserExists)
                        {
                            _logger.DisablingUser(operationFailed);
                            await DbCommands.DisableLogin(operationFailed.LoginId);
                        }
                        await MessagingLogger.ReceivedFailedMessage(operationFailed, trackingId);

                        _logger.Processed(trackingId, payload);
                    }
                    else
                    {
                        var errors = Validator.GetErrors();
                        _logger.InvalidModel(trackingId, payload, errors);
                        await MessagingLogger.ReceivedInvalidModel(trackingId, payload, errors);

                        return(MessageHandlerResult.Fatal);
                    }
                }
            }
            catch (Exception e)
            {
                _logger.Error(e);
                return(MessageHandlerResult.Fatal);
            }
            finally
            {
                ThreadContext.Properties.Remove(INTERNAL_ID);
            }

            return(MessageHandlerResult.Success);
        }
        public async Task <MessageHandlerResult> HandleAsync(Events.AccountStatusChanged payload, string trackingId)
        {
            ThreadContext.Properties[EXTERNAL_ID] = payload.ExternalId;

            try
            {
                if (Validator.IsAllowedEvent(payload))
                {
                    _logger.EventReceived(trackingId, payload);

                    if (Validator.IsValidPayload(payload))
                    {
                        try
                        {
                            var statusChanged = Mapper.Map <AccountStatusChangedTransferObject>(payload);
                            var isUserExists  = await DbCommands.IsUserExists(externalLoginId : statusChanged.ExternalLoginId);

                            if (isUserExists)
                            {
                                if (statusChanged.IsActive)
                                {
                                    _logger.EnablingUser(statusChanged);
                                    await DbCommands.EnableLogin(externalLoginId : statusChanged.ExternalLoginId);
                                }
                                else
                                {
                                    _logger.DisablingUser(statusChanged);
                                    await DbCommands.DisableLogin(externalLoginId : statusChanged.ExternalLoginId);
                                }
                            }
                            await MessagingLogger.MessageProcessedSuccessfully(payload, trackingId);

                            _logger.Processed(trackingId, payload);
                        }
                        catch (ListenerException ex)
                        {
                            _logger.ListenerException(ex, trackingId, payload);
                            return(MessageHandlerResult.Fatal);
                        }
                    }
                    else
                    {
                        var errors = Validator.GetErrors();
                        _logger.InvalidModel(trackingId, payload, errors);
                        await MessagingLogger.ReceivedInvalidModel(trackingId, payload, errors);

                        return(MessageHandlerResult.Fatal);
                    }
                }
            }
            catch (Exception e)
            {
                _logger.Error(e);
                return(MessageHandlerResult.Fatal);
            }
            finally
            {
                ThreadContext.Properties.Remove(EXTERNAL_ID);
            }
            return(MessageHandlerResult.Success);
        }