103 lines
3.2 KiB
TypeScript
103 lines
3.2 KiB
TypeScript
import { getPostById, getPostLike } from "../../../db/community";
|
|
import { getFollowRelation } from "../../../db/social";
|
|
import { usePrisma } from "../../../utils/prisma";
|
|
|
|
/** GET /api/community/[postId] */
|
|
export default defineEventHandler(async (event) => {
|
|
const postId = getRouterParam(event, "postId");
|
|
if (!postId) throw createError({ statusCode: 400, message: "postId fehlt" });
|
|
|
|
const config = useRuntimeConfig();
|
|
const lyraBotUserId = config.lyraBotUserId || null;
|
|
const rebreakBotUserId = config.rebreakBotUserId || null;
|
|
|
|
// Auth-User optional
|
|
let currentUserId: string | null = null;
|
|
try {
|
|
const u = await requireUser(event);
|
|
currentUserId = u.id;
|
|
} catch {}
|
|
|
|
const db = usePrisma();
|
|
const [data, likeRow] = await Promise.all([
|
|
getPostById(postId),
|
|
currentUserId ? getPostLike(currentUserId, postId) : Promise.resolve(null),
|
|
]);
|
|
|
|
if (!data || data.isModerated) {
|
|
throw createError({ statusCode: 404, message: "Post nicht gefunden" });
|
|
}
|
|
|
|
const [followRow, scoreRow] = await Promise.all([
|
|
currentUserId && data.userId && currentUserId !== data.userId
|
|
? getFollowRelation(currentUserId, data.userId)
|
|
: Promise.resolve(null),
|
|
data.userId
|
|
? db.userScore.findUnique({
|
|
where: { userId: data.userId },
|
|
select: { tier: true },
|
|
})
|
|
: Promise.resolve(null),
|
|
]);
|
|
|
|
const challengeId = (data as any).challengeId ?? null;
|
|
const challengeRow = challengeId
|
|
? await db.gameChallenge.findUnique({
|
|
where: { id: challengeId },
|
|
select: {
|
|
gameType: true,
|
|
isLive: true,
|
|
opponentName: true,
|
|
status: true,
|
|
},
|
|
})
|
|
: null;
|
|
|
|
const a = data.author;
|
|
const isGameShare = data.category === "game_share";
|
|
return {
|
|
id: data.id,
|
|
category: data.category,
|
|
content: isGameShare
|
|
? data.content.split("\n").slice(1).join("\n").trim()
|
|
: data.content,
|
|
imageUrl: (data as any).imageUrl ?? null,
|
|
challengeId,
|
|
challengeStatus: (challengeRow as any)?.status ?? null,
|
|
gameName: challengeId
|
|
? (challengeRow as any)?.gameType ?? null
|
|
: isGameShare
|
|
? data.content.split("\n")[0] ?? null
|
|
: null,
|
|
opponentName: (challengeRow as any)?.opponentName ?? null,
|
|
isLive: (challengeRow as any)?.isLive ?? false,
|
|
likesCount: data.likesCount ?? 0,
|
|
dislikesCount: data.dislikesCount ?? 0,
|
|
commentsCount: data.commentsCount ?? 0,
|
|
repostsCount: (data as any).repostsCount ?? 0,
|
|
isAnonymous: data.isAnonymous,
|
|
createdAt: data.createdAt,
|
|
userLike: (likeRow?.type as "like" | "dislike") ?? null,
|
|
repostOfId: null,
|
|
repostOf: null,
|
|
author: {
|
|
id: data.userId ?? null,
|
|
username: a?.username ?? "Anonym",
|
|
nickname: a?.nickname ?? a?.username ?? "Anonym",
|
|
avatar: a?.avatar ?? null,
|
|
plan: (a as any)?.plan ?? "free",
|
|
tier: scoreRow?.tier ?? "beginner",
|
|
isFollowing: !!followRow,
|
|
},
|
|
isBot:
|
|
!!(lyraBotUserId && data.userId === lyraBotUserId) ||
|
|
!!(rebreakBotUserId && data.userId === rebreakBotUserId),
|
|
botType:
|
|
lyraBotUserId && data.userId === lyraBotUserId
|
|
? "lyra"
|
|
: rebreakBotUserId && data.userId === rebreakBotUserId
|
|
? "rebreak"
|
|
: undefined,
|
|
};
|
|
});
|