anything-llm/server/models/externalCommunicationConnec...

111 lines
3.1 KiB
JavaScript

const prisma = require("../utils/prisma");
const { safeJsonParse } = require("../utils/http");
const ExternalCommunicationConnector = {
supportedTypes: ["telegram"],
/**
* Get a connector by type.
* @param {'telegram'} type
* @returns {Promise<{id: number, type: string, config: object, active: boolean}|null>}
*/
get: async function (type) {
try {
const connector =
await prisma.external_communication_connectors.findUnique({
where: { type },
});
if (!connector) return null;
return {
...connector,
config: safeJsonParse(connector.config, {}),
};
} catch (error) {
console.error("ExternalCommunicationConnector.get", error.message);
return null;
}
},
/**
* Create or update a connector's config and active state.
* @param {'telegram'} type
* @param {object} config
* @param {boolean} active
* @returns {Promise<{connector: object|null, error: string|null}>}
*/
upsert: async function (type, config = {}) {
if (!this.supportedTypes.includes(type))
return { connector: null, error: `Unsupported connector type: ${type}` };
try {
let update = {},
create = {};
if (config.hasOwnProperty("active")) {
update.active = Boolean(config.active);
create.active = Boolean(config.active);
delete config.active;
}
update = Object.assign(update, {
config: JSON.stringify(config),
lastUpdatedAt: new Date(),
});
create = Object.assign(create, {
config: JSON.stringify(config),
type: String(type),
});
const connector = await prisma.external_communication_connectors.upsert({
where: { type: String(type) },
update,
create,
});
return {
connector: {
...connector,
config: safeJsonParse(connector.config, {}),
},
error: null,
};
} catch (error) {
console.error("ExternalCommunicationConnector.upsert", error.message);
return { connector: null, error: error.message };
}
},
/**
* Merge partial config updates into an existing connector.
* @param {'telegram'} type
* @param {object} configUpdates - Partial config to merge.
* @returns {Promise<{connector: object|null, error: string|null}>}
*/
updateConfig: async function (type, configUpdates = {}) {
const existing = await this.get(type);
if (!existing)
return { connector: null, error: `No ${type} connector found` };
const mergedConfig = { ...existing.config, ...configUpdates };
return this.upsert(type, mergedConfig, existing.active);
},
/**
* Delete a connector entirely.
* @param {'telegram'} type
* @returns {Promise<boolean>}
*/
delete: async function (type) {
try {
await prisma.external_communication_connectors.delete({
where: { type },
});
return true;
} catch (error) {
console.error("ExternalCommunicationConnector.delete", error.message);
return false;
}
},
};
module.exports = { ExternalCommunicationConnector };