public async Task <Unit> Handle(AcceptInvitationCommand request, CancellationToken cancellationToken)
        {
            var invitation = await this.invitationRepository.GetAsync(request.InvitationToken);

            if (request.AcceptingUserId != invitation.InvitingUserId)
            {
                var invitingUser = await this.userRepository.GetUserAsync(invitation.InvitingUserId);

                var acceptingUser = await this.userRepository.GetUserAsync(request.AcceptingUserId);

                if (invitingUser != null && acceptingUser != null)
                {
                    invitingUser.AcceptInvitation(request.InvitationToken, acceptingUser.ToUserInfo());
                    acceptingUser.AddFriend(invitingUser.ToUserInfo());

                    await userRepository.UpdateUserAsync(invitingUser.ToEntity());

                    await userRepository.UpdateUserAsync(acceptingUser.ToEntity());
                }

                try
                {
                    await this.rankingService.IncreaseScoreAsync(invitingUser.Id, Scores.FriendInvitation);

                    var message = await translationService.GetTranslationAsync(invitingUser.Language, "RecruitmentActivityMessage", acceptingUser.Name, Constants.Scores.FriendInvitation);

                    var notificationActivity = Activity.Domain.Activity.CreateNotificationActivity(invitingUser.Id, invitingUser.Name, message);

                    await this.activityRepository.AddActivityAsync(notificationActivity.ToEntity());
                }
                catch (Exception ex)
                {
                    // log error
                    logger.LogError($"Error increasing score for user {invitingUser}: {ex}");
                }

                if (invitingUser != null && invitingUser.PushInfo != null)
                {
                    string userName = acceptingUser?.Name ?? await translationService.GetTranslationAsync(invitingUser.Language, "Somebody");

                    string messageContent = await translationService.GetTranslationAsync(invitingUser.Language, "AcceptedInvitation", userName);

                    var message = new WebPushNotificationMessage(Urls.ApplicationIconUrl, Urls.ApplicationIconUrl, Urls.ApplicationUrl,
                                                                 "Binge Buddy", messageContent);
                    this.notificationService.SendWebPushMessage(new[] { invitingUser.PushInfo }, message);
                }
            }

            return(Unit.Value);
        }
        public void SendWebPushMessage(IEnumerable <PushInfo> receivers, WebPushNotificationMessage message)
        {
            var webPushClient = new WebPushClient();
            var vapidDetails  = new VapidDetails("mailto:[email protected]",
                                                 configuration.WebPushPublicKey, configuration.WebPushPrivateKey);

            var pushMessage = new WebPushMessage(message);

            foreach (var pushInfo in receivers)
            {
                try
                {
                    webPushClient.SendNotification(
                        new PushSubscription(pushInfo.SubscriptionEndpoint, pushInfo.p256dh, pushInfo.Auth),
                        JsonConvert.SerializeObject(pushMessage),
                        vapidDetails);
                }
                catch (Exception ex)
                {
                    this.logger.LogError(ex, $"Error sending push notification!");
                }
            }
        }
Exemple #3
0
        public async Task NotifyAsync(IEnumerable <NotificationBase> notifications)
        {
            var notificationPerUser = notifications.GroupBy(n => n.UserId);

            foreach (var userNotifications in notificationPerUser)
            {
                var user = await this.userRepository.GetUserAsync(userNotifications.Key);

                if (user.PushInfo == null ||
                    user.LastOnline <= DateTime.UtcNow.Subtract(TimeSpan.FromDays(30)))
                {
                    continue;
                }

                foreach (var n in userNotifications)
                {
                    NotificationMessage message = null;
                    switch (n)
                    {
                    case ActivityNotification activity:
                    {
                        message = await BuildNotificationMessageAsync(user.Language, activity);

                        break;
                    }

                    case ReactionNotification reaction:
                    {
                        message = await BuildNotificationMessageAsync(user.Language, reaction);

                        break;
                    }

                    case DrinkEventCongratulationNotification congrats:
                    {
                        message = await BuildNotificationMessageAsync(user.Language, congrats);

                        break;
                    }

                    case DrinkEventNotification drinkEvent:
                    {
                        message = await BuildNotificationMessageAsync(user.Language, drinkEvent);

                        break;
                    }

                    default:
                    {
                        this.logger.LogError($"Unsupported notification message [{message}].");
                        continue;
                    }
                    }

                    var webPushMessage = new WebPushNotificationMessage(
                        Constants.Urls.ApplicationIconUrl,
                        Constants.Urls.ApplicationIconUrl,
                        Constants.Urls.ApplicationUrl,
                        message.Title,
                        message.Body);

                    notificationService.SendWebPushMessage(new[] { user.PushInfo }, webPushMessage);
                }
            }
        }