159 lines
6.2 KiB
JavaScript
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} }
|
|
];
|