private void BetSettlement(bet_settlement e, dbEntities db, string routeKey)
        {
            using (var dbContextTransaction = db.Database.BeginTransaction())
            {
                var sectionName = string.Empty;
                var spParams    = string.Empty;
                try
                {
                    var marketIdList  = string.Empty;
                    var specifierList = string.Empty;
                    var outcomeIdList = string.Empty;
                    var resultList    = string.Empty;
                    var certaintyList = string.Empty;
                    var productList   = string.Empty;

                    foreach (var market in e.outcomes)
                    {
                        var marketId  = market.id;
                        var specifier = market.specifiers?.Split('=').LastOrDefault()?.Trim();

                        foreach (var outcome in market.Items)
                        {
                            marketIdList  += marketId + ",";
                            specifierList += specifier + ",";
                            outcomeIdList += outcome.id.Split(':').LastOrDefault() + ",";
                            resultList    += outcome.result + ",";
                            certaintyList += e.certainty + ",";
                            productList   += e.product + ",";

                            marketId = 0;
                            if (!string.IsNullOrEmpty(specifier))
                            {
                                specifier = "*";
                            }
                        }
                    }

                    sectionName = "bet_settlement";
                    spParams    = "EXECUTE PROCEDURE BET_EVENTRESULTS_I_MULTI(";
                    spParams   += SourceId + ",";
                    spParams   += e.event_id.Split(':').Last() + ",";
                    spParams   += "'" + marketIdList.Substring(0).Trim() + "',";
                    spParams   += "'" + specifierList.Substring(0).Trim() + "',";
                    spParams   += "'" + outcomeIdList.Substring(0).Trim() + "',";
                    spParams   += "'" + resultList.Substring(0).Trim() + "',";
                    spParams   += "'" + certaintyList.Substring(0).Trim() + "',";
                    spParams   += "'" + productList.Substring(0).Trim() + "',";
                    spParams   += e.GeneratedAt + ")";
                    db.Database.ExecuteSqlCommand(spParams.Trim());

                    dbContextTransaction.Commit();
                    SerilogHelper.Information($"{routeKey} {UtcHelper.GetDifferenceFromTimestamp(e.timestamp) + "ms"}");
                }
                catch (Exception ex)
                {
                    dbContextTransaction.Rollback();
                    SerilogHelper.Exception($"Unknown exception in {routeKey} SectionName:{sectionName} SQL:{spParams.Trim()}", ex);
                }
            }
        }
Exemple #2
0
        public IBetSettlement <T> MapBetSettlement <T>(bet_settlement message, IEnumerable <CultureInfo> cultures, byte[] rawMessage) where T : ISportEvent
        {
            Contract.Requires(message != null);
            Contract.Ensures(Contract.Result <IBetSettlement <T> >() != null);

            return(Contract.Result <IBetSettlement <T> >());
        }
