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