From 032bca1b64a68fe3080bdcaf0aa51878ae87a6f5 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 13 Jul 2023 19:09:17 +0200 Subject: [PATCH] add last message at, use cypher statements for roomName and avatar --- backend/src/graphql/rooms.ts | 1 + backend/src/schema/resolvers/messages.spec.ts | 17 ++++++++++++++++- backend/src/schema/resolvers/messages.ts | 1 + backend/src/schema/resolvers/rooms.spec.ts | 3 +++ backend/src/schema/resolvers/rooms.ts | 6 +----- backend/src/schema/types/type/Room.gql | 6 ++++-- 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/backend/src/graphql/rooms.ts b/backend/src/graphql/rooms.ts index 109bf1d55..c42da6166 100644 --- a/backend/src/graphql/rooms.ts +++ b/backend/src/graphql/rooms.ts @@ -18,6 +18,7 @@ export const roomQuery = () => { id roomId roomName + lastMessageAt users { _id id diff --git a/backend/src/schema/resolvers/messages.spec.ts b/backend/src/schema/resolvers/messages.spec.ts index 0deccb4e9..bc16c1ef2 100644 --- a/backend/src/schema/resolvers/messages.spec.ts +++ b/backend/src/schema/resolvers/messages.spec.ts @@ -1,7 +1,7 @@ import { createTestClient } from 'apollo-server-testing' import Factory, { cleanDatabase } from '../../db/factories' import { getNeode, getDriver } from '../../db/neo4j' -import { createRoomMutation } from '../../graphql/rooms' +import { createRoomMutation, roomQuery } from '../../graphql/rooms' import { createMessageMutation, messageQuery, markMessagesAsSeen } from '../../graphql/messages' import createServer from '../../server' @@ -129,6 +129,21 @@ describe('Message', () => { }, }) }) + + describe('room is updated as well', () => { + it('has last message at set', async () => { + await expect(query({ query: roomQuery() })).resolves.toMatchObject({ + errors: undefined, + data: { + Room: [ + expect.objectContaining({ + lastMessageAt: expect.any(String), + }), + ], + }, + }) + }) + }) }) describe('user does not chat in room', () => { diff --git a/backend/src/schema/resolvers/messages.ts b/backend/src/schema/resolvers/messages.ts index 45de0b4a4..266758128 100644 --- a/backend/src/schema/resolvers/messages.ts +++ b/backend/src/schema/resolvers/messages.ts @@ -68,6 +68,7 @@ export default { distributed: false, seen: false })-[:INSIDE]->(room) + SET room.lastMessageAt = toString(datetime()) RETURN message { .* } ` const createMessageTxResponse = await transaction.run(createMessageCypher, { diff --git a/backend/src/schema/resolvers/rooms.spec.ts b/backend/src/schema/resolvers/rooms.spec.ts index 03c3d4456..d247c42b4 100644 --- a/backend/src/schema/resolvers/rooms.spec.ts +++ b/backend/src/schema/resolvers/rooms.spec.ts @@ -21,6 +21,9 @@ beforeAll(async () => { driver, neode, user: authenticatedUser, + cypherParams: { + currentUserId: authenticatedUser ? authenticatedUser.id : null, + }, } }, }) diff --git a/backend/src/schema/resolvers/rooms.ts b/backend/src/schema/resolvers/rooms.ts index d5015a03b..c8077211a 100644 --- a/backend/src/schema/resolvers/rooms.ts +++ b/backend/src/schema/resolvers/rooms.ts @@ -12,11 +12,6 @@ export default { if (resolved) { resolved.forEach((room) => { if (room.users) { - // buggy, you must query the username for this to function correctly - room.roomName = room.users.filter((user) => user.id !== context.user.id)[0].name - room.avatar = - room.users.filter((user) => user.id !== context.user.id)[0].avatar?.url || - 'default-avatar' room.users.forEach((user) => { user._id = user.id }) @@ -68,6 +63,7 @@ export default { }, Room: { ...Resolver('Room', { + undefinedToNull: ['lastMessageAt'], hasMany: { users: '<-[:CHATS_IN]-(related:User)', }, diff --git a/backend/src/schema/types/type/Room.gql b/backend/src/schema/types/type/Room.gql index 2ce6556f6..eb5ed02e5 100644 --- a/backend/src/schema/types/type/Room.gql +++ b/backend/src/schema/types/type/Room.gql @@ -13,8 +13,10 @@ type Room { users: [User]! @relation(name: "CHATS_IN", direction: "IN") roomId: String! @cypher(statement: "RETURN this.id") - roomName: String! ## @cypher(statement: "MATCH (this)<-[:CHATS_IN]-(user:User) WHERE NOT user.id = $cypherParams.currentUserId RETURN user[0].name") - avatar: String! ## @cypher match not own user in users array + roomName: String! @cypher(statement: "MATCH (this)<-[:CHATS_IN]-(user:User) WHERE NOT user.id = $cypherParams.currentUserId RETURN user.name") + avatar: String! @cypher(statement: "MATCH (this)<-[:CHATS_IN]-(user:User) WHERE NOT user.id = $cypherParams.currentUserId RETURN user.avatar.url") + + lastMessageAt: String } type Mutation {