← Назад'use strict';
const prisma = require('./db');
const logger = require('../utils/logger');
// Log all signals from a slow update cycle to SignalLog table.
// Only logs NEW signals (dedup by signalId, won't re-log the same signal within 6h).
const DEDUP_HOURS = 6;
async function logSignals(signals, spotPrices) {
if (!signals || signals.length === 0) return;
let logged = 0;
for (const sig of signals) {
if (!sig.id || !sig.underlying) continue;
const spot = spotPrices[sig.underlying] || 0;
if (spot === 0) continue;
try {
// Check if already logged recently (within DEDUP_HOURS)
const cutoff = new Date(Date.now() - DEDUP_HOURS * 60 * 60 * 1000);
// Dedup: check for same strategy+underlying+direction within DEDUP_HOURS
// Use stable key (not signalId which had timestamp suffix bug)
const dedupKey = `${sig.strategy || 'Unknown'}:${sig.underlying}`;
const existing = await prisma.signalLog.findFirst({
where: {
strategy: sig.strategy || 'Unknown',
underlying: sig.underlying,
createdAt: { gte: cutoff },
},
orderBy: { createdAt: 'desc' },
});
if (existing) continue;
// Unique signalId: stable id + timestamp (for DB uniqueness constraint)
const uniqueId = `${sig.id}_${Date.now()}`;
// Infer direction from strategy/signal if not explicit
let direction = sig.direction || 'NEUTRAL';
if (direction === 'NEUTRAL') {
const s = (sig.signal || '').toUpperCase();
const st = (sig.strategy || '').toUpperCase();
if (s.includes('CALL') || s.includes('BULL') || st.includes('CALL')) direction = 'BULLISH';
else if (s.includes('PUT') || s.includes('BEAR') || st.includes('PUT')) direction = 'BEARISH';
}
await prisma.signalLog.create({
data: {
signalId: uniqueId,
strategy: sig.strategy || 'Unknown',
underlying: sig.underlying,
direction,
confidence: sig.confidence || 0,
severity: sig.severity || 'LOW',
spotAtSignal: spot,
parameters: JSON.stringify(sig.parameters || {}),
description: sig.description || sig.rationale || '',
},
});
logged++;
} catch (err) {
// Unique constraint — already exists, skip
if (err.code === 'P2002') continue;
logger.error(`signalLogger: error logging ${sig.id}: ${err.message}`);
}
}
if (logged > 0) {
logger.info(`signalLogger: logged ${logged} new signals`);
}
}
module.exports = { logSignals };