import type { User } from "@/models/entities/user.js"; import { ChannelFollowings } from "@/models/index.js"; import type { SelectQueryBuilder } from "typeorm"; import { Brackets } from "typeorm"; export function generateChannelQuery( q: SelectQueryBuilder, me?: { id: User["id"] } | null, ) { if (me == null) { q.andWhere("note.channelId IS NULL"); } else { q.leftJoinAndSelect("note.channel", "channel"); const channelFollowingQuery = ChannelFollowings.createQueryBuilder( "channelFollowing", ) .select("channelFollowing.followeeId") .where("channelFollowing.followerId = :followerId", { followerId: me.id, }); q.andWhere( new Brackets((qb) => { qb // チャンネルのノートではない .where("note.channelId IS NULL") // または自分がフォローしているチャンネルのノート .orWhere(`note.channelId IN (${channelFollowingQuery.getQuery()})`); }), ); q.setParameters(channelFollowingQuery.getParameters()); } }