const ProductCategory = require('../models/product/ProductCategory') const Product = require('../models/product/Product') const {body, validationResult} = require('express-validator') const dateformat = require('dateformat') const jimp = require('jimp') const fs = require('fs') module.exports.create = [ [ body('fa_name') .notEmpty().withMessage('نام نباید خالی باشد.') .bail() .custom((value, {req}) => { return ProductCategory.findOne({'category_details.fa.name': value}) .then(category => { if (category) return Promise.reject('دسته بندی با این نام از قبل وجود دارد') return true }) } ), body('en_name') .notEmpty().withMessage('نام نباید خالی باشد.') .bail() .custom((value, {req}) => { return ProductCategory.findOne({'category_details.en.name': value}) .then(category => { if (category) return Promise.reject('دسته بندی با این نام از قبل وجود دارد') return true }) } ), body('de_name') .notEmpty().withMessage('نام نباید خالی باشد.') .bail() .custom((value, {req}) => { return ProductCategory.findOne({'category_details.de.name': value}) .then(category => { if (category) return Promise.reject('دسته بندی با این نام از قبل وجود دارد') return true }) } ), body('tr_name') .notEmpty().withMessage('نام نباید خالی باشد.') .bail() .custom((value, {req}) => { return ProductCategory.findOne({'category_details.tr.name': value}) .then(category => { if (category) return Promise.reject('دسته بندی با این نام از قبل وجود دارد') return true }) } ), body('it_name') .notEmpty().withMessage('نام نباید خالی باشد.') .bail() .custom((value, {req}) => { return ProductCategory.findOne({'category_details.it.name': value}) .then(category => { if (category) return Promise.reject('دسته بندی با این نام از قبل وجود دارد') return true }) } ), body('fa_caption') .notEmpty().withMessage('توضیحات نباید خالی باشد.'), body('en_caption') .notEmpty().withMessage('توضیحات نباید خالی باشد.'), body('de_caption') .notEmpty().withMessage('توضیحات نباید خالی باشد.'), body('tr_caption') .notEmpty().withMessage('توضیحات نباید خالی باشد.'), body('it_caption') .notEmpty().withMessage('توضیحات نباید خالی باشد.') ], (req, res) => { const errors = validationResult(req) if (!errors.isEmpty()) return res.status(422).json({validation: errors.mapped()}) let image let imageName let cover let coverName if (req.files) { if (req.files.image) { image = req.files.image imageName = 'categoryImage_' + Date.now() + '.' + image.mimetype.split('/')[1] if (image.mimetype.split('/')[1] !== 'png') return res.status(422).json({validation: {image: {msg: 'فرمت عکس باید png باشد.'}}}) } else { return res.status(422).json({validation: {image: {msg: 'عکس اجباری است.'}}}) } if (req.files.cover) { cover = req.files.cover coverName = 'categoryCover_' + Date.now() + '.' + cover.mimetype.split('/')[1] if (cover.size / 1024 > 500) return res.status(422).json({validation: {cover: {msg: 'حجم کاور نباید بیشتر از 500 کیلوبایت باشد'}}}) cover.mv(`./static/uploads/images/products/category/${coverName}`) } else { return res.status(422).json({validation: {cover: {msg: 'کاور اجباری است.'}}}) } } else { return res.status(422).json({ validation: { image: {msg: 'عکس اجباری است.'}, cover: {msg: 'کاور اجباری است.'} } }) } const data = { cover: coverName, category_details: { fa: { name: req.body.fa_name, caption: req.body.fa_caption }, en: { name: req.body.en_name, caption: req.body.en_caption }, de: { name: req.body.de_name, caption: req.body.de_caption }, tr: { name: req.body.tr_name, caption: req.body.tr_caption }, it: { name: req.body.it_name, caption: req.body.it_caption } }, created_at: dateformat(Date.now(), 'yyyy-mm-dd HH:MM:ss') } jimp.read(image.data).then(img => { img .cover(380, 230) .write(`./static/uploads/images/products/category/${imageName}`, err => { if (err) console.log(err) data.image = imageName const category = new ProductCategory(data) category.save(err => { if (err) return res.status(500).json({message: err}) return res.json({message: 'دسته بندی با موفقیت ثبت شد.'}) }) }) }) } ] module.exports.getAll = [ (req, res) => { ProductCategory.find({}, (err, categories) => { if (err) return res.status(500).json({message: err}) return res.json(categories) }) } ] module.exports.getOne = [ (req, res) => { ProductCategory.findById(req.params.id, (err, category) => { if (err) console.log(err) return res.json(category) }) } ] module.exports.update = [ [ body('fa_name') .notEmpty().withMessage('نام نباید خالی باشد.') .bail() .custom((value, {req}) => { return ProductCategory.findOne({'category_details.fa.name': value}) .then(category => { if (category && category._id.toString() !== req.params.id) return Promise.reject('دسته بندی با این نام از قبل وجود دارد') return true }) } ), body('en_name') .notEmpty().withMessage('نام نباید خالی باشد.') .bail() .custom((value, {req}) => { return ProductCategory.findOne({'category_details.en.name': value}) .then(category => { if (category && category._id.toString() !== req.params.id) return Promise.reject('دسته بندی با این نام از قبل وجود دارد') return true }) } ), body('de_name') .notEmpty().withMessage('نام نباید خالی باشد.') .bail() .custom((value, {req}) => { return ProductCategory.findOne({'category_details.de.name': value}) .then(category => { if (category && category._id.toString() !== req.params.id) return Promise.reject('دسته بندی با این نام از قبل وجود دارد') return true }) } ), body('tr_name') .notEmpty().withMessage('نام نباید خالی باشد.') .bail() .custom((value, {req}) => { return ProductCategory.findOne({'category_details.tr.name': value}) .then(category => { if (category && category._id.toString() !== req.params.id) return Promise.reject('دسته بندی با این نام از قبل وجود دارد') return true }) } ), body('it_name') .notEmpty().withMessage('نام نباید خالی باشد.') .bail() .custom((value, {req}) => { return ProductCategory.findOne({'category_details.it.name': value}) .then(category => { if (category && category._id.toString() !== req.params.id) return Promise.reject('دسته بندی با این نام از قبل وجود دارد') return true }) } ), body('fa_caption') .notEmpty().withMessage('توضیحات نباید خالی باشد.'), body('en_caption') .notEmpty().withMessage('توضیحات نباید خالی باشد.'), body('de_caption') .notEmpty().withMessage('توضیحات نباید خالی باشد.'), body('tr_caption') .notEmpty().withMessage('توضیحات نباید خالی باشد.'), body('it_caption') .notEmpty().withMessage('توضیحات نباید خالی باشد.') ], (req, res) => { // check validation results const errors = validationResult(req) if (!errors.isEmpty()) return res.status(422).json({validation: errors.mapped()}) let image let imageName let cover let coverName const data = { category_details: { fa: { name: req.body.fa_name, caption: req.body.fa_caption }, en: { name: req.body.en_name, caption: req.body.en_caption }, de: { name: req.body.de_name, caption: req.body.de_caption }, tr: { name: req.body.tr_name, caption: req.body.tr_caption }, it: { name: req.body.it_name, caption: req.body.it_caption } } } if (req.files) { if (req.files.image) { image = req.files.image imageName = 'categoryImage_' + Date.now() + '.' + image.mimetype.split('/')[1] if (image.mimetype.split('/')[1] !== 'png') return res.status(422).json({validation: {image: {msg: 'فرمت عکس باید png باشد.'}}}) data.image = imageName jimp.read(image.data).then(img => { img .cover(380, 230) .write(`./static/uploads/images/products/category/${imageName}`, err => { if (err) console.log(err) } ) }) } if (req.files.cover) { cover = req.files.cover coverName = 'categoryCover_' + Date.now() + '.' + cover.mimetype.split('/')[1] if (cover.size / 1024 > 500) return res.status(422).json({validation: {cover: {msg: 'حجم کاور نباید بیشتر از 500 کیلوبایت باشد'}}}) cover.mv(`./static/uploads/images/products/category/${coverName}`) data.cover = coverName } } ProductCategory.findByIdAndUpdate(req.params.id, data, (err, oldData) => { if (err) return res.status(404).json({message: err}) if (image && image.data) fs.unlink(`./static/${oldData.image}`, err => { if (err) console.log(err) }) if (cover && cover.data) fs.unlink(`./static/${oldData.cover}`, err => { if (err) console.log(err) }) ProductCategory.findById(oldData._id) .then(category => { return res.json(category) }) }) } ] module.exports.delete = [ (req, res) => { Product.findOne({category: req.params.id}, (err, product) => { if (err) console.log(err) if (product) return res.status(400).json({message: 'این دسته بندی دارای محصول است.'}) else { ProductCategory.findByIdAndDelete(req.params.id, (err, category) => { if (err) return res.status(404).json({message: err}) if (category) { fs.unlink(`./static/${category.image}`, err => { if (err) console.log(err) }) fs.unlink(`./static/${category.cover}`, err => { if (err) console.log(err) }) return res.json({message: 'دسته بندی حذف شد.'}) } }) } }) } ]