EventBuzz_Backend/src/services/conciergeIntentHandlers/ticketing.handler.js

51 lines
1.7 KiB
JavaScript

const EventTicket = require('../../models/EventTicket');
const { generateConciergeResponse } = require('../conciergeCall2.service');
function formatPrice(ticket) {
const minor = ticket?.basePriceMinor;
if (minor == null || Number.isNaN(Number(minor))) return null;
const major = Number(minor) / 100;
if (major === 0) return 'Free';
const currency = (ticket.currency || 'INR').toUpperCase();
return `${currency} ${major.toFixed(2)}`;
}
/**
* ticket_pricing: cards-first. Return deterministic ticket cards from the
* EventTicket collection. If there are no active tickets, fall back to Call 2
* for any policy/FAQ answer grounded in the event knowledge base.
*/
module.exports = async function ticketingHandler({ plan, bot, event, session, turnLog }) {
let tickets = [];
try {
tickets = await EventTicket.find({ event: bot.event, isActive: true })
.sort({ sortOrder: 1, name: 1 })
.lean();
} catch (err) {
console.warn('[concierge][ticketing] ticket load failed:', err?.message || err);
}
if (Array.isArray(tickets) && tickets.length) {
const cards = tickets.slice(0, 6).map((t) => ({
type: 'ticket',
data: {
ticketId: String(t._id),
name: t.name,
price: formatPrice(t),
currency: (t.currency || 'INR').toUpperCase(),
description: t.description || '',
keyPoints: Array.isArray(t.keyPoints) ? t.keyPoints.slice(0, 5) : [],
},
}));
return {
reply: `Here are the ticket options for ${event?.name || 'this event'}.`,
cards,
usedCall2: false,
};
}
const call2 = await generateConciergeResponse({ bot, event, session, plan, turnLog });
return { reply: call2.reply, usedCall2: true, usage: call2.usage, modelId: call2.modelId };
};