looda3131's picture
Clean push without any binary history
cc276cc
import { NextRequest, NextResponse } from 'next/server';
import { adminFirestore, adminMessaging } from '@/lib/firebase-admin';
export async function POST(req: NextRequest) {
console.log("[/api/call-notification] Received a POST request.");
let recipientUidForError: string | null = null;
try {
const { recipientUid, callerName, channelName, callType, callerPhoto } = await req.json();
recipientUidForError = recipientUid;
console.log("[/api/call-notification] Request body parsed:", { recipientUid, callerName, channelName, callType });
if (!recipientUid || !callerName || !channelName || !callType) {
console.log("[/api/call-notification] Missing required fields.");
return NextResponse.json({ error: 'Missing required fields' }, { status: 400 });
}
const userDoc = await adminFirestore.collection('users').doc(recipientUid).get();
if (!userDoc.exists) {
console.log(`[/api/call-notification] Recipient user not found: ${recipientUid}`);
return NextResponse.json({ error: 'Recipient user not found' }, { status: 404 });
}
const fcmToken = userDoc.data()?.fcmToken;
if (!fcmToken) {
console.log(`[/api/call-notification] Notification not sent: User ${recipientUid} does not have an FCM token.`);
return NextResponse.json({ success: true, message: 'User has no FCM token.' });
}
const message = {
token: fcmToken,
notification: {
title: `Incoming ${callType} call`,
body: `From: ${callerName}`,
},
webpush: {
notification: {
icon: callerPhoto || '/favicon.ico',
badge: '/favicon.ico',
actions: [
{ action: 'answer', title: 'Answer' },
{ action: 'decline', title: 'Decline' }
],
data: {
type: 'incoming-call',
channelName: channelName,
},
requireInteraction: "true" as const,
tag: `call-${channelName}`
}
},
};
console.log("[/api/call-notification] Prepared message payload:", message);
const response = await adminMessaging.send(message);
console.log('[/api/call-notification] Successfully sent call notification:', response);
return NextResponse.json({ success: true, messageId: response });
} catch (error: any) {
console.error('[/api/call-notification] CRITICAL ERROR:', error);
let errorMessage = 'Internal Server Error';
let statusCode = 500;
if (error.code === 'messaging/invalid-argument') {
errorMessage = 'Invalid argument provided for FCM message.';
statusCode = 400;
} else if (error.code === 'messaging/registration-token-not-registered') {
errorMessage = `The FCM token for user ${recipientUidForError} is no longer valid. It might be expired.`;
if (recipientUidForError) {
await adminFirestore.collection('users').doc(recipientUidForError).update({ fcmToken: '' });
}
statusCode = 404;
} else if (error.code === 'messaging/invalid-registration-token') {
errorMessage = `Invalid FCM registration token for user ${recipientUidForError}.`;
if (recipientUidForError) {
await adminFirestore.collection('users').doc(recipientUidForError).update({ fcmToken: '' });
}
statusCode = 400;
}
return NextResponse.json({ error: 'Failed to send notification', details: errorMessage, rawError: error.message }, { status: statusCode });
}
}