| const { EmbedConfig } = require("../../../models/embedConfig"); | |
| const { EmbedChats } = require("../../../models/embedChats"); | |
| const { validApiKey } = require("../../../utils/middleware/validApiKey"); | |
| const { reqBody } = require("../../../utils/http"); | |
| const { Workspace } = require("../../../models/workspace"); | |
| function apiEmbedEndpoints(app) { | |
| if (!app) return; | |
| app.get("/v1/embed", [validApiKey], async (request, response) => { | |
| /* | |
| #swagger.tags = ['Embed'] | |
| #swagger.description = 'List all active embeds' | |
| #swagger.responses[200] = { | |
| content: { | |
| "application/json": { | |
| schema: { | |
| type: 'object', | |
| example: { | |
| embeds: [ | |
| { | |
| "id": 1, | |
| "uuid": "embed-uuid-1", | |
| "enabled": true, | |
| "chat_mode": "query", | |
| "createdAt": "2023-04-01T12:00:00Z", | |
| "workspace": { | |
| "id": 1, | |
| "name": "Workspace 1" | |
| }, | |
| "chat_count": 10 | |
| }, | |
| { | |
| "id": 2, | |
| "uuid": "embed-uuid-2", | |
| "enabled": false, | |
| "chat_mode": "chat", | |
| "createdAt": "2023-04-02T14:30:00Z", | |
| "workspace": { | |
| "id": 1, | |
| "name": "Workspace 1" | |
| }, | |
| "chat_count": 10 | |
| } | |
| ] | |
| } | |
| } | |
| } | |
| } | |
| } | |
| #swagger.responses[403] = { | |
| schema: { | |
| "$ref": "#/definitions/InvalidAPIKey" | |
| } | |
| } | |
| */ | |
| try { | |
| const embeds = await EmbedConfig.whereWithWorkspace(); | |
| const filteredEmbeds = embeds.map((embed) => ({ | |
| id: embed.id, | |
| uuid: embed.uuid, | |
| enabled: embed.enabled, | |
| chat_mode: embed.chat_mode, | |
| createdAt: embed.createdAt, | |
| workspace: { | |
| id: embed.workspace.id, | |
| name: embed.workspace.name, | |
| }, | |
| chat_count: embed._count.embed_chats, | |
| })); | |
| response.status(200).json({ embeds: filteredEmbeds }); | |
| } catch (e) { | |
| console.error(e.message, e); | |
| response.sendStatus(500).end(); | |
| } | |
| }); | |
| app.get( | |
| "/v1/embed/:embedUuid/chats", | |
| [validApiKey], | |
| async (request, response) => { | |
| /* | |
| #swagger.tags = ['Embed'] | |
| #swagger.description = 'Get all chats for a specific embed' | |
| #swagger.parameters['embedUuid'] = { | |
| in: 'path', | |
| description: 'UUID of the embed', | |
| required: true, | |
| type: 'string' | |
| } | |
| #swagger.responses[200] = { | |
| content: { | |
| "application/json": { | |
| schema: { | |
| type: 'object', | |
| example: { | |
| chats: [ | |
| { | |
| "id": 1, | |
| "session_id": "session-uuid-1", | |
| "prompt": "Hello", | |
| "response": "Hi there!", | |
| "createdAt": "2023-04-01T12:00:00Z" | |
| }, | |
| { | |
| "id": 2, | |
| "session_id": "session-uuid-2", | |
| "prompt": "How are you?", | |
| "response": "I'm doing well, thank you!", | |
| "createdAt": "2023-04-02T14:30:00Z" | |
| } | |
| ] | |
| } | |
| } | |
| } | |
| } | |
| } | |
| #swagger.responses[403] = { | |
| schema: { | |
| "$ref": "#/definitions/InvalidAPIKey" | |
| } | |
| } | |
| #swagger.responses[404] = { | |
| description: "Embed not found", | |
| } | |
| */ | |
| try { | |
| const { embedUuid } = request.params; | |
| const chats = await EmbedChats.where({ | |
| embed_config: { uuid: String(embedUuid) }, | |
| }); | |
| response.status(200).json({ chats }); | |
| } catch (e) { | |
| console.error(e.message, e); | |
| response.sendStatus(500).end(); | |
| } | |
| } | |
| ); | |
| app.get( | |
| "/v1/embed/:embedUuid/chats/:sessionUuid", | |
| [validApiKey], | |
| async (request, response) => { | |
| /* | |
| #swagger.tags = ['Embed'] | |
| #swagger.description = 'Get chats for a specific embed and session' | |
| #swagger.parameters['embedUuid'] = { | |
| in: 'path', | |
| description: 'UUID of the embed', | |
| required: true, | |
| type: 'string' | |
| } | |
| #swagger.parameters['sessionUuid'] = { | |
| in: 'path', | |
| description: 'UUID of the session', | |
| required: true, | |
| type: 'string' | |
| } | |
| #swagger.responses[200] = { | |
| content: { | |
| "application/json": { | |
| schema: { | |
| type: 'object', | |
| example: { | |
| chats: [ | |
| { | |
| "id": 1, | |
| "prompt": "Hello", | |
| "response": "Hi there!", | |
| "createdAt": "2023-04-01T12:00:00Z" | |
| } | |
| ] | |
| } | |
| } | |
| } | |
| } | |
| } | |
| #swagger.responses[403] = { | |
| schema: { | |
| "$ref": "#/definitions/InvalidAPIKey" | |
| } | |
| } | |
| #swagger.responses[404] = { | |
| description: "Embed or session not found", | |
| } | |
| */ | |
| try { | |
| const { embedUuid, sessionUuid } = request.params; | |
| const chats = await EmbedChats.where({ | |
| embed_config: { uuid: String(embedUuid) }, | |
| session_id: String(sessionUuid), | |
| }); | |
| response.status(200).json({ chats }); | |
| } catch (e) { | |
| console.error(e.message, e); | |
| response.sendStatus(500).end(); | |
| } | |
| } | |
| ); | |
| app.post("/v1/embed/new", [validApiKey], async (request, response) => { | |
| /* | |
| #swagger.tags = ['Embed'] | |
| #swagger.description = 'Create a new embed configuration' | |
| #swagger.requestBody = { | |
| description: 'JSON object containing embed configuration details', | |
| required: true, | |
| content: { | |
| "application/json": { | |
| schema: { | |
| type: 'object', | |
| example: { | |
| "workspace_slug": "workspace-slug-1", | |
| "chat_mode": "chat", | |
| "allowlist_domains": ["example.com"], | |
| "allow_model_override": false, | |
| "allow_temperature_override": false, | |
| "allow_prompt_override": false, | |
| "max_chats_per_day": 100, | |
| "max_chats_per_session": 10 | |
| } | |
| } | |
| } | |
| } | |
| } | |
| #swagger.responses[200] = { | |
| content: { | |
| "application/json": { | |
| schema: { | |
| type: 'object', | |
| example: { | |
| "embed": { | |
| "id": 1, | |
| "uuid": "embed-uuid-1", | |
| "enabled": true, | |
| "chat_mode": "chat", | |
| "allowlist_domains": ["example.com"], | |
| "allow_model_override": false, | |
| "allow_temperature_override": false, | |
| "allow_prompt_override": false, | |
| "max_chats_per_day": 100, | |
| "max_chats_per_session": 10, | |
| "createdAt": "2023-04-01T12:00:00Z", | |
| "workspace_slug": "workspace-slug-1" | |
| }, | |
| "error": null | |
| } | |
| } | |
| } | |
| } | |
| } | |
| #swagger.responses[403] = { | |
| schema: { | |
| "$ref": "#/definitions/InvalidAPIKey" | |
| } | |
| } | |
| #swagger.responses[404] = { | |
| description: "Workspace not found" | |
| } | |
| */ | |
| try { | |
| const data = reqBody(request); | |
| if (!data.workspace_slug) | |
| return response | |
| .status(400) | |
| .json({ error: "Workspace slug is required" }); | |
| const workspace = await Workspace.get({ | |
| slug: String(data.workspace_slug), | |
| }); | |
| if (!workspace) | |
| return response.status(404).json({ error: "Workspace not found" }); | |
| const { embed, message: error } = await EmbedConfig.new({ | |
| ...data, | |
| workspace_id: workspace.id, | |
| }); | |
| response.status(200).json({ embed, error }); | |
| } catch (e) { | |
| console.error(e.message, e); | |
| response.sendStatus(500).end(); | |
| } | |
| }); | |
| app.post("/v1/embed/:embedUuid", [validApiKey], async (request, response) => { | |
| /* | |
| #swagger.tags = ['Embed'] | |
| #swagger.description = 'Update an existing embed configuration' | |
| #swagger.parameters['embedUuid'] = { | |
| in: 'path', | |
| description: 'UUID of the embed to update', | |
| required: true, | |
| type: 'string' | |
| } | |
| #swagger.requestBody = { | |
| description: 'JSON object containing embed configuration updates', | |
| required: true, | |
| content: { | |
| "application/json": { | |
| schema: { | |
| type: 'object', | |
| example: { | |
| "enabled": true, | |
| "chat_mode": "chat", | |
| "allowlist_domains": ["example.com"], | |
| "allow_model_override": false, | |
| "allow_temperature_override": false, | |
| "allow_prompt_override": false, | |
| "max_chats_per_day": 100, | |
| "max_chats_per_session": 10 | |
| } | |
| } | |
| } | |
| } | |
| } | |
| #swagger.responses[200] = { | |
| content: { | |
| "application/json": { | |
| schema: { | |
| type: 'object', | |
| example: { | |
| "success": true, | |
| "error": null | |
| } | |
| } | |
| } | |
| } | |
| } | |
| #swagger.responses[403] = { | |
| schema: { | |
| "$ref": "#/definitions/InvalidAPIKey" | |
| } | |
| } | |
| #swagger.responses[404] = { | |
| description: "Embed not found" | |
| } | |
| */ | |
| try { | |
| const { embedUuid } = request.params; | |
| const data = reqBody(request); | |
| const embed = await EmbedConfig.get({ uuid: String(embedUuid) }); | |
| if (!embed) { | |
| return response.status(404).json({ error: "Embed not found" }); | |
| } | |
| const { success, error } = await EmbedConfig.update(embed.id, data); | |
| response.status(200).json({ success, error }); | |
| } catch (e) { | |
| console.error(e.message, e); | |
| response.sendStatus(500).end(); | |
| } | |
| }); | |
| app.delete( | |
| "/v1/embed/:embedUuid", | |
| [validApiKey], | |
| async (request, response) => { | |
| /* | |
| #swagger.tags = ['Embed'] | |
| #swagger.description = 'Delete an existing embed configuration' | |
| #swagger.parameters['embedUuid'] = { | |
| in: 'path', | |
| description: 'UUID of the embed to delete', | |
| required: true, | |
| type: 'string' | |
| } | |
| #swagger.responses[200] = { | |
| content: { | |
| "application/json": { | |
| schema: { | |
| type: 'object', | |
| example: { | |
| "success": true, | |
| "error": null | |
| } | |
| } | |
| } | |
| } | |
| } | |
| #swagger.responses[403] = { | |
| schema: { | |
| "$ref": "#/definitions/InvalidAPIKey" | |
| } | |
| } | |
| #swagger.responses[404] = { | |
| description: "Embed not found" | |
| } | |
| */ | |
| try { | |
| const { embedUuid } = request.params; | |
| const embed = await EmbedConfig.get({ uuid: String(embedUuid) }); | |
| if (!embed) | |
| return response.status(404).json({ error: "Embed not found" }); | |
| const success = await EmbedConfig.delete({ id: embed.id }); | |
| response | |
| .status(200) | |
| .json({ success, error: success ? null : "Failed to delete embed" }); | |
| } catch (e) { | |
| console.error(e.message, e); | |
| response.sendStatus(500).end(); | |
| } | |
| } | |
| ); | |
| } | |
| module.exports = { apiEmbedEndpoints }; | |