// TODO Move to helper class
        private async Task SendMessage(string queueName, object value)
        {
            var connectionString = _connectionStringsConfig.TestMusicAppServiceBus;

            var messageJson = JsonConvert.SerializeObject(value);
            var queueClient = new QueueClient(connectionString, queueName);
            var message     = ServiceBusMessageConverter.StringToMessage(messageJson);

            await queueClient.SendAsync(message);

            await queueClient.CloseAsync();
        }
        private async Task ProcessMessagesAsync(Message message, CancellationToken cancellationToken)
        {
            // Create scope manually because ProcessMessagesAsync executes outside
            // of the ASP.NET lifecycle
            using (var scope = _scopeFactory.CreateScope())
            {
                try
                {
                    var mediator = scope.ServiceProvider.GetService <IMediator>();

                    var messageJson         = ServiceBusMessageConverter.MessageToString(message);
                    var deserializedMessage = JsonConvert.DeserializeObject <AudioUploadingResultMessage>(messageJson);

                    var trackUploadFinishedEvent = new TrackUploadFinishedEvent
                    {
                        FileName   = deserializedMessage.FileName,
                        IsSuccess  = deserializedMessage.IsSuccess,
                        UserId     = deserializedMessage.AdditionalData.UserId,
                        PlaylistId = deserializedMessage.AdditionalData.PlaylistId,
                        TrackName  = deserializedMessage.AdditionalData.TrackName
                    };

                    await mediator.Publish(trackUploadFinishedEvent, cancellationToken);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Upload track");

                    var exceptionJson = JsonConvert.SerializeObject(ex);

                    await _queueClient.DeadLetterAsync(
                        message.SystemProperties.LockToken,
                        DeadLetterExceptionReason,
                        exceptionJson);

                    return;
                }

                await _queueClient.CompleteAsync(message.SystemProperties.LockToken);
            }
        }