158 lines
4.6 KiB
JavaScript
158 lines
4.6 KiB
JavaScript
const { body, validationResult } = require('express-validator')
|
|
const Brand = require("../models/Brand");
|
|
const { checkValidations } = require("../plugins/controllersHelperFunctions")
|
|
const { _sr } = require("../plugins/serverResponses")
|
|
const maxAttachmentSize = 2048
|
|
const _faSr = _sr.fa;
|
|
/* eslint-disable spaced-comment */
|
|
|
|
//@desc Create a brand
|
|
//@route POST /api/brands/
|
|
//@access Private
|
|
const createbrand = [
|
|
[
|
|
body('title').notEmpty().withMessage(_sr.fa.required.title),
|
|
body('description').notEmpty().withMessage(_sr.fa.required.description),
|
|
],
|
|
checkValidations(validationResult),
|
|
async (req, res) => {
|
|
const { title, link, description } = req.body;
|
|
const data = {
|
|
title, link, description,
|
|
}
|
|
|
|
if (req.files?.logo) {
|
|
const image = req.files.logo
|
|
const fileName = 'brands' + Date.now() + '.' + image.name
|
|
const acceptableFormats = ['png', 'jpg', 'jpeg', 'webp']
|
|
if (!acceptableFormats.includes(image.mimetype.split('/')[1]))
|
|
return res.status(422).json({ validation: { logo: { msg: _faSr.format.image } } })
|
|
if (image.size / 1024 > maxAttachmentSize)
|
|
return res
|
|
.status(422)
|
|
.json({ validation: { logo: { msg: `حجم تصویر نباید بیشتر از ${maxAttachmentSize} KB باشد.` } } })
|
|
data.logo = fileName
|
|
await image.mv(`./static/uploads/images/brands/${fileName}`)
|
|
}else{
|
|
res.status(422).json({ validation: { logo: { msg: `تصویر را ارسال کنید` } } })
|
|
}
|
|
|
|
|
|
|
|
|
|
const linkAvailable = await Brand.findOne({ link });
|
|
if (linkAvailable) {
|
|
res.status(400).json(_sr.fa.duplicated.link);
|
|
}
|
|
|
|
const brand = await Brand.create(data);
|
|
|
|
res.status(201).json(brand);
|
|
|
|
}
|
|
|
|
]
|
|
|
|
|
|
//@desc Get to all brands
|
|
//@route GET /api/brands/
|
|
//@access Public
|
|
const getbrands = async (req, res) => {
|
|
const brand = await Brand.find();
|
|
|
|
res.status(200).json(brand);
|
|
};
|
|
|
|
|
|
//@desc Get to brand by id
|
|
//@route GET /api/brands/id/:id
|
|
//@access Public
|
|
const getbrand = async (req, res) => {
|
|
const brand = await Brand.findById(req.params.id);
|
|
if (!brand) {
|
|
res.status(404).json(_sr.fa.not_found.item_id)
|
|
}
|
|
res.status(200).json(brand);
|
|
};
|
|
|
|
|
|
//@desc Update a brand
|
|
//@route Put /api/brands/:id
|
|
//@access Private
|
|
const updatebrand = [
|
|
[
|
|
body('title').notEmpty().withMessage(_sr.fa.required.title),
|
|
body('description').notEmpty().withMessage(_sr.fa.required.description),
|
|
body('link').notEmpty().trim().isLowercase().withMessage(_sr.fa.required.field),
|
|
|
|
],
|
|
checkValidations(validationResult),
|
|
async (req, res) => {
|
|
const { title, link, description } = req.body;
|
|
const data = {
|
|
title, link, description,
|
|
}
|
|
|
|
if (req.files?.logo) {
|
|
const image = req.files.logo
|
|
const fileName = 'brands' + Date.now() + '.' + image.name
|
|
const acceptableFormats = ['png', 'jpg', 'jpeg', 'webp']
|
|
if (!acceptableFormats.includes(image.mimetype.split('/')[1]))
|
|
return res.status(422).json({ validation: { image: { msg: _faSr.format.image } } })
|
|
if (image.size / 1024 > maxAttachmentSize)
|
|
return res
|
|
.status(422)
|
|
.json({ validation: { image: { msg: `حجم تصویر نباید بیشتر از ${maxAttachmentSize} KB باشد.` } } })
|
|
data.logo = fileName
|
|
await image.mv(`./static/uploads/images/brands/${fileName}`)
|
|
}
|
|
|
|
const brand = await Brand.findById(req.params.id);
|
|
if (!brand) {
|
|
res.status(404).json(_sr.fa.not_found.item_id);
|
|
}
|
|
|
|
const linkAvailable = await Brand.findOne({ link });
|
|
// eslint-disable-next-line eqeqeq
|
|
if (linkAvailable && linkAvailable.id != req.params.id) {
|
|
res.status(400).json(_sr.fa.duplicated.link);
|
|
}
|
|
|
|
const updateBrand = await Brand.findByIdAndUpdate(
|
|
req.params.id,
|
|
data,
|
|
{ new: true }
|
|
);
|
|
|
|
res.status(201).json(updateBrand);
|
|
|
|
}
|
|
]
|
|
|
|
|
|
//@desc Delete a brand
|
|
//@route DELETE /api/brands/:id
|
|
//@access Private
|
|
const deletebrand = async (req, res) => {
|
|
const brand = await Brand.findById(req.params.id);
|
|
|
|
|
|
if (!brand) {
|
|
res.status(404).json(_sr.fa.not_found.item_id);
|
|
}
|
|
|
|
await brand.deleteOne();
|
|
|
|
res.status(200).json(brand);
|
|
|
|
};
|
|
|
|
|
|
module.exports = {
|
|
createbrand,
|
|
getbrands,
|
|
getbrand,
|
|
updatebrand,
|
|
deletebrand,
|
|
};
|