"use server"; import { artemis } from "@/lib/prisma"; import type * as Prisma from "@prisma/client"; type ChuniScorePlaylog = Prisma.PrismaClient; type ChuniStaticMusic = Prisma.PrismaClient; export async function searchSongWithTitle( userId: number, searchQuery: string = "", ) { try { const songs: ChuniScorePlaylog[] = await artemis.chuni_score_playlog.findMany({ where: { user: userId, }, orderBy: { userPlayDate: "desc", }, select: { id: true, }, }); const chuniScorePlaylogMusicId = songs .map((song) => song.musicId) .filter((id): id is number => id !== null); const staticMusicInfo: ChuniStaticMusic[] = await artemis.chuni_static_music.findMany({ where: { songId: { in: chuniScorePlaylogMusicId, }, title: { contains: searchQuery, }, }, select: { title: true, }, }); const playCounts = await artemis.chuni_score_playlog.groupBy({ by: ["musicId"], _count: { musicId: true, }, where: { user: userId, musicId: { in: chuniScorePlaylogMusicId, }, }, }); const playCountMap = playCounts.reduce( (map, item) => { if (item.musicId !== null) { map[item.musicId] = item._count.musicId; } return map; }, {} as Record, ); const songsWithTitles = songs.map((song) => { const staticInfo = staticMusicInfo.find( (chuniStaticMusic) => chuniStaticMusic.songId === song.musicId && chuniStaticMusic.chartId === song.level, ); return { ...song, title: staticInfo?.title || "Unknown Title", }; }); return songsWithTitles; } catch (error) { console.error("Error fetching songs with titles:", error); throw error; } }