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} } ];