| /** | |
| * Repositorio de acceso a datos para el modelo Alert. | |
| * | |
| * Responsabilidades: | |
| * - create(data) → inserta una nueva alerta. | |
| * - findByUser(...) → alertas paginadas del usuario con datos del mercado. | |
| * - findRecent(...) → busca alerta reciente en ventana de tiempo (deduplicacion). | |
| * | |
| * Campos: | |
| * type (price_threshold|signal_change), message, sentAt. | |
| * | |
| * Todas las operaciones usan Prisma ORM. | |
| */ | |
| import { prisma } from '../utils/prisma.js'; | |
| export const alertsRepository = { | |
| create({ userId, marketId, type, message }) { | |
| return prisma.alert.create({ data: { userId, marketId, type, message } }); | |
| }, | |
| findByUser(userId, { limit = 50, offset = 0 } = {}) { | |
| return prisma.alert.findMany({ | |
| where: { userId }, | |
| orderBy: { sentAt: 'desc' }, | |
| take: limit, | |
| skip: offset, | |
| include: { market: { select: { id: true, question: true } } }, | |
| }); | |
| }, | |
| findRecent(userId, marketId, type, windowMs) { | |
| return prisma.alert.findFirst({ | |
| where: { userId, marketId, type, sentAt: { gte: new Date(Date.now() - windowMs) } }, | |
| }); | |
| }, | |
| }; | |