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); }