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;
  }
}