コード例 #1
0
        public Task <bool> ReviewWishListAsync(Core.Models.WishList wishList)
        {
            // Check if wish list has been reviewed by everyone
            var nextReviewer = _reviewerActorNames.Where(reviewer => !(wishList.Approvals?.Any(wla => wla.Approver == reviewer) ?? false)).FirstOrDefault();

            if (String.IsNullOrWhiteSpace(nextReviewer))
            {
                // List is fully reviewed, send it on to fulfillment
                var processor = _processingFactory.Create();
                return(processor.ProcessWishListAsync(wishList));
            }

            try
            {
                // Fire this off, don't wait (if we can get the actor, we'll assume it all works)
                var actor = _actorFactory.Create(nextReviewer);

                Task.Run(() =>
                {
                    // Send to selected reviewer actor
                    actor.ReviewWishListAsync(wishList);
                });

                return(Task.FromResult(true));
            }
            catch (Exception ex)
            {
                ServiceEventSource.Current.ServiceMessage(Context, "Exception Occurred Reviewing Wish List: {0}", ex.Message);
                return(Task.FromResult(false));
            }
        }
コード例 #2
0
        public async Task ReviewWishListAsync(Core.Models.WishList wishListToReview)
        {
            // make sure we don't review the same person more than once
            var algorithm = await StateManager.GetStateAsync <ReviewerAlgorithm>(ReviewerAlgorithmKey);

            var personList = await StateManager.GetStateAsync <List <Guid> >(ReviewedPersonListKey);

            var reviewService = _reviewServiceFactory.Create();

            var actorId = Id.GetStringId();

            // If this actor reviewed this person already, then kick them back to the review service
            // without approving anything (the review committee hates doing extra work)
            if (personList.Contains(wishListToReview.PersonId))
            {
                if (!(wishListToReview.Approvals?.Any(wla => wla.Approver == actorId) ?? false))
                {
                    wishListToReview.AddApproval(actorId);
                }
            }
            else
            {
                // Otherwise, let's approve some items
                // TODO: Make this fancier
                var randomItemMod = 100;
                switch (algorithm)
                {
                case ReviewerAlgorithm.Grumpy: randomItemMod = 4; break;

                case ReviewerAlgorithm.Happy: randomItemMod = 2; break;

                case ReviewerAlgorithm.Honest: randomItemMod = ((int)BehaviorRating.Angelic + 1) - ((int)BehaviorRating.Angelic - (int)wishListToReview.SelfReportedBehaviorRating); break;
                }

                var approvedItems = wishListToReview.Items?.Where(i => _randomizer.Next(100) % randomItemMod == 0).Select(i => i.Id).ToArray() ?? new Guid[0];
                wishListToReview.AddApproval(actorId, approvedItems);

                personList.Add(wishListToReview.PersonId);
                await StateManager.AddOrUpdateStateAsync(ReviewedPersonListKey, personList, (name, value) => { value.Add(wishListToReview.PersonId); return(value); });
            }

            if (!await reviewService.ReviewWishListAsync(wishListToReview))
            {
                ActorEventSource.Current.Message("Error Returning Wish List for Review: {0}, {1}", actorId, wishListToReview.PersonId);
            }
        }
コード例 #3
0
        public async Task <Gift> MakeWishListItemAsync(Core.Models.WishList wishList, WishListItem itemToMake)
        {
            // TODO: Make the actual gift
            var giftMade = new Gift
            {
                Id           = Guid.NewGuid(),
                PersonId     = wishList.PersonId,
                WishListItem = itemToMake,
                MadeBy       = Id.GetStringId()
            };

            // Fire off the gift completed event
            var completedEvent = GetEvent <IGiftMakerElfActorEvents>();

            completedEvent.GiftCompleted(giftMade);

            var service = _shippingServiceFactory.Create();
            await service.ShipGiftAsync(giftMade, wishList);

            return(giftMade);
        }
コード例 #4
0
        public async Task <bool> ProcessWishListAsync(Core.Models.WishList wishListToProcess)
        {
            if (wishListToProcess == null)
            {
                return(false);
            }

            // Gather items that are approved by at least 2 committee members
            var approvedItemCounts = wishListToProcess.Approvals.SelectMany(x => x.ApprovedItems)
                                     .GroupBy(x => x)
                                     .Select(x => new { Key = x.Key, Approvals = x.Count() })
                                     .Where(x => x.Approvals >= 2)
                                     .ToDictionary(x => x.Key, x => x.Approvals);

            foreach (var item in wishListToProcess.Items)
            {
                if (approvedItemCounts.ContainsKey(item.Id))
                {
                    using (var tx = StateManager.CreateTransaction())
                    {
                        var itemType = item.ItemType.ToString();
                        var stateKey = String.Format(GiftQueueStateFormat, itemType);
                        var queue    = await StateManager.GetOrAddAsync <IReliableQueue <GiftMakerEntry> >(tx, stateKey);

                        await queue.EnqueueAsync(tx, new GiftMakerEntry
                        {
                            WishList     = wishListToProcess,
                            WishListItem = item
                        });

                        await tx.CommitAsync();
                    }
                }
            }

            return(true);
        }
コード例 #5
0
        public Task <bool> ShipGiftAsync(Gift gift, Core.Models.WishList wishList)
        {
            // TODO: Put this into our dictionary, look at the person service, see if family gifts are ready, etc

            return(Task.FromResult(true));
        }