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, };