public async Task <Unit> Handle(AddReactionCommand request, CancellationToken cancellationToken) { var activity = await this.activityRepository.GetActivityAsync(request.ActivityId); var reactingUser = await this.userRepository.GetUserAsync(request.UserId); switch (request.Type) { case ReactionType.Cheers: activity.AddCheers(new Reaction(request.UserId, reactingUser.Name)); break; case ReactionType.Like: activity.AddLike(new Reaction(request.UserId, reactingUser.Name)); break; case ReactionType.Comment: activity.AddComment(new CommentReaction(request.UserId, reactingUser.Name, request.Comment)); break; } await this.activityRepository.UpdateActivityAsync(request.UserId, activity.ToEntity()); // add to queue var message = new ReactionAddedMessage(request.ActivityId, request.Type, request.UserId, request.Comment); await storageAccessService.AddQueueMessage(Constants.QueueNames.ReactionAdded, message); return(Unit.Value); }
public async Task Run([QueueTrigger(Shared.Constants.QueueNames.ReactionAdded, Connection = "AzureWebJobsStorage")] ReactionAddedMessage reactionAddedMessage, ILogger log) { var activity = await activityRepository.GetActivityAsync(reactionAddedMessage.ActivityId); var reactingUser = await userRepository.GetUserAsync(reactionAddedMessage.UserId); var originUser = await userRepository.GetUserAsync(activity.UserId); await this.activityDistributionService.DistributeActivitiesAsync(originUser, activity.ToEntity()); List <NotificationBase> notifications = new List <NotificationBase>(); var url = GetActivityUrlWithHighlightedActivityId(activity.Id); // notify involved users if (activity.UserId != reactingUser.Id) { var notification = new ReactionNotification( originUser.Id, reactionAddedMessage.ReactionType, reactingUser.Name, originUser.Name, true, url); notifications.Add(notification); } // now other ones (with likes and cheers) var involvedUserNotifications = activity.Cheers?.Select(c => new UserInfo(c.UserId, c.UserName)) .Union(activity.Likes?.Select(l => new UserInfo(l.UserId, l.UserName))) .Union(activity.Comments?.Select(c => new UserInfo(c.UserId, c.UserName))) .Distinct() .Where(u => u.UserId != activity.UserId && u.UserId != reactingUser.Id) .ToList(); var involvedNotifications = involvedUserNotifications .Select(u => new ReactionNotification(u.UserId, reactionAddedMessage.ReactionType, reactingUser.Name, activity.UserName, false, url)) .ToList(); notifications.AddRange(involvedNotifications); await pushNotificationService.NotifyAsync(notifications); }