room count subscription

This commit is contained in:
Ulf Gebhardt 2023-07-17 12:41:06 +02:00
parent fb45ac107a
commit 3e60ab6854
Signed by: ulfgebhardt
GPG Key ID: DA6B843E748679C9
8 changed files with 37 additions and 36 deletions

View File

@ -1,19 +1,9 @@
import { neo4jgraphql } from 'neo4j-graphql-js' import { neo4jgraphql } from 'neo4j-graphql-js'
import Resolver from './helpers/Resolver' import Resolver from './helpers/Resolver'
import { withFilter } from 'graphql-subscriptions' import RoomResolver from './rooms'
import { pubsub, CHAT_MESSAGE_ADDED } from '../../server' import { pubsub, ROOM_COUNT_UPDATED } from '../../server'
export default { export default {
Subscription: {
chatMessageAdded: {
subscribe: withFilter(
() => pubsub.asyncIterator(CHAT_MESSAGE_ADDED),
(payload, variables) => {
return payload.chatMessageAdded.senderId !== variables.userId
},
),
},
},
Query: { Query: {
Message: async (object, params, context, resolveInfo) => { Message: async (object, params, context, resolveInfo) => {
const { roomId } = params const { roomId } = params
@ -91,12 +81,16 @@ export default {
roomId, roomId,
content, content,
}) })
const [message] = await createMessageTxResponse.records.map((record) => const [message] = await createMessageTxResponse.records.map((record) =>
record.get('message'), record.get('message'),
) )
// TODO change user in context - mark message as seen
const roomCountUpdated = await RoomResolver.Query.UnreadRooms(null, null, context, null)
// send subscriptions // send subscriptions
await pubsub.publish(CHAT_MESSAGE_ADDED, { chatMessageAdded: message }) await pubsub.publish(ROOM_COUNT_UPDATED, { roomCountUpdated })
return message return message
}) })

View File

@ -1,7 +1,20 @@
import { neo4jgraphql } from 'neo4j-graphql-js' import { neo4jgraphql } from 'neo4j-graphql-js'
import Resolver from './helpers/Resolver' import Resolver from './helpers/Resolver'
import { pubsub, ROOM_COUNT_UPDATED } from '../../server'
import { withFilter } from 'graphql-subscriptions'
export default { export default {
Subscription: {
roomCountUpdated: {
subscribe: withFilter(
() => pubsub.asyncIterator(ROOM_COUNT_UPDATED),
(payload, variables) => {
console.log('sub', payload, variables)
return true // payload.chatMessageAdded.senderId !== variables.userId
},
),
},
},
Query: { Query: {
Room: async (object, params, context, resolveInfo) => { Room: async (object, params, context, resolveInfo) => {
if (!params.filter) params.filter = {} if (!params.filter) params.filter = {}

View File

@ -45,7 +45,3 @@ type Query {
orderBy: [_MessageOrdering] orderBy: [_MessageOrdering]
): [Message] ): [Message]
} }
type Subscription {
chatMessageAdded(userId: ID!): Message
}

View File

@ -35,3 +35,7 @@ type Query {
): [Room] ): [Room]
UnreadRooms: Int UnreadRooms: Int
} }
type Subscription {
roomCountUpdated(userId: ID!): Int
}

View File

@ -14,7 +14,8 @@ import bodyParser from 'body-parser'
import { graphqlUploadExpress } from 'graphql-upload' import { graphqlUploadExpress } from 'graphql-upload'
export const NOTIFICATION_ADDED = 'NOTIFICATION_ADDED' export const NOTIFICATION_ADDED = 'NOTIFICATION_ADDED'
export const CHAT_MESSAGE_ADDED = 'CHAT_MESSAGE_ADDED' // export const CHAT_MESSAGE_ADDED = 'CHAT_MESSAGE_ADDED'
export const ROOM_COUNT_UPDATED = 'ROOM_COUNT_UPDATED'
const { REDIS_DOMAIN, REDIS_PORT, REDIS_PASSWORD } = CONFIG const { REDIS_DOMAIN, REDIS_PORT, REDIS_PASSWORD } = CONFIG
let prodPubsub, devPubsub let prodPubsub, devPubsub
const options = { const options = {

View File

@ -16,8 +16,7 @@
<script> <script>
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import CounterIcon from '~/components/_new/generic/CounterIcon/CounterIcon' import CounterIcon from '~/components/_new/generic/CounterIcon/CounterIcon'
import { unreadRoomsQuery } from '~/graphql/Rooms' import { unreadRoomsQuery, roomCountUpdated } from '~/graphql/Rooms'
import { chatMessageAdded } from '~/graphql/Messages'
export default { export default {
name: 'ChatNotificationMenu', name: 'ChatNotificationMenu',
@ -43,15 +42,14 @@ export default {
this.count = UnreadRooms this.count = UnreadRooms
}, },
subscribeToMore: { subscribeToMore: {
document: chatMessageAdded(), document: roomCountUpdated(),
variables() { variables() {
return { return {
userId: this.user.id, userId: this.user.id,
} }
}, },
updateQuery: (previousResult, { subscriptionData }) => { updateQuery: (previousResult, { subscriptionData }) => {
// TODO emit chat reload return { UnreadRooms: subscriptionData.data.roomCountUpdated }
return { UnreadRooms: previousResult.UnreadRooms + 1}
}, },
}, },
}, },

View File

@ -33,16 +33,3 @@ export const createMessageMutation = () => {
} }
` `
} }
export const chatMessageAdded = () => {
return gql`
subscription chatMessageAdded($userId: ID!) {
chatMessageAdded(userId: $userId) {
id
room {
id
}
}
}
`
}

View File

@ -35,3 +35,11 @@ export const unreadRoomsQuery = () => {
} }
` `
} }
export const roomCountUpdated = () => {
return gql`
subscription roomCountUpdated($userId: ID!) {
roomCountUpdated(userId: $userId)
}
`
}