Files
2026-07-31 15:11:57 +02:00

73 lines
1.9 KiB
JavaScript

const driver = require("../../graph_db");
const { graphIdToNumber } = require("../relations/friend_graph");
const GRAPH = { database: process.env.GRAPH_DB_NAME };
async function likePost(userId, postId) {
const { records } = await driver.executeQuery(
`MATCH (me:Person {db_id: $me})
MERGE (p:Post {db_id: $postId})
MERGE (me)-[l:LIKES]->(p)
SET l.created_at = coalesce(l.created_at, datetime())
RETURN me`,
{ me: Number(userId), postId: Number(postId) },
GRAPH,
);
return records.length > 0;
}
async function unlikePost(userId, postId) {
await driver.executeQuery(
`MATCH (me:Person {db_id: $me})-[l:LIKES]->(p:Post {db_id: $postId})
DELETE l`,
{ me: Number(userId), postId: Number(postId) },
GRAPH,
);
}
async function likeDataForPosts(userId, postIds) {
const ids = postIds.map(Number);
if (ids.length === 0) return new Map();
const { records } = await driver.executeQuery(
`MATCH (p:Post) WHERE p.db_id IN $ids
OPTIONAL MATCH (p)<-[l:LIKES]-(:Person)
WITH p, count(l) AS like_count
OPTIONAL MATCH (me:Person {db_id: $me})-[:LIKES]->(p)
RETURN p.db_id AS id, like_count, count(me) > 0 AS liked_by_me`,
{ ids, me: Number(userId) },
GRAPH,
);
const result = new Map();
for (const record of records) {
result.set(graphIdToNumber(record.get("id")), {
like_count: Number(record.get("like_count")),
liked_by_me: Boolean(record.get("liked_by_me")),
});
}
return result;
}
async function deletePostNode(postId) {
await driver.executeQuery(
"MATCH (p:Post {db_id: $postId}) DETACH DELETE p",
{ postId: Number(postId) },
GRAPH,
);
}
async function deletePostsByAuthor(authorId) {
await driver.executeQuery(
"MATCH (p:Post {author_id: $authorId}) DETACH DELETE p",
{ authorId: Number(authorId) },
GRAPH,
);
}
module.exports = {
likePost,
unlikePost,
likeDataForPosts,
deletePostNode,
deletePostsByAuthor,
};