import { ForbiddenException, Injectable, NotFoundException, } from '@nestjs/common'; import { PrismaService } from '../prisma/prisma.service'; import { Notification, NotificationPriority } from '../../generated/prisma'; export interface CreateNotificationInput { userId?: string; priority: NotificationPriority; message: string; relatedType?: string; relatedId?: string; } export interface NotificationFilter { userId?: string; unreadOnly?: boolean; } @Injectable() export class NotificationsService { constructor(private readonly prisma: PrismaService) {} async record(input: CreateNotificationInput): Promise { return this.prisma.notification.create({ data: { ...input } }); } async findAll(filter: NotificationFilter = {}): Promise { return this.prisma.notification.findMany({ where: { OR: filter.userId ? [{ userId: filter.userId }, { userId: null }] : undefined, read: filter.unreadOnly ? false : undefined, }, orderBy: { createdAt: 'desc' }, take: 100, }); } async markRead(id: string, actingUserId: string): Promise { const notification = await this.prisma.notification.findUnique({ where: { id }, }); if (!notification) { throw new NotFoundException('Notification not found'); } if (notification.userId !== null && notification.userId !== actingUserId) { throw new ForbiddenException("Cannot modify another user's notification"); } return this.prisma.notification.update({ where: { id }, data: { read: true }, }); } }