248 lines
7.5 KiB
JavaScript
248 lines
7.5 KiB
JavaScript
const fs = require('fs')
|
|
const mongoose = require('mongoose')
|
|
const { body, validationResult } = require('express-validator')
|
|
const jimp = require('jimp')
|
|
const Learning = require('../models/Learning')
|
|
const { _sr } = require('../plugins/serverResponses')
|
|
const { res404, res500, checkValidations } = require('../plugins/controllersHelperFunctions')
|
|
const _faSr = _sr.fa
|
|
//
|
|
const coverWidth = 1300
|
|
const coverHeight = 620
|
|
const thumbWidth = 636
|
|
const thumbHeight = 400
|
|
const coverQuality = 80
|
|
// const coverThumbQuality = 100
|
|
const shortDescriptionLength = 260
|
|
|
|
const paginateLimit = 5
|
|
|
|
module.exports.create = [
|
|
[
|
|
// title
|
|
body('title')
|
|
.notEmpty()
|
|
.withMessage(_faSr.required.title)
|
|
.custom((value, { req }) => {
|
|
return Learning.findOne({ title: value }).then(post => {
|
|
if (post) return Promise.reject(_faSr.duplicated.title)
|
|
return true
|
|
})
|
|
}),
|
|
|
|
// description
|
|
body('description').notEmpty().withMessage(_faSr.required.description),
|
|
|
|
// short description
|
|
body('short_description').notEmpty().withMessage(_faSr.required.description)
|
|
],
|
|
checkValidations(validationResult),
|
|
(req, res) => {
|
|
if (!req.files || !req.files.cover)
|
|
return res.status(422).json({ validation: { cover: { msg: _faSr.required.cover } } })
|
|
|
|
const data = {
|
|
_creator: req.user_id,
|
|
title: req.body.title,
|
|
description: req.body.description,
|
|
short_description: req.body.short_description.slice(0, shortDescriptionLength) + ' ... '
|
|
}
|
|
|
|
if (req.files && req.files.cover) {
|
|
const cover = req.files.cover
|
|
|
|
// validate image format
|
|
const supportedFormats = ['jpg', 'jpeg', 'png', 'webp']
|
|
if (!supportedFormats.includes(cover.mimetype.split('/')[1])) {
|
|
return res.status(422).json({ validation: { cover: { msg: _faSr.format.image } } })
|
|
}
|
|
|
|
const coverName = 'blog_' + Date.now() + '.' + cover.mimetype.split('/')[1]
|
|
data.cover = data.thumb = coverName
|
|
|
|
jimp
|
|
.read(cover.data)
|
|
.then(img => {
|
|
img
|
|
.cover(coverWidth, coverHeight)
|
|
.quality(coverQuality)
|
|
.write(`./static/uploads/images/blog/${coverName}`)
|
|
.resize(thumbWidth, jimp.AUTO)
|
|
.cover(thumbWidth, thumbHeight)
|
|
.write(`./static/uploads/images/blog/thumb/${coverName}`)
|
|
})
|
|
.catch(err => {
|
|
console.log(err)
|
|
})
|
|
}
|
|
|
|
if (req.files && req.files.video) {
|
|
const video = req.files.video
|
|
|
|
// validate video format
|
|
const supportedFormats = ['mp4', 'avi', 'wmv']
|
|
if (!supportedFormats.includes(video.mimetype.split('/')[1])) {
|
|
return res.status(422).json({ validation: { video: { msg: _faSr.format.video } } })
|
|
}
|
|
|
|
const videoName = 'blog_' + Date.now() + '.' + video.mimetype.split('/')[1]
|
|
data.video = videoName
|
|
video.mv(`./static/uploads/videos/${videoName}`, err => {
|
|
if (err) console.log(err)
|
|
})
|
|
}
|
|
|
|
const post = new Learning(data)
|
|
post.save(err => {
|
|
if (err) console.log(err)
|
|
return res.json({ message: _faSr.response.success_save })
|
|
})
|
|
}
|
|
]
|
|
|
|
module.exports.getAll = [
|
|
(req, res) => {
|
|
const page = req.params?.page
|
|
if (page === 'all') {
|
|
Learning.find({}, (err, data) => {
|
|
if (err) return res500(res, err)
|
|
else return res.json(data)
|
|
})
|
|
} else {
|
|
Learning.paginate({}, { page: page || 1, limit: paginateLimit, sort: { _id: -1 } }, (err, data) => {
|
|
if (err) return res500(res, err)
|
|
if (!data.docs.length && Number(req.params.page) !== 1)
|
|
return res.status(404).json({ message: _faSr.not_found.item_id })
|
|
else return res.json(data)
|
|
})
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.getOne = [
|
|
(req, res) => {
|
|
const query = {}
|
|
if (mongoose.isValidObjectId(req.params.id)) query._id = req.params.id
|
|
else query.title = req.params.id
|
|
Learning.findOne(query)
|
|
.populate('_creator', 'first_name last_name')
|
|
.exec((err, post) => {
|
|
if (err || !post) return res404(res, err)
|
|
return res.json(post)
|
|
})
|
|
}
|
|
]
|
|
|
|
module.exports.update = [
|
|
[
|
|
// title
|
|
body('title')
|
|
.notEmpty()
|
|
.withMessage(_faSr.required.title)
|
|
.custom((value, { req }) => {
|
|
return Learning.findOne({ title: value }).then(post => {
|
|
if (post && post._id.toString() !== req.params.id) return Promise.reject(_faSr.duplicated.title)
|
|
return true
|
|
})
|
|
}),
|
|
|
|
// description
|
|
body('description').notEmpty().withMessage(_faSr.required.description),
|
|
|
|
// short description
|
|
body('short_description').notEmpty().withMessage(_faSr.required.description)
|
|
],
|
|
checkValidations(validationResult),
|
|
(req, res) => {
|
|
const data = {
|
|
_creator: req.user_id,
|
|
title: req.body.title,
|
|
description: req.body.description,
|
|
short_description: req.body.short_description.slice(0, shortDescriptionLength) + ' ... '
|
|
}
|
|
|
|
if (req.files && req.files.cover) {
|
|
const cover = req.files.cover
|
|
|
|
// validate image format
|
|
const supportedFormats = ['jpg', 'jpeg', 'png', 'webp']
|
|
if (!supportedFormats.includes(cover.mimetype.split('/')[1])) {
|
|
return res.status(422).json({ validation: { cover: { msg: _faSr.format.image } } })
|
|
}
|
|
|
|
const coverName = 'blog_' + Date.now() + '.' + cover.mimetype.split('/')[1]
|
|
data.cover = data.thumb = coverName
|
|
|
|
jimp
|
|
.read(cover.data)
|
|
.then(img => {
|
|
img
|
|
.cover(coverWidth, coverHeight)
|
|
.quality(coverQuality)
|
|
.write(`./static/uploads/images/blog/${coverName}`)
|
|
.resize(thumbWidth, jimp.AUTO)
|
|
.cover(thumbWidth, thumbHeight)
|
|
.write(`./static/uploads/images/blog/thumb/${coverName}`)
|
|
})
|
|
.catch(err => {
|
|
console.log(err)
|
|
})
|
|
}
|
|
|
|
if (req.files && req.files.video) {
|
|
const video = req.files.video
|
|
|
|
// validate video format
|
|
const supportedFormats = ['mp4', 'avi', 'wmv']
|
|
if (!supportedFormats.includes(video.mimetype.split('/')[1])) {
|
|
return res.status(422).json({ validation: { video: { msg: _faSr.format.video } } })
|
|
}
|
|
|
|
const videoName = 'blog_' + Date.now() + '.' + video.mimetype.split('/')[1]
|
|
data.video = videoName
|
|
video.mv(`./static/uploads/videos/${videoName}`, err => {
|
|
if (err) console.log(err)
|
|
})
|
|
}
|
|
|
|
Learning.findByIdAndUpdate(req.params.id, data, (err, oldData) => {
|
|
if (err) return res404(res, err)
|
|
if (req.files && req.files.cover) {
|
|
fs.unlink(`./static/${oldData.cover}`, err => {
|
|
if (err) console.log(err)
|
|
})
|
|
fs.unlink(`./static/${oldData.thumb}`, err => {
|
|
if (err) console.log(err)
|
|
})
|
|
}
|
|
if (req.files && req.files.video && oldData.video)
|
|
fs.unlink(`./static/${oldData.video}`, err => {
|
|
if (err) console.log(err)
|
|
})
|
|
Learning.findById(oldData._id, (err, newData) => {
|
|
if (err) return res404(res, err)
|
|
return res.json(newData)
|
|
})
|
|
})
|
|
}
|
|
]
|
|
|
|
module.exports.delete = [
|
|
(req, res) => {
|
|
Learning.findByIdAndDelete(req.params.id, (err, post) => {
|
|
if (err) return res.status(404).json({ message: err })
|
|
fs.unlink(`./static/${post.cover}`, err => {
|
|
if (err) console.log(err)
|
|
})
|
|
fs.unlink(`./static/${post.thumb}`, err => {
|
|
if (err) console.log(err)
|
|
})
|
|
if (post.video)
|
|
fs.unlink(`./static/${post.video}`, err => {
|
|
if (err) console.log(err)
|
|
})
|
|
return res.json({ message: _faSr.response.success_remove })
|
|
})
|
|
}
|
|
]
|