Пользовательская публикация (подписки)

Вот небольшая проблема, с которой я столкнулся и не смог найти много информации в документации. Я пытаюсь создать личные сообщения чата. У нас есть следующий код для подписки пользователя на тему:

export const resolvers = {
  Subscription: {
    somethingChanged: {
      subscribe: () => pubsub.asyncIterator('chat_messages'),
    },
  },
}

и опубликовать

pubsub.publish('chat_messages', { somethingChanged: { sender_id: 1, receiver_id: 2, message: 'test' }});

Я использовал onConnect, чтобы проверить, что пользователь аутентифицирован

const server = new ApolloServer({
    typeDefs,
    resolvers,
    subscriptions: {
        onConnect: (connectionParams, webSocket) => {
            ...
            if (!authenticated) throw error
            ...
        },
    },
   ...
})

Это хорошо работает, когда я хочу подписать пользователей на определенную тему, например. Но как я могу реализовать связь между частным пользователем и пользователем? Я попробовал withFilter но, кажется, не может реализовать специфические для пользователя проверки авторизации (относительно сообщения).

1 ответ

Вот демоверсия: https://github.com/mrdulin/apollo-server-express-starter/tree/master/src/subscription/demo-1

С этими функциями:

  1. jwt на основе аутентификации для подключения через веб-сокет

  2. Пользовательский канал, который означает, кто может получать сообщения, кто не может.

Есть несколько концепций, которые вам нужно знать:

  1. есть два типа пользователя: requestUser и subscribeUsers (включая requestUser)

  2. Вы должны написать код в filterFnдля тех, кто может получить сообщение, которое requestUser Отправить.

Например:

Есть три подписавшихся пользователя: s1(клиент-1), s2(клиент-2), s3(клиент-3)

Когда пользователь запроса (клиент-4) отправляет сообщение (возможно, мутацию), вы можете получить подписку пользователей и запросить пользователей через context аргумент filterFn,

По этим двум типам users' информация. Вы можете написать свою собственную логику бизнеса в filterFn решить, кто может получить сообщение, а кто нет.

PS рядом context, ты можешь получить variables аргумент в filterFn от клиента. Это даст больше информации, чтобы решить, кто может получать сообщения, а кто нет

Извините за мой английский!

Другие вопросы по тегам