import { NextResponse } from 'next/server'; import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); export async function GET() { try { const today = new Date().toISOString().split('T')[0]; let dailyPuzzle = await prisma.dailyPuzzle.findUnique({ where: { date: today }, include: { song: true }, }); if (!dailyPuzzle) { // Find a random song to set as today's puzzle const songsCount = await prisma.song.count(); if (songsCount === 0) { return NextResponse.json({ error: 'No songs available' }, { status: 404 }); } const skip = Math.floor(Math.random() * songsCount); const randomSong = await prisma.song.findFirst({ skip: skip, }); if (randomSong) { dailyPuzzle = await prisma.dailyPuzzle.create({ data: { date: today, songId: randomSong.id, }, include: { song: true }, }); } } if (!dailyPuzzle) { return NextResponse.json({ error: 'Failed to create puzzle' }, { status: 500 }); } // Return only necessary info to client (hide title/artist initially if we want strict security, // but for this app we might need it for validation or just return the audio URL and ID) // Actually, we should probably NOT return the title/artist here if we want to prevent cheating via network tab, // but the requirement says "guess the title", so we need to validate on server or client. // For simplicity in this prototype, we'll return the ID and audio URL. // Validation can happen in a separate "guess" endpoint or client-side if we trust the user not to inspect too much. // Let's return the audio URL. The client will request the full song info ONLY when they give up or guess correctly? // Or we can just return the ID and have a separate "check" endpoint. // For now, let's return the ID and the filename (public URL). return NextResponse.json({ id: dailyPuzzle.id, audioUrl: `/uploads/${dailyPuzzle.song.filename}`, // We might need a hash or something to validate guesses without revealing the answer, // but for now let's keep it simple. The client needs to know if the guess is correct. // We can send the answer hash? Or just handle checking on the client for now (easiest but insecure). // Let's send the answer for now, assuming this is a fun app not a competitive e-sport. // Wait, if I send the answer, it's too easy to cheat. // Better: The client sends a guess, the server validates. // But the requirements didn't specify a complex backend validation. // Let's stick to: Client gets audio. Client has a list of all songs (for autocomplete). // Client checks if selected song ID matches the daily puzzle song ID. // So we need to return the song ID. songId: dailyPuzzle.songId }); } catch (error) { console.error('Error fetching daily puzzle:', error); return NextResponse.json({ error: 'Internal Server Error' }, { status: 500 }); } }