Ejemplo n.º 1
0
 public FinalizedActionProcessingResults(Guid processSetID, Instant processTime, string processName, ActionProcessingResults results)
 {
     ProcessSetID = processSetID;
     ProcessTime  = processTime;
     ProcessName  = processName;
     Results      = results;
 }
    private ActionProcessingResults ProcessPickupsIteration(SystemWideValues systemWideValues, IReadOnlyDictionary <LeagueYear, IReadOnlyList <PickupBid> > allActiveBids,
                                                            ActionProcessingResults existingResults, Instant processingTime, IReadOnlyDictionary <Guid, MasterGameYear> masterGameYearDictionary)
    {
        IEnumerable <PickupBid> flatAllBids = allActiveBids.SelectMany(x => x.Value);

        var publisherStateSet = existingResults.PublisherStateSet;
        var processedBids     = new ProcessedBidSet();

        foreach (var leagueYear in allActiveBids)
        {
            if (!leagueYear.Value.Any())
            {
                continue;
            }

            var processedBidsForLeagueYear = ProcessPickupsForLeagueYear(leagueYear.Key, leagueYear.Value, publisherStateSet, systemWideValues, processingTime);
            processedBids = processedBids.AppendSet(processedBidsForLeagueYear);
        }

        ActionProcessingResults bidResults = GetBidProcessingResults(processedBids.SuccessBids, processedBids.FailedBids, publisherStateSet, processingTime, masterGameYearDictionary);
        var newResults    = existingResults.Combine(bidResults);
        var remainingBids = flatAllBids.Except(processedBids.ProcessedBids);

        if (remainingBids.Any())
        {
            IReadOnlyDictionary <LeagueYear, IReadOnlyList <PickupBid> > remainingBidDictionary = remainingBids.GroupToDictionary(x => x.LeagueYear);
            var subProcessingResults = ProcessPickupsIteration(systemWideValues, remainingBidDictionary, newResults, processingTime, masterGameYearDictionary);
            ActionProcessingResults combinedResults = newResults.Combine(subProcessingResults);
            return(combinedResults);
        }

        return(newResults);
    }
    public FinalizedActionProcessingResults ProcessActions(SystemWideValues systemWideValues, IReadOnlyDictionary <LeagueYear, IReadOnlyList <PickupBid> > allActiveBids,
                                                           IReadOnlyDictionary <LeagueYear, IReadOnlyList <DropRequest> > allActiveDrops, IEnumerable <Publisher> publishers, Instant processingTime, IReadOnlyDictionary <Guid, MasterGameYear> masterGameYearDictionary)
    {
        var publisherStateSet = new PublisherStateSet(publishers);
        var flatBids          = allActiveBids.SelectMany(x => x.Value);
        var invalidBids       = flatBids.Where(x => x.CounterPick && x.ConditionalDropPublisherGame is not null);

        if (invalidBids.Any())
        {
            throw new Exception("There are counter pick bids with conditional drops.");
        }

        string processName  = $"Drop/Bid Processing ({processingTime.ToEasternDate()})";
        Guid   processSetID = Guid.NewGuid();

        if (!allActiveBids.Any() && !allActiveDrops.Any())
        {
            var emptyResults = ActionProcessingResults.GetEmptyResultsSet(publisherStateSet);
            return(new FinalizedActionProcessingResults(processSetID, processingTime, processName, emptyResults));
        }

        ActionProcessingResults dropResults = ProcessDrops(allActiveDrops, publisherStateSet, processingTime);

        if (!allActiveBids.Any())
        {
            return(new FinalizedActionProcessingResults(processSetID, processingTime, processName, dropResults));
        }

        ActionProcessingResults bidResults = ProcessPickupsIteration(systemWideValues, allActiveBids, dropResults, processingTime, masterGameYearDictionary);

        return(new FinalizedActionProcessingResults(processSetID, processingTime, processName, bidResults));
    }
 public ActionProcessingResults Combine(ActionProcessingResults subProcessingResults)
 {
     return(new ActionProcessingResults(
                SuccessBids.Concat(subProcessingResults.SuccessBids).DistinctBy(x => x.PickupBid.BidID),
                FailedBids.Concat(subProcessingResults.FailedBids).DistinctBy(x => x.PickupBid.BidID),
                SuccessDrops.Concat(subProcessingResults.SuccessDrops).DistinctBy(x => x.DropRequestID),
                FailedDrops.Concat(subProcessingResults.FailedDrops).DistinctBy(x => x.DropRequestID),
                LeagueActions.Concat(subProcessingResults.LeagueActions).DistinctBy(x => x.ActionInternalID),
                subProcessingResults.PublisherStateSet,
                AddedPublisherGames.Concat(subProcessingResults.AddedPublisherGames).DistinctBy(x => x.PublisherGameID),
                RemovedPublisherGames.Concat(subProcessingResults.RemovedPublisherGames).DistinctBy(x => x.PublisherGame.PublisherGameID)));
 }
    private ActionProcessingResults ProcessDrops(IReadOnlyDictionary <LeagueYear, IReadOnlyList <DropRequest> > allDropRequests, PublisherStateSet publisherStateSet, Instant processingTime)
    {
        List <FormerPublisherGame> gamesToDelete = new List <FormerPublisherGame>();
        List <LeagueAction>        leagueActions = new List <LeagueAction>();
        List <DropRequest>         successDrops  = new List <DropRequest>();
        List <DropRequest>         failedDrops   = new List <DropRequest>();

        foreach (var leagueYearGroup in allDropRequests)
        {
            foreach (var dropRequest in leagueYearGroup.Value)
            {
                var affectedPublisher = publisherStateSet.GetPublisher(dropRequest.Publisher.PublisherID);
                var dropResult        = _gameAcquisitionService.CanDropGame(dropRequest, leagueYearGroup.Key, affectedPublisher);
                if (dropResult.Result.IsSuccess)
                {
                    successDrops.Add(dropRequest);
                    var publisherGame       = dropRequest.Publisher.GetPublisherGameOrThrow(dropRequest.MasterGame);
                    var formerPublisherGame = publisherGame.GetFormerPublisherGame(processingTime, "Dropped by player");
                    gamesToDelete.Add(formerPublisherGame);
                    LeagueAction leagueAction = new LeagueAction(dropRequest, dropResult, processingTime);
                    publisherStateSet.DropGameForPublisher(affectedPublisher, publisherGame, leagueYearGroup.Key.Options);

                    leagueActions.Add(leagueAction);
                }
                else
                {
                    failedDrops.Add(dropRequest);
                    LeagueAction leagueAction = new LeagueAction(dropRequest, dropResult, processingTime);
                    leagueActions.Add(leagueAction);
                }
            }
        }

        ActionProcessingResults dropProcessingResults = ActionProcessingResults.GetResultsSetFromDropResults(successDrops, failedDrops, leagueActions, publisherStateSet, gamesToDelete);

        return(dropProcessingResults);
    }