Beispiel #1
0
        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);
        }