EventBuzz_Backend/src/routes/conciergeBot.routes.js

159 lines
6.2 KiB
JavaScript

const Joi = require('joi');
const controller = require('../controllers/conciergeBot.controller');
const greetingSchema = Joi.object({
enabled: Joi.boolean(),
message: Joi.string().allow(''),
});
const registrationSchema = Joi.object({
promptIfUnregistered: Joi.boolean(),
allowGuestSkip: Joi.boolean(),
});
const knowledgeSchema = Joi.object({
includeEventDetails: Joi.boolean(),
includeFoodRecommendations: Joi.boolean(),
includePlacesRecommendations: Joi.boolean(),
});
const faqItemSchema = Joi.object({
key: Joi.string().trim().allow(''),
category: Joi.string()
.valid(
'venue_map',
'venue_wayfinding',
'venue_amenity',
'venue_transport',
'venue_parking',
'venue_parking_transport',
'venue_food',
'venue_accessibility',
'wifi',
'app_account',
'checkin_venue',
'emergency_contact',
'ticket_checkin',
'session_recordings',
'registration_update',
'checkin_timing',
'dress_code',
'refund_policy',
)
.required(),
question: Joi.string().trim().min(1).required(),
answerFormat: Joi.string().valid(
'mcq',
'short_text',
'mcq_short_text',
'mcq_multi',
'contact_details',
'media_upload',
),
options: Joi.array().items(Joi.string().allow('')),
answer: Joi.string().allow('').default(''),
answerDetail: Joi.string().allow('').default(''),
contactEmail: Joi.string().allow('').default(''),
contactPhone: Joi.string().allow('').default(''),
mediaUrl: Joi.string().allow('').default(''),
mediaName: Joi.string().allow('').default(''),
mediaType: Joi.string().valid('image', 'pdf', '').allow('').default(''),
selectedOptions: Joi.array().items(Joi.string().allow('')),
});
const accentColorSchema = Joi.string()
.trim()
.max(64)
.pattern(/^(#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})|rgba?\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}(?:\s*,\s*[\d.]+\s*)?\))$/)
.allow('', null);
const createPayload = Joi.object({
eventId: Joi.string().required(),
name: Joi.string().allow(''),
wabaPhoneNumberId: Joi.string().required(),
accentColor: accentColorSchema,
greeting: greetingSchema,
registration: registrationSchema,
knowledge: knowledgeSchema,
faqs: Joi.array().items(faqItemSchema),
enabled: Joi.boolean(),
});
const receptionDripSchema = Joi.object({
trigger: Joi.string().valid('after_first_inbound', 'after_match', 'absolute'),
delayMinutes: Joi.number().min(0).allow(null),
sendAt: Joi.date().iso().allow(null, ''),
body: Joi.string().allow(''),
mediaType: Joi.string().valid('none', 'image', 'video'),
mediaUrl: Joi.string().allow(''),
templateId: Joi.string().allow('', null),
});
const receptionSchema = Joi.object({
enabled: Joi.boolean(),
prefillText: Joi.string().allow(''),
welcomeMessage: Joi.string().allow(''),
unmatchedBadgePrompt: Joi.string().allow(''),
staffHandoffMessage: Joi.string().allow(''),
dripAudience: Joi.string().valid('matched', 'all_inbound'),
drips: Joi.array().items(receptionDripSchema),
});
const updatePayload = Joi.object({
name: Joi.string().allow(''),
wabaPhoneNumberId: Joi.string(),
eventId: Joi.string(),
accentColor: accentColorSchema,
greeting: greetingSchema,
registration: registrationSchema,
knowledge: knowledgeSchema,
faqs: Joi.array().items(faqItemSchema),
enabled: Joi.boolean(),
reception: receptionSchema,
}).min(1);
const sourcePayload = Joi.object({
type: Joi.string().valid('url', 'pdf').required(),
sourcePath: Joi.string().required(),
displayName: Joi.string().required(),
crawlScope: Joi.string().valid('auto', 'domain', 'path'),
});
module.exports = [
{
method: 'GET',
path: '/api/concierge-bots',
options: {
validate: { query: Joi.object({ organization: Joi.string() }) },
handler: controller.list,
},
},
{ method: 'POST', path: '/api/concierge-bots', options: { validate: { payload: createPayload }, handler: controller.create } },
{ method: 'GET', path: '/api/concierge-bots/{botId}', options: { handler: controller.get } },
{
method: 'GET',
path: '/api/concierge-bots/{botId}/reception',
options: { handler: controller.getReception },
},
{
method: 'GET',
path: '/api/concierge-bots/{botId}/reception-qr.png',
options: { handler: controller.getReceptionQrPng },
},
{ method: 'PUT', path: '/api/concierge-bots/{botId}', options: { validate: { payload: updatePayload }, handler: controller.update } },
{ method: 'DELETE', path: '/api/concierge-bots/{botId}', options: { handler: controller.remove } },
{ method: 'GET', path: '/api/events/{eventId}/concierge-bot', options: { handler: controller.getByEvent } },
{ method: 'GET', path: '/api/concierge-bots/{botId}/sources', options: { handler: controller.listSources } },
{ method: 'POST', path: '/api/concierge-bots/{botId}/sources', options: { validate: { payload: sourcePayload }, handler: controller.createSource } },
{ method: 'DELETE', path: '/api/concierge-bots/{botId}/sources/{sourceId}', options: { handler: controller.deleteSource } },
{ method: 'POST', path: '/api/concierge-bots/{botId}/sources/{sourceId}/sync', options: { handler: controller.syncSource } },
{ method: 'GET', path: '/api/concierge-bots/{botId}/sources/{sourceId}/chunks', options: { validate: { query: Joi.object({ staging: Joi.string() }) }, handler: controller.listChunks } },
{ method: 'PATCH', path: '/api/concierge-bots/{botId}/chunks/{chunkId}', options: { validate: { payload: Joi.object({ rawText: Joi.string().required() }) }, handler: controller.patchChunk } },
{ method: 'DELETE', path: '/api/concierge-bots/{botId}/chunks/{chunkId}', options: { handler: controller.deleteChunk } },
{ method: 'POST', path: '/api/concierge-bots/{botId}/sources/{sourceId}/approve', options: { handler: controller.approveSource } },
{ method: 'POST', path: '/api/concierge-bots/{botId}/knowledge/clear', options: { handler: controller.clearKnowledge } },
{ method: 'POST', path: '/api/concierge-bots/{botId}/knowledge/sync-event', options: { handler: controller.syncEventKnowledge } },
{ method: "POST", path: "/api/concierge-bots/{botId}/knowledge/food-sync", options: { handler: controller.syncFoodKnowledge} },
{ method: "POST", path: "/api/concierge-bots/{botId}/knowledge/places-sync", options: { handler: controller.syncPlacesKnowledge} }
];