const { Session, Balance, deleteFiles, deleteConvos, deletePresets, deleteMessages, deleteUserById, } = require('~/models'); const { updateUserPluginAuth, deleteUserPluginAuth } = require('~/server/services/PluginService'); const { updateUserPluginsService, deleteUserKey } = require('~/server/services/UserService'); const { verifyEmail, resendVerificationEmail } = require('~/server/services/AuthService'); const { deleteAllSharedLinks } = require('~/models/Share'); const { Transaction } = require('~/models/Transaction'); const { logger } = require('~/config'); const getUserController = async (req, res) => { res.status(200).send(req.user); }; const updateUserPluginsController = async (req, res) => { const { user } = req; const { pluginKey, action, auth, isAssistantTool } = req.body; let authService; try { if (!isAssistantTool) { const userPluginsService = await updateUserPluginsService(user, pluginKey, action); if (userPluginsService instanceof Error) { logger.error('[userPluginsService]', userPluginsService); const { status, message } = userPluginsService; res.status(status).send({ message }); } } if (auth) { const keys = Object.keys(auth); const values = Object.values(auth); if (action === 'install' && keys.length > 0) { for (let i = 0; i < keys.length; i++) { authService = await updateUserPluginAuth(user.id, keys[i], pluginKey, values[i]); if (authService instanceof Error) { logger.error('[authService]', authService); const { status, message } = authService; res.status(status).send({ message }); } } } if (action === 'uninstall' && keys.length > 0) { for (let i = 0; i < keys.length; i++) { authService = await deleteUserPluginAuth(user.id, keys[i]); if (authService instanceof Error) { logger.error('[authService]', authService); const { status, message } = authService; res.status(status).send({ message }); } } } } res.status(200).send(); } catch (err) { logger.error('[updateUserPluginsController]', err); return res.status(500).json({ message: 'Something went wrong.' }); } }; const deleteUserController = async (req, res) => { const { user } = req; try { await deleteMessages({ user: user.id }); // delete user messages await Session.deleteMany({ user: user.id }); // delete user sessions await Transaction.deleteMany({ user: user.id }); // delete user transactions await deleteUserKey({ userId: user.id, all: true }); // delete user keys await Balance.deleteMany({ user: user._id }); // delete user balances await deletePresets(user.id); // delete user presets await deleteConvos(user.id); // delete user convos await deleteUserPluginAuth(user.id, null, true); // delete user plugin auth await deleteUserById(user.id); // delete user await deleteFiles(null, user.id); // delete user files await deleteAllSharedLinks(user.id); // delete user shared links /* TODO: queue job for cleaning actions and assistants of non-existant users */ logger.info(`User deleted account. Email: ${user.email} ID: ${user.id}`); res.status(200).send({ message: 'User deleted' }); } catch (err) { logger.error('[deleteUserController]', err); return res.status(500).json({ message: 'Something went wrong.' }); } }; const verifyEmailController = async (req, res) => { try { const verifyEmailService = await verifyEmail(req); if (verifyEmailService instanceof Error) { return res.status(400).json(verifyEmailService); } else { return res.status(200).json(verifyEmailService); } } catch (e) { logger.error('[verifyEmailController]', e); return res.status(500).json({ message: 'Something went wrong.' }); } }; const resendVerificationController = async (req, res) => { try { const result = await resendVerificationEmail(req); if (result instanceof Error) { return res.status(400).json(result); } else { return res.status(200).json(result); } } catch (e) { logger.error('[verifyEmailController]', e); return res.status(500).json({ message: 'Something went wrong.' }); } }; module.exports = { getUserController, deleteUserController, verifyEmailController, updateUserPluginsController, resendVerificationController, };