Spaces:
Running
Running
File size: 4,646 Bytes
8c85576 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
'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;
}
}
|