Esempio n. 1
0
        public async Task <long?> DeleteRateForBetAsync(CreateBet bet)
        {
            if (bet.Rate != 0)
            {
                _logger.LogError($"ERROR - rate: {bet.Rate} != 0");
                throw new UnexpectedFormatMessageException(StringsResource.BetRateMustZero);
            }

            await AuthenticationAsync();

            var bidders = await BiddersAsync();

            var bidder = bidders.SingleOrDefault(x => x.Name.ToLower() == bet.Bidder.ToLower());

            if (bidder == null)
            {
                _logger.LogError("ERROR - bidder not found");
                throw new UnexpectedFormatMessageException(StringsResource.NotExistBidder);
            }

            var teams = await TeamsAsync();

            var speaker = teams.SingleOrDefault(x => x.Name.Replace("-", " ").ToLower() == bet.Speaker.ToLower());

            if (speaker == null)
            {
                _logger.LogError("ERROR - speaker not found");
                throw new UnexpectedFormatMessageException(StringsResource.SpeakerNotFound);
            }

            var rides = await RidesAsync();

            var rideId        = rides.FirstOrDefault(x => x.Number == bet.Ride)?.Id;
            var ridesToUpdate = rides
                                .Where(x => x.Rates.Any(y => y.Bidder.Id == bidder.Id && y.Team == speaker.Id &&
                                                        (rideId.HasValue && x.Id == rideId.Value || !rideId.HasValue)))
                                .Select(x => x.Id)
                                .ToList();

            foreach (var id in ridesToUpdate)
            {
                var ride = await GetRide(id);

                var ratesToDelete = ride.Rates
                                    .Where(x => x.Bidder.Id == bidder.Id && x.Team == speaker.Id)
                                    .ToList();

                foreach (var rateToDelete in ratesToDelete)
                {
                    ride.Rates.Remove(rateToDelete);
                }

                await UpdateRide(ride);
            }

            bidders = await BiddersAsync();

            var currentScore = bidders.Single(x => x.Id == bidder.Id)?.CurrentScore;

            _logger.LogInformation("Current score a participant {0} = {1} from", bet.Bidder, currentScore);

            return(currentScore);
        }
Esempio n. 2
0
        public async Task <long?> CreateBetAsync(CreateBet bet)
        {
            await AuthenticationAsync();

            var bidders = await BiddersAsync();

            var bidder = bidders.SingleOrDefault(x => x.Name.ToLower() == bet.Bidder.ToLower());

            if (bidder == null)
            {
                _logger.LogDebug("Created new bidder {0}", bet.Bidder);

                var bidderId = !bidders.Any() ? 0 : bidders.Max(p => p.Id);
                bidder = new Bidder {
                    Id = ++bidderId, Name = bet.Bidder, CurrentScore = 1000, StartScore = 1000
                };
                await AddBidder(bidder);

                bidders = await BiddersAsync();
            }

            var teams = await TeamsAsync();

            var speaker = teams.SingleOrDefault(x => x.Name.Replace('-', ' ').Equals(bet.Speaker, StringComparison.InvariantCultureIgnoreCase));

            if (speaker == null)
            {
                _logger.LogError("Not found speaker");
                throw new UnexpectedFormatMessageException(StringsResource.SpeakerNotFound);
            }

            var rides = await RidesAsync();

            var rideId = rides.SingleOrDefault(x => x.Number == bet.Ride)?.Id;

            if (!rideId.HasValue)
            {
                _logger.LogError("Not found ride");
                throw new UnexpectedFormatMessageException(StringsResource.IncorectNomination);
            }

            var ride = await GetRide(rideId.Value);

            var rate = ride.Rates.SingleOrDefault(x => x.Bidder.Id == bidder?.Id && x.Team == speaker.Id);

            if (bet.Rate == 0)
            {
                throw new UnexpectedFormatMessageException(StringsResource.BetRateIsNotZerro);
            }
            else if (rate != null)
            {
                if (bidder.CurrentScore + rate.RateValue < bet.Rate)
                {
                    _logger.LogError($"rate: {bidder.CurrentScore} < {bet.Rate}");
                    throw new UnexpectedFormatMessageException(StringsResource.BetRateIsNotEnough);
                }

                rate.RateValue = bet.Rate;
            }
            else
            {
                if (bidder.CurrentScore < bet.Rate)
                {
                    _logger.LogError($"rate: {bidder.CurrentScore} < {bet.Rate}");
                    throw new UnexpectedFormatMessageException(StringsResource.BetRateIsNotEnough);
                }

                var maxId    = ride.Rates.Any() ? ride.Rates.Max(x => x.Id) : 0;
                var rateItem = new Rate
                {
                    Id        = ++maxId,
                    Bidder    = bidder,
                    RateValue = bet.Rate,
                    Team      = speaker.Id
                };

                ride.Rates.Add(rateItem);
            }

            await UpdateRide(ride);

            bidders = await BiddersAsync();

            return(bidders.Single(x => x.Id == bidder?.Id).CurrentScore);
        }