public async Task <MessageHandlerResult> HandleAsync(Events.AccountUpdated payload, string trackingId) { ThreadContext.Properties[EXTERNAL_ID] = payload.ExternalId; try { if (Validator.IsAllowedEvent(payload)) { _logger.EventReceived(trackingId, payload); if (Validator.IsValidPayload(payload)) { var user = Mapper.Map <AccountUpdatedTransferObject>(payload); try { var isUserExists = await DbCommands.IsUserExists(externalLoginId : user.ExternalLoginId); if (isUserExists) { _logger.UpdatingUser(user); await DbCommands.UpdateUser(user.ExternalLoginId, user.Username, user.FirstName, user.LastName, user.EmailAddress, user.PermissionSets); } await MessagingLogger.MessageProcessedSuccessfully(payload, trackingId); _logger.Processed(trackingId, payload); } catch (ListenerException ex) { _logger.ListenerException(ex, trackingId, user); 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); }