anything-llm/server/endpoints/communityHub.js

187 lines
5.6 KiB
JavaScript
Raw Normal View History

const { SystemSettings } = require("../models/systemSettings");
const { validatedRequest } = require("../utils/middleware/validatedRequest");
const { reqBody } = require("../utils/http");
const { CommunityHub } = require("../models/communityHub");
const {
communityHubDownloadsEnabled,
communityHubItem,
} = require("../utils/middleware/communityHubDownloadsEnabled");
const { EventLogs } = require("../models/eventLogs");
const { Telemetry } = require("../models/telemetry");
const {
flexUserRoleValid,
ROLES,
} = require("../utils/middleware/multiUserProtected");
function communityHubEndpoints(app) {
if (!app) return;
app.get(
"/community-hub/settings",
[validatedRequest, flexUserRoleValid([ROLES.admin])],
async (_, response) => {
try {
const { connectionKey } = await SystemSettings.hubSettings();
response.status(200).json({ success: true, connectionKey });
} catch (error) {
console.error(error);
response.status(500).json({ success: false, error: error.message });
}
}
);
app.post(
"/community-hub/settings",
[validatedRequest, flexUserRoleValid([ROLES.admin])],
async (request, response) => {
try {
const data = reqBody(request);
const result = await SystemSettings.updateSettings(data);
if (result.error) throw new Error(result.error);
response.status(200).json({ success: true, error: null });
} catch (error) {
console.error(error);
response.status(500).json({ success: false, error: error.message });
}
}
);
app.get(
"/community-hub/explore",
[validatedRequest, flexUserRoleValid([ROLES.admin])],
async (_, response) => {
try {
const exploreItems = await CommunityHub.fetchExploreItems();
response.status(200).json({ success: true, result: exploreItems });
} catch (error) {
console.error(error);
response.status(500).json({
success: false,
result: null,
error: error.message,
});
}
}
);
app.post(
"/community-hub/item",
[validatedRequest, flexUserRoleValid([ROLES.admin]), communityHubItem],
async (_request, response) => {
try {
response.status(200).json({
success: true,
item: response.locals.bundleItem,
error: null,
});
} catch (error) {
console.error(error);
response.status(500).json({
success: false,
item: null,
error: error.message,
});
}
}
);
/**
* Apply an item to the AnythingLLM instance. Used for simple items like slash commands and system prompts.
*/
app.post(
"/community-hub/apply",
[validatedRequest, flexUserRoleValid([ROLES.admin]), communityHubItem],
async (request, response) => {
try {
const { options = {} } = reqBody(request);
const item = response.locals.bundleItem;
const { error: applyError } = await CommunityHub.applyItem(item, {
...options,
currentUser: response.locals?.user,
});
if (applyError) throw new Error(applyError);
await Telemetry.sendTelemetry("community_hub_import", {
itemType: response.locals.bundleItem.itemType,
visibility: response.locals.bundleItem.visibility,
});
await EventLogs.logEvent(
"community_hub_import",
{
itemId: response.locals.bundleItem.id,
itemType: response.locals.bundleItem.itemType,
},
response.locals?.user?.id
);
response.status(200).json({ success: true, error: null });
} catch (error) {
console.error(error);
response.status(500).json({ success: false, error: error.message });
}
}
);
/**
* Import a bundle item to the AnythingLLM instance by downloading the zip file and importing it.
* or whatever the item type requires. This is not used if the item is a simple text responses like
* slash commands or system prompts.
*/
app.post(
"/community-hub/import",
[
validatedRequest,
flexUserRoleValid([ROLES.admin]),
communityHubItem,
communityHubDownloadsEnabled,
],
async (_, response) => {
try {
const { error: importError } = await CommunityHub.importBundleItem({
url: response.locals.bundleUrl,
item: response.locals.bundleItem,
});
if (importError) throw new Error(importError);
await Telemetry.sendTelemetry("community_hub_import", {
itemType: response.locals.bundleItem.itemType,
visibility: response.locals.bundleItem.visibility,
});
await EventLogs.logEvent(
"community_hub_import",
{
itemId: response.locals.bundleItem.id,
itemType: response.locals.bundleItem.itemType,
},
response.locals?.user?.id
);
response.status(200).json({ success: true, error: null });
} catch (error) {
console.error(error);
response.status(500).json({
success: false,
error: error.message,
});
}
}
);
app.get(
"/community-hub/items",
[validatedRequest, flexUserRoleValid([ROLES.admin])],
async (_, response) => {
try {
const { connectionKey } = await SystemSettings.hubSettings();
const items = await CommunityHub.fetchUserItems(connectionKey);
response.status(200).json({ success: true, ...items });
} catch (error) {
console.error(error);
response.status(500).json({ success: false, error: error.message });
}
}
);
}
module.exports = { communityHubEndpoints };