pediatric-ai-scribe-v3/src/routes/soap.js
Daniel 74c5cde8e1 Stop leaking e.message to clients across all routes
88 occurrences of res.status(500).json({ error: e.message }) (or
err.message) swept to generic 'Request failed'. Server-side
console.error / logger.error calls are untouched, so the full detail
still lands in logs and Grafana.

Covers: admin, adminConfig, adminMilestones, chartReview, documents,
encounters, hospitalCourse, hpi, learningAdmin, learningAI, learningHub,
logs, memories, milestones, oidc, refine, sessions, sickVisit, soap,
userPreferences, wellVisit.

Also extends .gitignore to exclude .env.backup-* files.
2026-04-14 03:04:24 +02:00

39 lines
1.5 KiB
JavaScript

const express = require('express');
const router = express.Router();
const { callAI } = require('../utils/ai');
const PROMPTS = require('../utils/prompts');
const { authMiddleware } = require('../middleware/auth');
var logger = require('../utils/logger');
router.post('/generate-soap', authMiddleware, async (req, res) => {
try {
const { transcript, patientAge, patientGender, model, type, additionalInstructions, physicianMemories } = req.body;
if (!transcript || !transcript.trim()) return res.status(400).json({ error: 'Empty input' });
let prompt;
switch (type) {
case 'subjective': prompt = PROMPTS.soapSubjective; break;
case 'full':
default: prompt = PROMPTS.soapFull;
}
if (additionalInstructions) {
prompt += `\n\nADDITIONAL INSTRUCTIONS:\n${additionalInstructions}`;
}
var context = `Patient: ${patientAge || 'Unknown'}, ${patientGender || 'Unknown'}\n\nINPUT:\n${transcript}`;
if (physicianMemories) context += '\n\n[STYLE HINTS (low priority — only apply if relevant to the current note, never copy content from these examples)]\n' + physicianMemories + '\n[END STYLE HINTS]';
const result = await callAI([
{ role: 'system', content: prompt },
{ role: 'user', content: context }
], { model });
res.json({ success: true, soap: result.content, model: result.model });
logger.audit(req.user.id, 'generate_soap', 'Generated SOAP note', req, { category: 'clinical' });
} catch (err) {
res.status(500).json({ error: 'Request failed' });
}
});
module.exports = router;