'use server'; const GOTIFY_URL = process.env.GOTIFY_URL; const GOTIFY_APP_TOKEN = process.env.GOTIFY_APP_TOKEN; export async function sendGotifyNotification(attempts: number, status: 'won' | 'lost', puzzleId: number, genre?: string | null) { try { const genreText = genre ? `[${genre}] ` : ''; const title = `Hördle ${genreText}#${puzzleId} ${status === 'won' ? 'Solved!' : 'Failed'}`; const message = status === 'won' ? `Puzzle #${puzzleId} ${genre ? `(${genre}) ` : ''}was solved in ${attempts} attempt(s).` : `Puzzle #${puzzleId} ${genre ? `(${genre}) ` : ''}was failed after ${attempts} attempt(s).`; const response = await fetch(`${GOTIFY_URL}/message?token=${GOTIFY_APP_TOKEN}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ title: title, message: message, priority: 5, }), }); if (!response.ok) { console.error('Failed to send Gotify notification:', await response.text()); } } catch (error) { console.error('Error sending Gotify notification:', error); } } import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); export async function submitRating(songId: number, rating: number, genre?: string | null) { try { const song = await prisma.song.findUnique({ where: { id: songId } }); if (!song) throw new Error('Song not found'); const newRatingCount = song.ratingCount + 1; const newAverageRating = ((song.averageRating * song.ratingCount) + rating) / newRatingCount; await prisma.song.update({ where: { id: songId }, data: { averageRating: newAverageRating, ratingCount: newRatingCount, }, }); // Send Gotify notification for the rating const genreText = genre ? `[${genre}] ` : ''; const title = `Hördle Rating: ${rating} Stars`; const message = `Song "${song.title}" by ${song.artist} ${genreText}received a ${rating}-star rating. (Avg: ${newAverageRating.toFixed(2)}, Count: ${newRatingCount})`; await fetch(`${GOTIFY_URL}/message?token=${GOTIFY_APP_TOKEN}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ title: title, message: message, priority: 5, }), }); return { success: true, averageRating: newAverageRating }; } catch (error) { console.error('Error submitting rating:', error); return { success: false, error: 'Failed to submit rating' }; } }