public async Task Handle(ConnectionUpdatedIntegrationEvent @event)
        {
            var connectionSubscription = new ConnectionSubscription(@event.UserId, @event.OtherId);
            var connectionMethod       = ConnectionUpdatedMethod.WithArgs(@event.OtherId, @event.Notes, (int)@event.Relationship);

            await _publisherService.PublishAsync(connectionSubscription, connectionMethod);

            var statusSubscription = new UserStatusSubscription(@event.OtherId);

            var connections = await _connectionService.GetConnectionsAsync(@event.UserId);

            foreach (var connection in connections)
            {
                if (@event.Relationship == ConnectionUpdatedIntegrationEvent.RelationshipEnum.Friend)
                {
                    await _subscriptionService.SubscribeAsync(connection, statusSubscription);

                    var isOnline = await _connectionService.HasConnectionsAsync(@event.OtherId);

                    var statusMethod = UserStatusUpdatedMethod.WithArgs(@event.OtherId, isOnline ? UserStatus.Online : UserStatus.Offline);

                    await _publisherService.PublishAsync(connection, statusMethod);
                }
                else
                {
                    await _subscriptionService.UnsubscribeAsync(connection, statusSubscription);

                    var statusMethod = UserStatusUpdatedMethod.WithArgs(@event.OtherId, UserStatus.Unknown);

                    await _publisherService.PublishAsync(connection, statusMethod);
                }
            }
        }
Exemplo n.º 2
0
        public override async Task <Empty> SubscribeToUsersUpdates(ConnectionsUpdatesRequest request,
                                                                   ServerCallContext context)
        {
            _logger.LogInformation(
                "Begin grpc call from method {Method} to subscribe to users updates {UsersIds} with connectionId {ConnectionId}",
                context.Method,
                string.Join(',', request.UsersIds),
                request.ConnectionId);

            var verifiedConnection =
                await _userConnectionService.VerifyConnectionAsync(request.UserId, request.ConnectionId);

            if (!verifiedConnection)
            {
                context.Status = new Status(StatusCode.InvalidArgument, "Invalid connection id.");
                return(new Empty());
            }

            foreach (var userId in request.UsersIds)
            {
                var userSubscription = new UserSubscription(userId);
                await _subscriptionService.SubscribeAsync(request.ConnectionId, userSubscription);

                var relationshipSubscription = new ConnectionSubscription(request.UserId, userId);
                await _subscriptionService.SubscribeAsync(request.ConnectionId, relationshipSubscription);
            }

            return(new Empty());
        }
        public async Task Handle(ConnectionCreatedIntegrationEvent @event)
        {
            var userSubscription       = new UserSubscription(@event.OtherId);
            var connectionSubscription = new ConnectionSubscription(@event.UserId, @event.OtherId);

            var connectionIds = await _userConnectionService.GetConnectionsAsync(@event.UserId);

            foreach (var connectionId in connectionIds)
            {
                await _subscriptionService.SubscribeAsync(connectionId, userSubscription);

                await _subscriptionService.SubscribeAsync(connectionId, connectionSubscription);
            }

            var method = ConnectionCreatedMethod.WithArgs(@event.OtherId, @event.Name, @event.Tag);

            await _publisherService.PublishAsync(connectionSubscription, method);
        }