Exemple #3
0
        /// <summary>
        /// Validates the provided <see cref="bet_settlement" /> message
        /// </summary>
        /// <param name="message">The <see cref="bet_settlement" /> message to validate</param>
        /// <returns>The <see cref="ValidationResult" /> specifying the result of validation</returns>
        protected ValidationResult ValidateBetSettlement(bet_settlement message)
        {
            Contract.Requires(message != null);

            ValidateMessageProducer(message);

            if (!ValidateMessage(message))
            {
                return(ValidationResult.FAILURE);
            }

            if (message.outcomes == null || !message.outcomes.Any())
            {
                return(ValidationResult.SUCCESS);
            }

            var result = ValidationResult.SUCCESS;

            for (var marketIndex = 0; marketIndex < message.outcomes.Length; marketIndex++)
            {
                var market = message.outcomes[marketIndex];
                if (!ValidateSpecifiers(message, market, marketIndex))
                {
                    result = ValidationResult.PROBLEMS_DETECTED;
                }

                if (!CheckSpecifiersAsync(message.ProducerId, market.id, market.Specifiers).Result)
                {
                    result = ValidationResult.PROBLEMS_DETECTED;
                }
            }
            return(result);
        }
        /// <summary>
        /// Validates the provided <see cref="bet_settlement" /> message
        /// </summary>
        /// <param name="message">The <see cref="bet_settlement" /> message to validate</param>
        /// <returns>The <see cref="ValidationResult" /> specifying the result of validation</returns>
        protected ValidationResult ValidateBetSettlement(bet_settlement message)
        {
            Guard.Argument(message, nameof(message)).NotNull();

            ValidateMessageProducer(message);

            if (!ValidateMessage(message))
            {
                return(ValidationResult.FAILURE);
            }

            if (message.outcomes == null || !message.outcomes.Any())
            {
                return(ValidationResult.SUCCESS);
            }

            var result = ValidationResult.SUCCESS;

            foreach (var market in message.outcomes)
            {
                if (!ValidateSpecifiers(message, market, market.id))
                {
                    result = ValidationResult.PROBLEMS_DETECTED;
                }

                if (!CheckSpecifiersAsync(message.ProducerId, market.id, market.Specifiers).Result)
                {
                    result = ValidationResult.PROBLEMS_DETECTED;
                }
            }
            return(result);
        }
