diff --git a/app/controllers/admin/settings.js b/app/controllers/admin/settings.js index 1c8b967..87b0ab1 100644 --- a/app/controllers/admin/settings.js +++ b/app/controllers/admin/settings.js @@ -32,6 +32,8 @@ class SettingsController extends SiteController { router.post('/', this.postUpdateSettings.bind(this)); router.post('/images/updateSiteIcon', imageUpload.single('imageFile'), this.postUpdateSiteIcon.bind(this)); + + router.post('/images/updatePostImage', imageUpload.single('imageFile'), this.postUpdatePostImage.bind(this)); router.get('/', this.getSettingsView.bind(this)); @@ -65,6 +67,7 @@ class SettingsController extends SiteController { res.locals.pageTitle = `Image settings for ${this.dtp.config.site.name}`; try { res.locals.siteIcon = await imageService.getSiteIconInfo(); + res.locals.postImage = await imageService.getPostImageInfo(); res.render('admin/settings/images'); } catch (error) { return next(error); @@ -95,6 +98,30 @@ class SettingsController extends SiteController { } } + async postUpdatePostImage (req, res) { + const { image: imageService } = this.dtp.services; + try { + const displayList = this.createDisplayList('site-post-image'); + await imageService.updatePostImage(req.body, req.file); + displayList.showNotification( + 'Post Image updated successfully.', + 'success', + 'bottom-center', + 2000, + ); + res.status(200).json({ + success: true, + displayList, + }); + } catch (error) { + this.log.error('failed to update site icon', { error }); + return res.status(error.statusCode || 500).json({ + success: false, + message: error.message, + }); + } + } + } module.exports = { diff --git a/app/controllers/post.js b/app/controllers/post.js index 6735e1b..1aef155 100644 --- a/app/controllers/post.js +++ b/app/controllers/post.js @@ -7,7 +7,7 @@ const express = require('express'); const multer = require('multer'); -const { SiteController, SiteError} = require('../../lib/site-lib'); +const { SiteController, SiteError } = require('../../lib/site-lib'); class PostController extends SiteController { diff --git a/app/services/image.js b/app/services/image.js index 4547483..560106e 100644 --- a/app/services/image.js +++ b/app/services/image.js @@ -241,6 +241,59 @@ class ImageService extends SiteService { return icon; } + async getPostImageInfo() { + + const siteImagesDir = path.join(this.dtp.config.root, 'client', 'img'); + + let icon; + + try { + + await fs.promises.access(siteImagesDir); + const iconMetadata = await sharp(path.join(siteImagesDir, 'default-poster.jpg')).metadata(); + icon = { + metadata: iconMetadata, + path: `/img/default-poster.jpg`, + }; + + } catch (error) { + + icon = null; + } + + return icon; + } + + async updatePostImage(imageDefinition, file) { + + this.log.debug('updating site icon', { imageDefinition, file }); + try { + + + + const siteImagesDir = path.join(this.dtp.config.root, 'client', 'img'); + + const sourceIconFilePath = file.path; + + + await sharp(sourceIconFilePath).resize({ + fit: sharp.fit.inside, + width: 540, + height: 960, + }).jpeg() + .toFile(path.join(siteImagesDir, `default-poster.jpg`)); + + return path.join(siteImagesDir, 'default-poster.jpg'); + } catch (error) { + this.log.error('failed to update site icon', { error }); + throw error; + } finally { + this.log.info('removing uploaded image from local file system', { file: file.path }); + await fs.promises.rm(file.path); + } + + } + async updateSiteIcon(imageDefinition, file) { this.log.debug('updating site icon', { imageDefinition, file }); @@ -261,15 +314,13 @@ class ImageService extends SiteService { for (var size of sizes) { await sharp(sourceIconFilePath).resize({ - fit: sharp.fit.contain, + fit: sharp.fit.inside, width: size, height: size, }).png() .toFile(path.join(siteIconDir, `icon-${size}x${size}.png`)); } - - await fs.promises.cp(sourceIconFilePath, path.join(siteIconDir, `${siteDomain}.png`)); - + await fs.promises.cp(sourceIconFilePath, path.join(siteImagesDir, 'social-cards', `${siteDomain}.png`)); return path.join(siteIconDir, 'icon-512x512.png'); } catch (error) { diff --git a/app/views/admin/components/menu.pug b/app/views/admin/components/menu.pug index f87bd06..9573dbb 100644 --- a/app/views/admin/components/menu.pug +++ b/app/views/admin/components/menu.pug @@ -25,12 +25,6 @@ ul(uk-nav).uk-nav-default i.fas.fa-cog span.uk-margin-small-left Otp Settings - li(class={ 'uk-active': (adminView === 'otp') }) - a(href="/admin/otp") - span.nav-item-icon - i.fas.fa-cog - span.uk-margin-small-left Otp Settings - li.uk-nav-divider li(class={ 'uk-active': (adminView === 'announcement') }) diff --git a/app/views/admin/settings/images.pug b/app/views/admin/settings/images.pug index 00220bf..9aa60be 100644 --- a/app/views/admin/settings/images.pug +++ b/app/views/admin/settings/images.pug @@ -22,7 +22,26 @@ block content 'site-icon-upload', 'site-icon-file', 'site-icon-picture', - `/img/icon/dtp-base.png`, + `/img/icon/dtp-sites.png`, siteIcon, { aspectRatio: 1 }, + ) + + div(uk-grid).uk-flex-middle + .uk-width-expand + fieldset + legend Default poster + .uk-margin + if postImage + p.uk-card-title Replace your default post image below. + else + p.uk-card-title You do not currently have a default post image. Add one below. + +renderFileUploadImage( + `/admin/settings/images/updatePostImage`, + 'site-post-upload', + 'site-post-file', + 'site-post-picture', + `/img/default-poster.jpg`, + postImage, + { aspectRatio: 16/9 }, ) \ No newline at end of file