private SecurityListResponse BuildSecurityListResponse(ISession session, DateTime requestDate, string messageId)
        {
            IList <Entities.Security> securityList = securityService.GetSecurityListByRequestDate(session, requestDate);

            SecurityListResponse response = securityListResponseBuilder.BuildSecurityListResponse(securityList, requestDate);

            response.MessageId = messageId;

            return(response);
        }
        public SecurityListResponse BuildSecurityListResponse(IList <Entities.Security> securityList, DateTime requestDate)
        {
            SecurityListResponse response = new SecurityListResponse();

            response.RequestDate  = requestDate;
            response.SecurityList = new List <Security>();

            foreach (Entities.Security security in securityList)
            {
                Security securityRequest = new Security()
                {
                    Symbol   = security.Symbol,
                    Name     = security.Name,
                    Currency = security.Currency
                };

                response.SecurityList.Add(securityRequest);
            }

            return(response);
        }
        private void ProcessResponse(IModel channel, BasicDeliverEventArgs e)
        {
            try
            {
                logger.Log(LogLevel.Info, $"Processing SecurityListRequest");

                var requestFromQueue = e.GetMessage <SecurityListRequest>();

                logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]");

                using (var session = dbSessionFactory.OpenSession())
                {
                    Request requestFromDb = requestService.GetOrCreateRequest(session, requestFromQueue, RequestType.SecurityListRequest, DateTime.Today);

                    bool hasSameRequestDate  = requestFromDb != null && requestFromDb.RequestDate == requestFromQueue.RequestDate.Date;
                    bool isRequestStatusDone = requestFromDb != null && requestFromDb.RequestStatus == RequestStatus.Done;
                    if (hasSameRequestDate && isRequestStatusDone)
                    {
                        logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: already processed with success, see Request {requestFromDb.RequestId}");

                        logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: retrieving Securities from db");

                        SecurityListResponse securityListResponse = BuildSecurityListResponse(session, requestFromQueue.RequestDate, requestFromQueue.MessageId);

                        logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: {securityListResponse.SecurityList?.Count} Securities retrieved");

                        logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: sending SecurityListResponse with {securityListResponse.SecurityList?.Count} Securities");

                        channel.PublishMessageOnQueue(securityListResponse, Queues.SecurityListResponseQueue);

                        logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: SecurityListResponse sent");

                        channel.SendAck(e.DeliveryTag);

                        return;
                    }

                    if (!hasSameRequestDate)
                    {
                        logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: Request from db is related to {requestFromDb.RequestDate}, no Securities available for {requestFromQueue.RequestDate}");

                        SecurityListResponse securityListResponse = new SecurityListResponse()
                        {
                            ErrorMessage = $"Securities at {requestFromQueue.RequestDate} not available", MessageId = requestFromQueue.MessageId
                        };

                        channel.PublishMessageOnQueue(securityListResponse, Queues.SecurityListResponseQueue);

                        channel.SendAck(e.DeliveryTag);

                        return;
                    }

                    logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: Retrieving Securities from IEXCloud");

                    IEnumerable <Symbol> symbolList = securityDataProviderRequestManager.GetSymbolList();

                    IList <Entities.Security> securityList = symbolToSecurityMapper.MapSymbolToSecurity(symbolList);

                    logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: {securityList.Count} Securities from IEXCloud retrieved");

                    logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: Saving {securityList.Count} Securities");

                    securityService.AddSecurityList(session, securityList);

                    logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: {securityList.Count} Securities saved");

                    logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: Creating SecurityListResponse");

                    SecurityListResponse response = BuildSecurityListResponse(session, requestFromQueue.RequestDate, requestFromQueue.MessageId);

                    logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: SecurityListResponse created with {response.SecurityList?.Count} Securities");

                    channel.PublishMessageOnQueue(response, Queues.SecurityListResponseQueue);

                    logger.Log(LogLevel.Info, $"[SecurityListRequest: RequestDate {requestFromQueue.RequestDate}, MessageId {requestFromQueue.MessageId}]: SecurityListResponse published on queue {Queues.SecurityListResponseQueue}");

                    requestService.SetRequestStatus(session, requestFromDb, RequestStatus.Done);

                    channel.SendAck(e.DeliveryTag);
                }
            }
            catch (JsonException jsonException)
            {
                logger.Log(LogLevel.Error, jsonException, jsonException.Message);
                channel.SendAck(e.DeliveryTag);
            }
            catch (Exception exception)
            {
                logger.Log(LogLevel.Error, exception, exception.Message);
                channel.SendNack(e.DeliveryTag);
            }
        }