add backend/src/services/notificationService.ts

This commit is contained in:
Giuseppe Lombardo 2026-08-12 16:35:02 +00:00
parent 1f6f9d5842
commit d6f1bc781a

View File

@ -0,0 +1,54 @@
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
const ONESIGNAL_APP_ID = process.env.ONESIGNAL_APP_ID!;
const ONESIGNAL_API_KEY = process.env.ONESIGNAL_API_KEY!;
interface PushInput {
userId: string;
type: string;
title: string;
body: string;
payload?: Record<string, unknown>;
}
/**
* Sendet eine Push-Notification via OneSignal und protokolliert sie in der
* `notifications`-Tabelle (Audit-Trail + In-App-Benachrichtigungszentrum).
*/
export async function sendPushNotification(input: PushInput): Promise<void> {
const user = await prisma.user.findUnique({ where: { id: input.userId } });
await prisma.notification.create({
data: {
userId: input.userId,
type: input.type,
title: input.title,
body: input.body,
payload: input.payload as any,
},
});
if (!user?.pushToken) return; // kein registriertes Gerät -> nur In-App geloggt
try {
await fetch('https://onesignal.com/api/v1/notifications', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Basic ${ONESIGNAL_API_KEY}`,
},
body: JSON.stringify({
app_id: ONESIGNAL_APP_ID,
include_player_ids: [user.pushToken],
headings: { en: input.title, de: input.title },
contents: { en: input.body, de: input.body },
data: { type: input.type, ...input.payload },
}),
});
} catch (err) {
// Push-Fehler dürfen den Business-Flow (z.B. Zahlungsabgleich) nicht blockieren.
console.error('[notificationService] OneSignal-Versand fehlgeschlagen:', err);
}
}