Features: - Live encounter recording → HPI (outpatient/inpatient) - Voice dictation → HPI / SOAP note - Hospital course generator (prose/day-by-day/organ system/psych) - Chart review / precharting (outpatient/subspecialty/ED) - SOAP note generator (full/subjective only) - Developmental milestones (AAP/Nelson) with narrative + 3-sentence summary - AI refine & shorten for all outputs - Ask AI what's missing (clarification) - Authentication (email/password, email verification, 2FA) - Nextcloud integration with auto date folders - PWA support (installable on phone) - 18+ AI models via OpenRouter - HIPAA compliance guidance - Docker support
71 lines
2.2 KiB
JavaScript
71 lines
2.2 KiB
JavaScript
require('dotenv').config();
|
|
const express = require('express');
|
|
const cors = require('cors');
|
|
const helmet = require('helmet');
|
|
const rateLimit = require('express-rate-limit');
|
|
const cookieParser = require('cookie-parser');
|
|
const path = require('path');
|
|
const http = require('http');
|
|
|
|
const app = express();
|
|
const server = http.createServer(app);
|
|
|
|
// Security
|
|
app.use(helmet({
|
|
contentSecurityPolicy: false,
|
|
crossOriginEmbedderPolicy: false
|
|
}));
|
|
app.use(cors());
|
|
app.use(cookieParser());
|
|
app.use(express.json({ limit: '50mb' }));
|
|
|
|
// Rate limiting
|
|
const apiLimiter = rateLimit({
|
|
windowMs: 1 * 60 * 1000,
|
|
max: 60,
|
|
message: { error: 'Too many requests, slow down' }
|
|
});
|
|
app.use('/api/', apiLimiter);
|
|
|
|
// Static files (login page accessible without auth)
|
|
app.use(express.static(path.join(__dirname, 'public')));
|
|
|
|
// Routes
|
|
app.use('/api/auth', require('./src/routes/auth'));
|
|
app.use('/api', require('./src/routes/transcribe'));
|
|
app.use('/api', require('./src/routes/hpi'));
|
|
app.use('/api', require('./src/routes/hospitalCourse'));
|
|
app.use('/api', require('./src/routes/chartReview'));
|
|
app.use('/api', require('./src/routes/milestones'));
|
|
app.use('/api', require('./src/routes/soap'));
|
|
app.use('/api', require('./src/routes/tts'));
|
|
app.use('/api', require('./src/routes/nextcloud'));
|
|
app.use('/api', require('./src/routes/refine'));
|
|
// Models endpoint
|
|
const { AVAILABLE_MODELS } = require('./src/utils/models');
|
|
app.get('/api/models', (req, res) => res.json({ models: AVAILABLE_MODELS }));
|
|
|
|
// Health
|
|
app.get('/api/health', (req, res) => {
|
|
res.json({
|
|
status: 'running',
|
|
timestamp: new Date().toISOString(),
|
|
openrouter: process.env.OPENROUTER_API_KEY ? 'configured' : 'missing',
|
|
whisper: process.env.OPENAI_API_KEY ? 'configured' : 'missing'
|
|
});
|
|
});
|
|
|
|
// SPA fallback
|
|
app.get('*', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'public', 'index.html'));
|
|
});
|
|
|
|
const PORT = process.env.PORT || 3000;
|
|
server.listen(PORT, () => {
|
|
console.log('');
|
|
console.log('==========================================');
|
|
console.log('🏥 PEDIATRIC AI SCRIBE v2.0');
|
|
console.log('==========================================');
|
|
console.log(`🌐 http://localhost:${PORT}`);
|
|
console.log('==========================================');
|
|
});
|