diff --git a/backend/src/schema/resolvers/message.ts b/backend/src/schema/resolvers/message.ts new file mode 100644 index 000000000..3558343d9 --- /dev/null +++ b/backend/src/schema/resolvers/message.ts @@ -0,0 +1,50 @@ +import { v4 as uuid } from 'uuid' +import { neo4jgraphql } from 'neo4j-graphql-js' + +export default { + Query: { + Message: async (object, params, context, resolveInfo) => { + if (!params.filter) params.filter = {} + params.filter.room = { + users_some: { + id: context.user.id, + }, + } + return neo4jgraphql(object, params, context, resolveInfo) + }, + }, + Mutation: { + CreateMessage: async (_parent, params, context, _resolveInfo) => { + const { roomId, content } = params + const { user: { id: currentUserId } } = context + const messageId = uuid() + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const createMessageCypher = ` + MATCH (currentUser:User { id: $currentUserId })-[:CHATS_IN]->(room:Room { id: $roomId }) + MERGE (currentUser)-[:CREATED]->(message:Message)-[:INSIDE]->(room) + SET message.createdAt = toString(datetime()), + message.id = $messageId + message.content = $content + RETURN message { .* } + ` + const createMessageTxResponse = await transaction.run( + createMessageCypher, + { currentUserId, roomId, messageId, content } + ) + const [message] = await createMessageTxResponse.records.map((record) => + record.get('message'), + ) + return message + }) + try { + const message = await writeTxResultPromise + return message + } catch (error) { + throw new Error(error) + } finally { + session.close() + } + }, + }, +} diff --git a/backend/src/schema/types/type/Message.gql b/backend/src/schema/types/type/Message.gql new file mode 100644 index 000000000..919e6a295 --- /dev/null +++ b/backend/src/schema/types/type/Message.gql @@ -0,0 +1,25 @@ +input _MessageFilter { + room: _RoomFilter +} + +type Message { + id: ID! + createdAt: String + updatedAt: String + + content: String! + + author: User! @relation(name: "CREATED", direction: "IN") + room: Room! @relation(name: "INSIDE", direction: "OUT") +} + +type Mutation { + CreateMessage( + roomId: ID! + content: String! + ): Message +} + +type Query { + Message(roomId: ID!): [Message] +}