diff --git a/backend/src/graphql/messages.ts b/backend/src/graphql/messages.ts index 4d2220f18..08afe64f4 100644 --- a/backend/src/graphql/messages.ts +++ b/backend/src/graphql/messages.ts @@ -6,6 +6,9 @@ export const createMessageMutation = () => { CreateMessage(roomId: $roomId, content: $content) { id content + saved + distributed + seen } } ` @@ -22,6 +25,9 @@ export const messageQuery = () => { username avatar date + saved + distributed + seen } } ` diff --git a/backend/src/schema/resolvers/messages.spec.ts b/backend/src/schema/resolvers/messages.spec.ts index a43bd3226..8001e8bc5 100644 --- a/backend/src/schema/resolvers/messages.spec.ts +++ b/backend/src/schema/resolvers/messages.spec.ts @@ -122,6 +122,9 @@ describe('Message', () => { CreateMessage: { id: expect.any(String), content: 'Some nice message to other chatting user', + saved: true, + distributed: false, + seen: false, }, }, }) @@ -217,6 +220,9 @@ describe('Message', () => { username: 'Chatting User', avatar: expect.any(String), date: expect.any(String), + saved: true, + distributed: true, + seen: false, }, ], }, @@ -261,6 +267,9 @@ describe('Message', () => { username: 'Chatting User', avatar: expect.any(String), date: expect.any(String), + saved: true, + distributed: true, + seen: false, }), expect.objectContaining({ id: expect.any(String), @@ -269,6 +278,9 @@ describe('Message', () => { username: 'Other Chatting User', avatar: expect.any(String), date: expect.any(String), + saved: true, + distributed: true, + seen: false, }), expect.objectContaining({ id: expect.any(String), @@ -277,6 +289,9 @@ describe('Message', () => { username: 'Chatting User', avatar: expect.any(String), date: expect.any(String), + saved: true, + distributed: false, + seen: false, }), ]), }, diff --git a/backend/src/schema/resolvers/messages.ts b/backend/src/schema/resolvers/messages.ts index b93cffe06..7a2ba418c 100644 --- a/backend/src/schema/resolvers/messages.ts +++ b/backend/src/schema/resolvers/messages.ts @@ -14,9 +14,37 @@ export default { }, } const resolved = await neo4jgraphql(object, params, context, resolveInfo) + if (resolved) { + const undistributedMessagesIds = resolved + .filter((msg) => !msg.distributed && msg.senderId !== context.user.id) + .map((msg) => msg.id) + if (undistributedMessagesIds.length > 0) { + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const setDistributedCypher = ` + MATCH (m:Message) WHERE m.id IN $undistributedMessagesIds + SET m.distributed = true + RETURN m { .* } + ` + const setDistributedTxResponse = await transaction.run(setDistributedCypher, { + undistributedMessagesIds, + }) + const messages = await setDistributedTxResponse.records.map((record) => record.get('m')) + return messages + }) + try { + await writeTxResultPromise + } finally { + session.close() + } + // send subscription to author to updated the messages + } resolved.forEach((message) => { message._id = message.id + if (message.senderId !== context.user.id) { + message.distributed = true + } }) } return resolved @@ -35,7 +63,10 @@ export default { CREATE (currentUser)-[:CREATED]->(message:Message { createdAt: toString(datetime()), id: apoc.create.uuid(), - content: $content + content: $content, + saved: true, + distributed: false, + seen: false })-[:INSIDE]->(room) RETURN message { .* } ` diff --git a/backend/src/schema/types/type/Message.gql b/backend/src/schema/types/type/Message.gql index 4a3346079..a22828a7e 100644 --- a/backend/src/schema/types/type/Message.gql +++ b/backend/src/schema/types/type/Message.gql @@ -16,6 +16,10 @@ type Message { username: String! @cypher(statement: "MATCH (this)<-[:CREATED]-(user:User) RETURN user.name") avatar: String @cypher(statement: "MATCH (this)<-[:CREATED]-(:User)-[:AVATAR_IMAGE]->(image:Image) RETURN image.url") date: String! @cypher(statement: "RETURN this.createdAt") + + saved: Boolean + distributed: Boolean + seen: Boolean } type Mutation {