145 lines
5.3 KiB
JavaScript
145 lines
5.3 KiB
JavaScript
const express = require('express');
|
|
const db = require('../db');
|
|
const router = express.Router();
|
|
|
|
router.put('/profile', (req, res) => {
|
|
const { displayName } = req.body;
|
|
if (!displayName) return res.status(400).json({ error: 'displayName is required' });
|
|
|
|
try {
|
|
db.prepare("UPDATE users SET display_name = ? WHERE uid = ?").run(displayName, req.uid);
|
|
res.json({ message: 'Profile updated successfully' });
|
|
} catch (error) {
|
|
console.error('Failed to update profile:', error);
|
|
res.status(500).json({ error: 'Failed to update profile' });
|
|
}
|
|
});
|
|
|
|
router.get('/profile', (req, res) => {
|
|
try {
|
|
const user = db.prepare('SELECT uid, display_name, email FROM users WHERE uid = ?').get(req.uid);
|
|
if (!user) return res.status(404).json({ error: 'User not found' });
|
|
res.json(user);
|
|
} catch (error) {
|
|
console.error('Failed to get profile:', error);
|
|
res.status(500).json({ error: 'Failed to get profile' });
|
|
}
|
|
});
|
|
|
|
router.post('/find-or-create', (req, res) => {
|
|
const { uid, displayName, email } = req.body;
|
|
if (!uid || !displayName || !email) {
|
|
return res.status(400).json({ error: 'uid, displayName, and email are required' });
|
|
}
|
|
|
|
try {
|
|
const now = Math.floor(Date.now() / 1000);
|
|
db.prepare(
|
|
`INSERT INTO users (uid, display_name, email, created_at)
|
|
VALUES (?, ?, ?, ?)
|
|
ON CONFLICT(uid) DO NOTHING`
|
|
).run(uid, displayName, email, now);
|
|
|
|
const user = db.prepare('SELECT * FROM users WHERE uid = ?').get(uid);
|
|
res.status(200).json(user);
|
|
|
|
} catch (error) {
|
|
console.error('Failed to find or create user:', error);
|
|
res.status(500).json({ error: 'Failed to find or create user' });
|
|
}
|
|
});
|
|
|
|
router.post('/api-key', (req, res) => {
|
|
const { apiKey } = req.body;
|
|
if (typeof apiKey !== 'string') {
|
|
return res.status(400).json({ error: 'API key must be a string' });
|
|
}
|
|
|
|
try {
|
|
db.prepare("UPDATE users SET api_key = ? WHERE uid = ?").run(apiKey, req.uid);
|
|
res.json({ message: 'API key saved successfully' });
|
|
} catch (error) {
|
|
console.error('Failed to save API key:', error);
|
|
res.status(500).json({ error: 'Failed to save API key' });
|
|
}
|
|
});
|
|
|
|
router.get('/api-key-status', (req, res) => {
|
|
try {
|
|
const row = db.prepare('SELECT api_key FROM users WHERE uid = ?').get(req.uid);
|
|
if (!row) {
|
|
return res.status(404).json({ error: 'User not found' });
|
|
}
|
|
res.json({ hasApiKey: !!row.api_key && row.api_key.length > 0 });
|
|
} catch (error) {
|
|
console.error('Failed to get API key status:', error);
|
|
res.status(500).json({ error: 'Failed to get API key status' });
|
|
}
|
|
});
|
|
|
|
router.delete('/profile', (req, res) => {
|
|
try {
|
|
const user = db.prepare('SELECT uid FROM users WHERE uid = ?').get(req.uid);
|
|
if (!user) {
|
|
return res.status(404).json({ error: 'User not found' });
|
|
}
|
|
|
|
const userSessions = db.prepare('SELECT id FROM sessions WHERE uid = ?').all(user.uid);
|
|
const sessionIds = userSessions.map(s => s.id);
|
|
|
|
db.transaction(() => {
|
|
if (sessionIds.length > 0) {
|
|
const placeholders = sessionIds.map(() => '?').join(',');
|
|
db.prepare(`DELETE FROM transcripts WHERE session_id IN (${placeholders})`).run(...sessionIds);
|
|
db.prepare(`DELETE FROM ai_messages WHERE session_id IN (${placeholders})`).run(...sessionIds);
|
|
db.prepare(`DELETE FROM summaries WHERE session_id IN (${placeholders})`).run(...sessionIds);
|
|
db.prepare(`DELETE FROM sessions WHERE uid = ?`).run(user.uid);
|
|
}
|
|
db.prepare('DELETE FROM prompt_presets WHERE uid = ?').run(user.uid);
|
|
db.prepare('DELETE FROM users WHERE uid = ?').run(user.uid);
|
|
})();
|
|
|
|
res.status(200).json({ message: 'User account and all data deleted successfully.' });
|
|
|
|
} catch (error) {
|
|
console.error('Failed to delete user account:', error);
|
|
res.status(500).json({ error: 'Failed to delete user account' });
|
|
}
|
|
});
|
|
|
|
async function getUserBatchData(req, res) {
|
|
const { include = 'profile,presets,sessions' } = req.query;
|
|
|
|
try {
|
|
const includes = include.split(',').map(item => item.trim());
|
|
const result = {};
|
|
|
|
if (includes.includes('profile')) {
|
|
const user = db.prepare('SELECT uid, display_name, email FROM users WHERE uid = ?').get(req.uid);
|
|
result.profile = user || null;
|
|
}
|
|
|
|
if (includes.includes('presets')) {
|
|
const presets = db.prepare('SELECT * FROM prompt_presets WHERE uid = ? OR is_default = 1').all(req.uid);
|
|
result.presets = presets || [];
|
|
}
|
|
|
|
if (includes.includes('sessions')) {
|
|
const recent_sessions = db.prepare(
|
|
"SELECT id, title, started_at, updated_at FROM sessions WHERE uid = ? ORDER BY updated_at DESC LIMIT 10"
|
|
).all(req.uid);
|
|
result.sessions = recent_sessions || [];
|
|
}
|
|
|
|
res.json(result);
|
|
|
|
} catch (error) {
|
|
console.error('Failed to get batch data:', error);
|
|
res.status(500).json({ error: 'Failed to get batch data' });
|
|
}
|
|
}
|
|
|
|
router.get('/batch', getUserBatchData);
|
|
|
|
module.exports = router;
|