Exemple #5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="OddsChangeEventArgs{T}"/> class
        /// </summary>
        /// <param name="messageMapper">A <see cref="IFeedMessageMapper"/> used to map feed message to the one dispatched to the user</param>
        /// <param name="feedMessage">A <see cref="bet_settlement"/> message received from the feed</param>
        /// <param name="cultures">A <see cref="IEnumerable{CultureInfo}"/> specifying the default languages to which the received message is translated</param>
        /// <param name="rawMessage">A raw message received from the feed</param>
        internal BetSettlementEventArgs(IFeedMessageMapper messageMapper, bet_settlement feedMessage, IEnumerable <CultureInfo> cultures, byte[] rawMessage)
        {
            Guard.Argument(messageMapper, nameof(messageMapper)).NotNull();
            Guard.Argument(feedMessage, nameof(feedMessage)).NotNull();
            Guard.Argument(cultures, nameof(cultures)).NotNull().NotEmpty();

            _messageMapper   = messageMapper;
            _feedMessage     = feedMessage;
            _defaultCultures = cultures as IReadOnlyCollection <CultureInfo>;
            _rawMessage      = rawMessage;
        }
 private void LoadEntityFromFile(bool load = false)
 {
     if (_entity == null || load)
     {
         var stream = FileHelper.OpenFile(TestData.FeedXmlPath, "bet_settlement.xml");
         _record = Deserializer.Deserialize <bet_settlement>(stream);
         TestData.FillMessageTimestamp(_record);
         _record.SportId = URN.Parse("sr:sport:1000");
         _entity         = _mapper.MapBetSettlement <ICompetition>(_record, new[] { TestData.Culture }, null);
     }
 }
        /// <summary>
        /// Initializes a new instance of the <see cref="OddsChangeEventArgs{T}"/> class
        /// </summary>
        /// <param name="messageMapper">A <see cref="IFeedMessageMapper"/> used to map feed message to the one dispatched to the user</param>
        /// <param name="feedMessage">A <see cref="bet_settlement"/> message received from the feed</param>
        /// <param name="cultures">A <see cref="IEnumerable{CultureInfo}"/> specifying the default languages to which the received message is translated</param>
        /// <param name="rawMessage">A raw message received from the feed</param>
        internal BetSettlementEventArgs(IFeedMessageMapper messageMapper, bet_settlement feedMessage, IEnumerable <CultureInfo> cultures, byte[] rawMessage)
        {
            Contract.Requires(messageMapper != null);
            Contract.Requires(feedMessage != null);
            Contract.Requires(cultures != null && cultures.Any());

            _messageMapper   = messageMapper;
            _feedMessage     = feedMessage;
            _defaultCultures = cultures as IReadOnlyCollection <CultureInfo>;
            _rawMessage      = rawMessage;
        }
        /// <summary>
        /// Maps (converts) the provided <see cref="bet_settlement"/> instance to the <see cref="IBetSettlement{T}"/> instance
        /// </summary>
        /// <param name="message">A <see cref="bet_settlement"/> instance to be mapped (converted)</param>
        /// <param name="cultures">A <see cref="IEnumerable{CultureInfo}" /> specifying the languages to which the mapped message will be translated</param>
        /// <param name="rawMessage">The raw message</param>
        /// <returns>A <see cref="IBetSettlement{T}"/> instance constructed from information in the provided <see cref="bet_settlement"/></returns>
        public IBetSettlement <T> MapBetSettlement <T>(bet_settlement message, IEnumerable <CultureInfo> cultures, byte[] rawMessage) where T : ISportEvent
        {
            var culturesList = cultures as List <CultureInfo> ?? cultures.ToList();

            return(new BetSettlement <T>(new MessageTimestamp(message.GeneratedAt, message.SentAt, message.ReceivedAt, SdkInfo.ToEpochTime(DateTime.Now)),
                                         _producerManager.Get(message.product),
                                         GetEventForMessage <T>(URN.Parse(message.event_id), message.SportId, culturesList),
                                         message.request_idSpecified ? (long?)message.request_id : null,
                                         message.outcomes.Select(m => GetMarketWithResults(GetEventForNameProvider <T>(URN.Parse(message.event_id), message.SportId, culturesList),
                                                                                           m, message.ProducerId, message.SportId, culturesList)),
                                         message.certainty,
                                         rawMessage));
        }
        private void TestEntityValues(IBetSettlement <ICompetition> entity, bet_settlement record, AssertHelper assertHelper)
        {
            assertHelper.AreEqual(() => entity.Event.Id.ToString(), record.event_id);
            var rProduct = TestProducerManager.Create().Get(record.product);

            assertHelper.AreEqual(() => entity.Producer, rProduct);
            assertHelper.AreEqual(() => entity.RequestId, record.request_idSpecified
                                                                ? (long?)record.request_id
                                                                : null);
            assertHelper.AreEqual(() => entity.Timestamps.Created, record.timestamp);

            TestMarketOutcomes(entity.Markets.ToList(), record.outcomes, assertHelper);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="OddsChangeEventArgs{T}"/> class
        /// </summary>
        /// <param name="messageMapper">A <see cref="IFeedMessageMapper"/> used to map feed message to the one dispatched to the user</param>
        /// <param name="feedMessage">A <see cref="bet_settlement"/> message received from the feed</param>
        /// <param name="cultures">A <see cref="IEnumerable{CultureInfo}"/> specifying the default languages to which the received message is translated</param>
        /// <param name="rawMessage">A raw message received from the feed</param>
        internal BetSettlementEventArgs(IFeedMessageMapper messageMapper, bet_settlement feedMessage, IEnumerable <CultureInfo> cultures, byte[] rawMessage)
        {
            Guard.Argument(messageMapper, nameof(messageMapper)).NotNull();
            Guard.Argument(feedMessage, nameof(feedMessage)).NotNull();
            if (!cultures.Any())
            {
                throw new ArgumentOutOfRangeException(nameof(cultures));
            }

            _messageMapper   = messageMapper;
            _feedMessage     = feedMessage;
            _defaultCultures = cultures as IReadOnlyCollection <CultureInfo>;
            _rawMessage      = rawMessage;

            _betSettlement = GetBetSettlement();
        }
        /// <summary>
        /// Dispatches the <see cref="bet_settlement"/> message
        /// </summary>
        /// <param name="message">The <see cref="bet_settlement"/> message to dispatch</param>
        /// <param name="rawMessage">A raw message received from the feed</param>
        private void DispatchBetSettlement(bet_settlement message, byte[] rawMessage)
        {
            var eventArgs = new BetSettlementEventArgs <T>(MessageMapper, message, DefaultCultures, rawMessage);

            Dispatch(OnBetSettlement, eventArgs, message);
        }