// admin/settings.js // Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; const express = require('express'); const { SiteController } = require('../../../lib/site-lib'); class SettingsController extends SiteController { constructor (dtp) { super(dtp, module.exports); } async start ( ) { const router = express.Router(); const imageUpload = this.createMulter('uploads', { limits: { fileSize: 1024 * 1000 * 12, }, }); router.use(async (req, res, next) => { res.locals.currentView = 'admin'; res.locals.adminView = 'settings'; return next(); }); router.post('/', this.postUpdateSettings.bind(this)); router.post('/images/updateSiteIcon', imageUpload.single('imageFile'), this.postUpdateSiteIcon.bind(this)); router.get('/', this.getSettingsView.bind(this)); router.get('/images', this.getImageSettings.bind(this)); return router; } async postUpdateSettings (req, res, next) { const { cache: cacheService } = this.dtp.services; try { const settingsKey = `settings:${this.dtp.config.site.domainKey}:site`; await cacheService.setObject(settingsKey, req.body); res.redirect('/admin/settings'); } catch (error) { return next(error); } } async getSettingsView (req, res, next) { try { res.render('admin/settings/editor'); } catch (error) { return next(error); } } async getImageSettings (req, res, next) { const { image: imageService } = this.dtp.services; res.locals.adminView = 'image-settings'; res.locals.pageTitle = `Image settings for ${this.dtp.config.site.name}`; try { res.locals.siteIcon = await imageService.getSiteIconInfo(); res.render('admin/settings/images'); } catch (error) { return next(error); } } async postUpdateSiteIcon (req, res, next) { const { image: imageService } = this.dtp.services; try { res.locals.image = await imageService.updateSiteIcon(req.body, req.file); res.status(200).json({ success: true, imageId: res.locals.image.toString(), }); } catch (error) { this.log.error('failed to create image', { error }); return next(error); } } } module.exports = { name: 'adminSettings', slug: 'admin-settings', create: async (dtp) => { return new SettingsController(dtp); }, };