74 lines
2.0 KiB
TypeScript
74 lines
2.0 KiB
TypeScript
import { awardPoints } from "../../utils/scoring";
|
|
import { createNotification } from "../../db/notifications";
|
|
import { getProfile } from "../../db/profile";
|
|
import {
|
|
getPostLike,
|
|
setPostLike,
|
|
deletePostLike,
|
|
countPostLikes,
|
|
syncPostLikeCounts,
|
|
getPostById,
|
|
} from "../../db/community";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const user = await requireUser(event);
|
|
const { postId, type } = (await readBody(event)) as {
|
|
postId: string;
|
|
type: "like" | "dislike";
|
|
};
|
|
|
|
if (!postId || !["like", "dislike"].includes(type)) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
message: "postId und type (like|dislike) erforderlich",
|
|
});
|
|
}
|
|
|
|
const [existing, currentPost] = await Promise.all([
|
|
getPostLike(user.id, postId),
|
|
getPostById(postId),
|
|
]);
|
|
|
|
let newUserLike: "like" | "dislike" | null = null;
|
|
|
|
if (existing) {
|
|
if (existing.type === type) {
|
|
// Toggle OFF
|
|
await deletePostLike(user.id, postId);
|
|
newUserLike = null;
|
|
} else {
|
|
// Typ wechseln
|
|
await setPostLike(user.id, postId, type);
|
|
newUserLike = type;
|
|
}
|
|
} else {
|
|
await setPostLike(user.id, postId, type);
|
|
newUserLike = type;
|
|
|
|
if (
|
|
type === "like" &&
|
|
currentPost?.userId &&
|
|
currentPost.userId !== user.id
|
|
) {
|
|
const pr = await getProfile(user.id).catch(() => null);
|
|
const actorName = pr?.nickname ?? pr?.username ?? "Jemand";
|
|
const actorAvatar = pr?.avatar ?? undefined;
|
|
await Promise.all([
|
|
awardPoints(currentPost.userId, "upvote_received").catch(() => {}),
|
|
createNotification({
|
|
recipientId: currentPost.userId,
|
|
type: "new_like",
|
|
actorName,
|
|
actorAvatar,
|
|
postId,
|
|
}).catch(() => {}),
|
|
]);
|
|
}
|
|
}
|
|
|
|
const { likes, dislikes } = await countPostLikes(postId);
|
|
await syncPostLikeCounts(postId, likes, dislikes);
|
|
|
|
return { likesCount: likes, dislikesCount: dislikes, userLike: newUserLike };
|
|
});
|