AudioABTestPlatform / src /services /rating-service.ts
TimLukaHorstmann
Push app
8c85576
'use server';
/**
* @fileOverview Service for saving and retrieving ratings.
*
* - saveUserInfo - Saves user information to the local database.
* - saveRating - Saves audio rating to the local database.
* - getAllRatings - Retrieves all ratings from the local database.
* - exportToCsv - Exports all ratings to a CSV file.
*/
import fs from 'fs/promises';
import path from 'path';
const DB_FILE = path.join(process.cwd(), 'audio_ratings_db.json');
interface Rating {
userId: string;
userInfo?: {
name: string;
email: string;
};
audioA: string;
audioB: string;
rating: {
audioA: string;
audioB: string;
ratingA: number;
ratingB: number;
};
}
interface DB {
users: Record<string, {
name: string;
email: string;
}>;
ratings: Rating[];
}
// Initialize database with proper structure
async function initializeDatabase(): Promise<DB> {
try {
// Check if file exists
try {
await fs.access(DB_FILE);
} catch (error) {
// File doesn't exist, create it with empty structure
const emptyDB: DB = { users: {}, ratings: [] };
await fs.writeFile(DB_FILE, JSON.stringify(emptyDB, null, 2));
return emptyDB;
}
// File exists, try to read it
const data = await fs.readFile(DB_FILE, 'utf-8');
// Handle empty file case
if (!data || data.trim() === '') {
const emptyDB: DB = { users: {}, ratings: [] };
await fs.writeFile(DB_FILE, JSON.stringify(emptyDB, null, 2));
return emptyDB;
}
// Try to parse the JSON
try {
const db = JSON.parse(data) as DB;
// Validate the structure
if (!db.users) db.users = {};
if (!db.ratings) db.ratings = [];
return db;
} catch (parseError) {
// JSON is corrupted, create a new one
console.error('Database file is corrupted, creating a new one');
const emptyDB: DB = { users: {}, ratings: [] };
await fs.writeFile(DB_FILE, JSON.stringify(emptyDB, null, 2));
return emptyDB;
}
} catch (error) {
console.error('Error initializing database:', error);
throw new Error(`Failed to initialize database: ${error instanceof Error ? error.message : String(error)}`);
}
}
export async function saveUserInfo(userId: string, userInfo: { name: string, email: string }) {
try {
const db = await initializeDatabase();
db.users[userId] = { name: userInfo.name, email: userInfo.email };
await fs.writeFile(DB_FILE, JSON.stringify(db, null, 2));
} catch (error) {
console.error('Error saving user info:', error);
throw new Error(`Failed to save user info: ${error instanceof Error ? error.message : String(error)}`);
}
}
export async function saveRating(
userId: string,
audioA: string,
audioB: string,
rating: { ratingA: number; ratingB: number }
) {
try {
const db = await initializeDatabase();
// Get user info if available
const userInfo = db.users[userId] || undefined;
const ratingEntry: Rating = {
userId,
userInfo,
audioA,
audioB,
rating: {
audioA,
audioB,
ratingA: rating.ratingA,
ratingB: rating.ratingB
}
};
db.ratings.push(ratingEntry);
await fs.writeFile(DB_FILE, JSON.stringify(db, null, 2));
} catch (error) {
console.error('Error saving rating:', error);
throw new Error(`Failed to save rating: ${error instanceof Error ? error.message : String(error)}`);
}
}
export async function getAllRatings() {
try {
const db = await initializeDatabase();
return db.ratings;
} catch (error) {
console.error('Error getting all ratings:', error);
throw new Error(`Failed to get all ratings: ${error instanceof Error ? error.message : String(error)}`);
}
}
export async function exportToCsv() {
try {
const db = await initializeDatabase();
if (db.ratings.length === 0) {
return null;
}
const headers = [
'User ID',
'User Name',
'User Email',
'Audio A',
'Audio B',
'Rating A',
'Rating B'
].join(',');
const rows = db.ratings.map(rating => {
const userName = rating.userInfo?.name || '';
const userEmail = rating.userInfo?.email || '';
return [
rating.userId,
userName,
userEmail,
rating.audioA,
rating.audioB,
rating.rating.ratingA,
rating.rating.ratingB
].join(',');
});
return [headers, ...rows].join('\n');
} catch (error) {
console.error('Error exporting to CSV:', error);
return null;
}
}