UNPKG

@moartube/moartube-client

Version:

A free, open-source, self-hosted, anonymous, decentralized video/live stream platform. Scalable via Cloudflare, works in the cloud or from home WiFi.

641 lines (484 loc) 20.5 kB
const express = require('express'); const multer = require('multer'); const { client_GET, node_GET, clientGpuAcceleration_POST, clientEncoding_POST, nodeAvatar_GET, nodeAvatar_POST, nodeBanner_GET, nodeBanner_POST, nodePersonalizeNodeName_POST, nodePersonalizeNodeAbout_POST, nodePersonalizeNodeId_POST, node_Secure_POST, nodeNetworkInternal_POST, nodeNetworkExternal_POST, nodeAccount_POST, nodeCloudflareConfigure_POST, nodeCloudflareClear_POST, nodeCloudflareTurnstileConfigure_POST, nodeCloudflareTurnstileClear_POST, clientEncodingDefault_GET, nodeCommentsToggle_POST, nodeDislikesToggle_POST, nodeLikesToggle_POST, nodeReportsToggle_POST, nodeLiveChatToggle_POST, nodeDatabaseConfigToggle_POST, nodeDatabaseConfigEmpty_POST, nodeStorageConfigToggle_POST, nodeStorageConfigEmpty_POST, nodeExportDatabase, nodeImportDatabase } = require('../controllers/settings'); const { logDebugMessageToConsole } = require('../utils/helpers'); const { node_isAuthenticated, node_doSignout } = require('../utils/node-communications'); const router = express.Router(); router.get('/', async (req, res) => { try { const jwtToken = req.session.jwtToken; const response = await node_isAuthenticated(jwtToken); if (response.isError) { logDebugMessageToConsole(response.message, null, new Error().stack); node_doSignout(req, res); } else if (response.isAuthenticated) { const { newContentCounts_GET } = require('../controllers/node'); const clientSettings = client_GET().clientSettings; const nodeSettings = await node_GET(jwtToken); const newContentCounts = (await newContentCounts_GET(jwtToken)).newContentCounts; res.render('settings', { clientSettings: clientSettings, nodeSettings: nodeSettings, newContentCounts: newContentCounts }); } else { res.redirect('/account/signin'); } } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); node_doSignout(req, res); } }); router.get('/client', (req, res) => { try { const data = client_GET(); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/client/gpuAcceleration', async (req, res) => { try { const isGpuAccelerationEnabled = req.body.isGpuAccelerationEnabled; const data = await clientGpuAcceleration_POST(isGpuAccelerationEnabled); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.get('/client/encoding/default', (req, res) => { try { const data = clientEncodingDefault_GET(); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/client/encoding', (req, res) => { try { const videoEncoderSettings = req.body.videoEncoderSettings; const liveEncoderSettings = req.body.liveEncoderSettings; const data = clientEncoding_POST(videoEncoderSettings, liveEncoderSettings); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.get('/node', async (req, res) => { try { const jwtToken = req.session.jwtToken; const nodeSettings = await node_GET(jwtToken); res.send({ nodeSettings: nodeSettings }); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.get('/node/avatar', async (req, res) => { try { const data = await nodeAvatar_GET(req, res); res.setHeader('Content-Type', 'image/jpeg'); data.pipe(res); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/avatar', (req, res) => { const jwtToken = req.session.jwtToken; multer({ storage: multer.memoryStorage(), }).fields([{ name: 'avatar_file', maxCount: 1 }]) (req, res, async function (error) { if (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } else { try { const avatarFile = req.files['avatar_file']; const data = await nodeAvatar_POST(jwtToken, avatarFile); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } } }); }); router.get('/node/banner', async (req, res) => { try { const data = await nodeBanner_GET(); res.setHeader('Content-Type', 'image/jpeg'); data.pipe(res); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/banner', (req, res) => { const jwtToken = req.session.jwtToken; multer({ storage: multer.memoryStorage(), }).fields([{ name: 'banner_file', maxCount: 1 }]) (req, res, async function (error) { if (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } else { try { const bannerFile = req.files['banner_file']; const data = await nodeBanner_POST(jwtToken, bannerFile); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } } }); }); router.post('/node/personalize/nodeName', async (req, res) => { try { const jwtToken = req.session.jwtToken; const nodeName = req.body.nodeName; const data = await nodePersonalizeNodeName_POST(jwtToken, nodeName); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/personalize/nodeAbout', async (req, res) => { try { const jwtToken = req.session.jwtToken; const nodeAbout = req.body.nodeAbout; const data = await nodePersonalizeNodeAbout_POST(jwtToken, nodeAbout); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/personalize/nodeId', async (req, res) => { try { const jwtToken = req.session.jwtToken; const nodeId = req.body.nodeId; const data = await nodePersonalizeNodeId_POST(jwtToken, nodeId); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/secure', async (req, res) => { const jwtToken = req.session.jwtToken; const isSecure = (req.query.isSecure === 'true'); if (isSecure) { multer({ storage: multer.memoryStorage(), }).fields([{ name: 'keyFile', maxCount: 1 }, { name: 'certFile', maxCount: 1 }, { name: 'caFiles', maxCount: 10 }]) (req, res, async function (error) { if (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } else { try { const keyFile = req.files['keyFile']; const certFile = req.files['certFile']; const caFiles = req.files['caFiles']; const data = await node_Secure_POST(jwtToken, isSecure, keyFile, certFile, caFiles); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } } }); } else { try { const data = await node_Secure_POST(jwtToken, isSecure); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } } }); router.post('/node/network/internal', async (req, res) => { try { const jwtToken = req.session.jwtToken; const nodeListeningPort = req.body.nodeListeningPort; const data = await nodeNetworkInternal_POST(jwtToken, nodeListeningPort); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/network/external', async (req, res) => { try { const jwtToken = req.session.jwtToken; const publicNodeProtocol = req.body.publicNodeProtocol; const publicNodeAddress = req.body.publicNodeAddress; const publicNodePort = req.body.publicNodePort; const data = await nodeNetworkExternal_POST(jwtToken, publicNodeProtocol, publicNodeAddress, publicNodePort); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/cloudflare/configure', async (req, res) => { try { const jwtToken = req.session.jwtToken; const cloudflareEmailAddress = req.body.cloudflareEmailAddress; const cloudflareZoneId = req.body.cloudflareZoneId; const cloudflareGlobalApiKey = req.body.cloudflareGlobalApiKey; const data = await nodeCloudflareConfigure_POST(jwtToken, cloudflareEmailAddress, cloudflareZoneId, cloudflareGlobalApiKey); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/cloudflare/turnstile/configure', async (req, res) => { try { const jwtToken = req.session.jwtToken; const cloudflareTurnstileSiteKey = req.body.cloudflareTurnstileSiteKey; const cloudflareTurnstileSecretKey = req.body.cloudflareTurnstileSecretKey; const data = await nodeCloudflareTurnstileConfigure_POST(jwtToken, cloudflareTurnstileSiteKey, cloudflareTurnstileSecretKey); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/cloudflare/turnstile/clear', async (req, res) => { try { const jwtToken = req.session.jwtToken; const data = await nodeCloudflareTurnstileClear_POST(jwtToken); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/cloudflare/clear', async (req, res) => { try { const jwtToken = req.session.jwtToken; const data = await nodeCloudflareClear_POST(jwtToken); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/databaseConfig/toggle', async (req, res) => { try { const jwtToken = req.session.jwtToken; const databaseConfig = req.body.databaseConfig; const data = await nodeDatabaseConfigToggle_POST(jwtToken, databaseConfig); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/databaseConfig/empty', async (req, res) => { try { const jwtToken = req.session.jwtToken; const data = await nodeDatabaseConfigEmpty_POST(jwtToken); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/storageConfig/toggle', async (req, res) => { try { const jwtToken = req.session.jwtToken; const storageConfig = req.body.storageConfig; let data = await nodeStorageConfigToggle_POST(jwtToken, storageConfig); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/storageConfig/empty', async (req, res) => { try { const jwtToken = req.session.jwtToken; let data = await nodeStorageConfigEmpty_POST(jwtToken); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/comments/toggle', async (req, res) => { try { const jwtToken = req.session.jwtToken; const isCommentsEnabled = req.body.isCommentsEnabled; const data = await nodeCommentsToggle_POST(jwtToken, isCommentsEnabled); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/likes/toggle', async (req, res) => { try { const jwtToken = req.session.jwtToken; const isLikesEnabled = req.body.isLikesEnabled; const data = await nodeLikesToggle_POST(jwtToken, isLikesEnabled); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/dislikes/toggle', async (req, res) => { try { const jwtToken = req.session.jwtToken; const isDislikesEnabled = req.body.isDislikesEnabled; const data = await nodeDislikesToggle_POST(jwtToken, isDislikesEnabled); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/reports/toggle', async (req, res) => { try { const jwtToken = req.session.jwtToken; const isReportsEnabled = req.body.isReportsEnabled; const data = await nodeReportsToggle_POST(jwtToken, isReportsEnabled); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/liveChat/toggle', async (req, res) => { try { const jwtToken = req.session.jwtToken; const isLiveChatEnabled = req.body.isLiveChatEnabled; const data = await nodeLiveChatToggle_POST(jwtToken, isLiveChatEnabled); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/account', async (req, res) => { try { const jwtToken = req.session.jwtToken; const username = req.body.username; const password = req.body.password; const data = await nodeAccount_POST(jwtToken, username, password); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.post('/node/import/database', async (req, res) => { try { const jwtToken = req.session.jwtToken; multer({ storage: multer.memoryStorage(), }).fields([{ name: 'database_file', maxCount: 1 }]) (req, res, async function (error) { if (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } else { try { const databaseFile = req.files['database_file']; const data = await nodeImportDatabase(jwtToken, databaseFile); res.send(data); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } } }); } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); router.get('/node/export/database', async (req, res) => { try { const jwtToken = req.session.jwtToken; const data = await nodeExportDatabase(jwtToken); if(data.isError) { res.status(500).send(data); } else { const database = data.database; const databaseJsonString = JSON.stringify(database); res.setHeader('Content-Disposition', `attachment; filename=database-${Date.now()}.json`); res.setHeader('Content-Type', 'application/json'); res.send(databaseJsonString); } } catch (error) { logDebugMessageToConsole(null, error, new Error().stack); res.send({ isError: true, message: 'error communicating with the MoarTube node' }); } }); module.exports = router;