LibreChat / api /server /services /UserService.js
N.Achyuth Reddy
Upload 683 files
9705b6c
const { User, Key } = require('../../models');
const { encrypt, decrypt } = require('../utils');
const updateUserPluginsService = async (user, pluginKey, action) => {
try {
if (action === 'install') {
return await User.updateOne(
{ _id: user._id },
{ $set: { plugins: [...user.plugins, pluginKey] } },
);
} else if (action === 'uninstall') {
return await User.updateOne(
{ _id: user._id },
{ $set: { plugins: user.plugins.filter((plugin) => plugin !== pluginKey) } },
);
}
} catch (err) {
console.log(err);
return err;
}
};
const getUserKey = async ({ userId, name }) => {
const keyValue = await Key.findOne({ userId, name }).lean();
if (!keyValue) {
throw new Error('User-provided key not found');
}
return decrypt(keyValue.value);
};
const getUserKeyExpiry = async ({ userId, name }) => {
const keyValue = await Key.findOne({ userId, name }).lean();
if (!keyValue) {
return { expiresAt: null };
}
return { expiresAt: keyValue.expiresAt };
};
const updateUserKey = async ({ userId, name, value, expiresAt }) => {
const encryptedValue = encrypt(value);
return await Key.findOneAndUpdate(
{ userId, name },
{
userId,
name,
value: encryptedValue,
expiresAt: new Date(expiresAt),
},
{ upsert: true, new: true },
).lean();
};
const deleteUserKey = async ({ userId, name, all = false }) => {
if (all) {
return await Key.deleteMany({ userId });
}
await Key.findOneAndDelete({ userId, name }).lean();
};
const checkUserKeyExpiry = (expiresAt, message) => {
const expiresAtDate = new Date(expiresAt);
if (expiresAtDate < new Date()) {
const expiryStr = `User-provided key expired at ${expiresAtDate.toLocaleString()}`;
const errorMessage = message ? `${message}\n${expiryStr}` : expiryStr;
throw new Error(errorMessage);
}
};
module.exports = {
updateUserPluginsService,
getUserKey,
getUserKeyExpiry,
updateUserKey,
deleteUserKey,
checkUserKeyExpiry,
};