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)); } }
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); } }
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); }
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); }
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)); }