100 lines
2.9 KiB
JavaScript
100 lines
2.9 KiB
JavaScript
|
|
/**
|
||
|
|
* 开发者画像 读写 · /brain/profiles
|
||
|
|
*/
|
||
|
|
|
||
|
|
const { Router } = require('express');
|
||
|
|
const router = Router();
|
||
|
|
|
||
|
|
// GET /brain/profiles - 列出所有开发者
|
||
|
|
router.get('/', (req, res) => {
|
||
|
|
try {
|
||
|
|
const rows = req.db.prepare('SELECT * FROM dev_profiles').all();
|
||
|
|
const parsed = rows.map(parseJsonFields);
|
||
|
|
res.json({ data: parsed, total: parsed.length });
|
||
|
|
} catch (err) {
|
||
|
|
res.status(500).json({ error: true, message: err.message });
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
// GET /brain/profiles/:dev_id - 查询单个开发者
|
||
|
|
router.get('/:dev_id', (req, res) => {
|
||
|
|
try {
|
||
|
|
const row = req.db
|
||
|
|
.prepare('SELECT * FROM dev_profiles WHERE dev_id = ?')
|
||
|
|
.get(req.params.dev_id);
|
||
|
|
if (!row) {
|
||
|
|
return res.status(404).json({ error: true, message: 'Developer not found' });
|
||
|
|
}
|
||
|
|
res.json({ data: parseJsonFields(row) });
|
||
|
|
} catch (err) {
|
||
|
|
res.status(500).json({ error: true, message: err.message });
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
// PUT /brain/profiles/:dev_id - 更新开发者画像
|
||
|
|
router.put('/:dev_id', (req, res) => {
|
||
|
|
try {
|
||
|
|
const existing = req.db
|
||
|
|
.prepare('SELECT * FROM dev_profiles WHERE dev_id = ?')
|
||
|
|
.get(req.params.dev_id);
|
||
|
|
if (!existing) {
|
||
|
|
return res.status(404).json({ error: true, message: 'Developer not found' });
|
||
|
|
}
|
||
|
|
|
||
|
|
const updatable = [
|
||
|
|
'name', 'device_os', 'current_module', 'current_broadcast',
|
||
|
|
'guide_persona', 'guide_line', 'streak', 'total_completed',
|
||
|
|
'emotion_baseline', 'last_syslog_at', 'last_active_at',
|
||
|
|
'status', 'notes'
|
||
|
|
];
|
||
|
|
const jsonUpdatable = ['capabilities', 'friction_points', 'pca_score'];
|
||
|
|
|
||
|
|
const setClauses = [];
|
||
|
|
const values = [];
|
||
|
|
|
||
|
|
for (const field of updatable) {
|
||
|
|
if (req.body[field] !== undefined) {
|
||
|
|
setClauses.push(`${field} = ?`);
|
||
|
|
values.push(req.body[field]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
for (const field of jsonUpdatable) {
|
||
|
|
if (req.body[field] !== undefined) {
|
||
|
|
setClauses.push(`${field} = ?`);
|
||
|
|
values.push(JSON.stringify(req.body[field]));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (setClauses.length === 0) {
|
||
|
|
return res.status(400).json({ error: true, message: 'No fields to update' });
|
||
|
|
}
|
||
|
|
|
||
|
|
setClauses.push('updated_at = CURRENT_TIMESTAMP');
|
||
|
|
values.push(req.params.dev_id);
|
||
|
|
|
||
|
|
req.db.prepare(
|
||
|
|
`UPDATE dev_profiles SET ${setClauses.join(', ')} WHERE dev_id = ?`
|
||
|
|
).run(...values);
|
||
|
|
|
||
|
|
const updated = req.db
|
||
|
|
.prepare('SELECT * FROM dev_profiles WHERE dev_id = ?')
|
||
|
|
.get(req.params.dev_id);
|
||
|
|
res.json({ data: parseJsonFields(updated), message: 'Profile updated' });
|
||
|
|
} catch (err) {
|
||
|
|
res.status(500).json({ error: true, message: err.message });
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
function parseJsonFields(row) {
|
||
|
|
const jsonFields = ['capabilities', 'friction_points', 'pca_score'];
|
||
|
|
const result = { ...row };
|
||
|
|
for (const field of jsonFields) {
|
||
|
|
if (result[field]) {
|
||
|
|
try { result[field] = JSON.parse(result[field]); } catch (_e) { /* keep raw */ }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = router;
|