import { Op } from "sequelize"; import { Ask, Emoji, EmojiReaction, Media, Post, PostTag, User, UserLikesPostRelations, } from "../../models/index.js"; import { redisCache } from "../redis.js"; import { Privacy } from "../../models/post.js"; async function getPostAndUserFromPostId( postId: string ): Promise<{ found: boolean; data?: any }> { const cacheResult = undefined; // await redisCache.get("postAndUser:" + postId); let res: { found: boolean; data?: any } = cacheResult ? JSON.parse(cacheResult) : { found: false }; if (!cacheResult) { const dbQuery = await Post.findOne({ include: [ { model: Ask, }, { model: User, as: "user", required: true, where: { banned: false, }, }, { model: Post, include: [ { model: User, as: "user", }, ], as: "quoted", where: { isDeleted: false, }, required: false, }, { model: Post, as: "parent", required: false, where: { isDeleted: false, }, include: [ { model: Media, required: false, }, { model: PostTag, required: false, }, ], }, { model: User, as: "mentionPost", required: false, }, { model: Media, required: false, }, { model: PostTag, required: false, }, { model: Emoji, required: false, }, ], where: { id: postId, isDeleted: false, privacy: { [Op.notIn]: [Privacy.LocalOnly], }, }, }); if (dbQuery) { // check if its a bsky post because we dont enjoy bsky posts going to fedi! const parents = await dbQuery.getAncestors({ include: [ { model: User, as: "user", }, ], }); const isBskyPost = parents.some((elem) => elem.isRemoteBlueskyPost); if (isBskyPost) { res = { found: false }; return res; } let likes = UserLikesPostRelations.findAll({ where: { postId: postId, }, }); let shares = Post.findAll({ where: { parentId: postId, isReblog: true, }, }); let reacts = EmojiReaction.findAll({ where: { postId: postId, }, }); Promise.all([likes, shares, reacts]); res = { found: true, data: dbQuery.dataValues }; if (res.data.ask) { const userAsker = await User.findByPk(res.data.ask.userAsker); res.data.ask.asker = userAsker; } res.data.shares = await shares; res.data.likes = await likes; res.data.reacts = await reacts; } else { res = { found: false }; } if (res.found) { await redisCache.set( "postAndUser:" + postId, JSON.stringify(res), "EX", 300 ); } else { // await redisCache.set('postAndUser:' + postId, JSON.stringify(res), 'EX', 60) } } return res; } export { getPostAndUserFromPostId };