Ajout de la galerie d'images

This commit is contained in:
dbroqua 2018-09-16 23:46:39 +02:00
parent 4b9bed8926
commit b3dc18e57d
5 changed files with 265 additions and 16 deletions

191
middleware/Pictures.js Normal file
View file

@ -0,0 +1,191 @@
const pictures = require('../models').vegetablePictures
const multer = require('multer')
const Vegetables = require('./Vegetables')
const path = require('path')
const fs = require('fs')
const Aws = require('../libs/aws')
const uuid = require('uuid/v4')
class Pictures {
constructor () {
this._upload = multer({
storage: multer.diskStorage({}),
fileFilter: function (req, file, cb) {
const filetypes = /jpg|jpeg|png|JPG|JPEG|PNG/
const mimetype = filetypes.test(file.mimetype)
const extname = filetypes.test(path.extname(file.originalname).toLowerCase())
if (mimetype && extname) {
return cb(null, true)
}
cb(new Error('Error: File upload only supports the following filetypes - ' + filetypes))
}
}).single('picture')
}
_reOrderPictures (position, vegetableId) {
pictures.findAll({
where: {
vegetableId: vegetableId
}
})
.then(items => {
items.forEach((item) => {
let itemPosition = item.order
if (itemPosition >= position) {
item.update({ order: itemPosition - 1 })
.catch((e) => {
console.log(e)
})
}
})
})
.catch((error) => {
console.log(error)
})
}
static getAll (req, callback) {
Vegetables.getOne(req, (err, item) => {
if (err) {
callback(err, item)
return false
}
pictures.findAndCountAll({
where: {
vegetableId: req.params.vegetablesId
},
order: [
['order', 'ASC']
]
})
.then(items => {
if (!items) {
callback(new Error('No picture found'), 204)
return false
}
callback(null, items)
})
.catch((e) => {
callback(e, null)
})
})
}
static getOne (req, callback) {
Vegetables.getOne(req, (err, item) => {
if (err) {
callback(err, item)
return false
}
pictures.find({
where: {
id: req.params.pictureId,
vegetableId: req.params.vegetablesId
},
order: [
['order', 'ASC']
]
})
.then(item => {
if (!item) {
callback(new Error('Picture not found'), 404)
return false
}
callback(null, item)
})
.catch((e) => {
callback(e, null)
})
})
}
createOne (req, callback) {
Vegetables.getOne(req, (err, item) => {
if (err) {
callback(err, item)
return false
}
Pictures.getAll(req, (err, items) => {
if (err) {
callback(err, item)
return false
}
const order = items.count + 1
this._upload(req, req.body, (err) => {
if (err) {
callback(err, null)
return false
}
if (req.file) {
let aws = new Aws()
aws.upload({
path: req.file.path,
filename: `picture_${req.params.vegetablesId}_${uuid()}.${req.file.originalname.split('.')[req.file.originalname.split('.').length - 1]}`
}, (err, res) => {
if (err) { callback(err, null) }
pictures.create({
order: order,
url: res.file,
vegetableId: req.params.vegetablesId
})
.then(item => {
callback(null, item)
})
.catch(e => {
callback(e, null)
})
fs.unlink(req.file.path, () => {})
})
} else {
callback(new Error('No file sent'), 406)
}
})
})
})
}
deleteOne (req, callback) {
Pictures.getOne(req, (err, item) => {
if (err) {
callback(err, item)
return false
}
const aws = new Aws()
aws.deleteObjects([item.url], (err) => {
if (err) {
callback(err, null)
return false
}
pictures.destroy({
where: {
id: req.params.pictureId
}
})
.then(deleted => {
if (deleted === 0) {
callback(new Error('Error when trying to delete item'))
return false
}
callback(null, null)
})
.catch(e => {
callback(e, null)
})
})
})
}
}
module.exports = Pictures

View file

@ -13,7 +13,7 @@ module.exports = {
order: { order: {
type: Sequelize.INTEGER type: Sequelize.INTEGER
}, },
vegetablesId: { vegetableId: {
type: Sequelize.INTEGER, type: Sequelize.INTEGER,
references: { model: 'vegetables', key: 'id' } references: { model: 'vegetables', key: 'id' }
}, },

View file

@ -18,7 +18,7 @@ module.exports = (sequelize, DataTypes) => {
}) })
vegetables.hasMany(models.vegetablePictures, { vegetables.hasMany(models.vegetablePictures, {
as: 'Pictures', as: 'Pictures',
foreignKey: 'vegetablesId', foreignKey: 'vegetableId',
onDelete: 'cascade' onDelete: 'cascade'
}) })
} }

View file

@ -2,14 +2,17 @@ module.exports = (sequelize, DataTypes) => {
const vegetablePictures = sequelize.define('vegetablePictures', { const vegetablePictures = sequelize.define('vegetablePictures', {
url: DataTypes.STRING, url: DataTypes.STRING,
order: DataTypes.INTEGER, order: DataTypes.INTEGER,
vegetablesId: { vegetableId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
references: 'vegetables', references: 'vegetables',
referencesKey: 'id' referencesKey: 'id'
} }
}, {}) }, {})
vegetablePictures.associate = function(models) { vegetablePictures.associate = function(models) {
vegetablePictures.hasOne(models.vegetables, { as: 'Vegetables', foreignKey: 'id' }) vegetablePictures.hasOne(models.vegetables, {
as: 'Vegetables',
foreignKey: 'id'
})
} }
return vegetablePictures return vegetablePictures
} }

View file

@ -1,15 +1,18 @@
const express = require('express') const express = require('express')
const router = express.Router() const router = express.Router()
const VegetableTypes = require('../middleware/Vegetables') const Vegetables = require('../middleware/Vegetables')
const Pictures = require('../middleware/Pictures')
module.exports = function (passport) { module.exports = function (passport) {
const basePath = '/api/types/:vegetableTypesId/vegetables/' const basePath = '/api/types/:vegetableTypesId/vegetables'
const itemPath = basePath + ':vegetablesId' const itemPath = basePath + '/:vegetablesId'
const picturesPath = itemPath + '/pictures'
const picturePath = picturesPath + '/:pictureId'
router.route(basePath) router.route(basePath)
.get( .get(
function (req, res) { function (req, res) {
VegetableTypes.getAll(req, function (err, items) { Vegetables.getAll(req, function (err, items) {
if (err) { if (err) {
res.status(items || 500).send(err.message) res.status(items || 500).send(err.message)
} else { } else {
@ -21,8 +24,8 @@ module.exports = function (passport) {
.post( .post(
passport.authenticate(['basic-auth']), passport.authenticate(['basic-auth']),
function (req, res) { function (req, res) {
const vegetableTypes = new VegetableTypes() const vegetable = new Vegetables()
vegetableTypes.createOne(req, function (err, item) { vegetable.createOne(req, function (err, item) {
if (err) { if (err) {
res.status(item || 500).send(err.message) res.status(item || 500).send(err.message)
} else { } else {
@ -35,7 +38,7 @@ module.exports = function (passport) {
router.route(itemPath) router.route(itemPath)
.get( .get(
function (req, res) { function (req, res) {
VegetableTypes.getOne(req, function (err, item) { Vegetables.getOne(req, function (err, item) {
if (err) { if (err) {
res.status(item || 500).send(err.message) res.status(item || 500).send(err.message)
} else { } else {
@ -47,8 +50,8 @@ module.exports = function (passport) {
.patch( .patch(
passport.authenticate(['basic-auth']), passport.authenticate(['basic-auth']),
function (req, res) { function (req, res) {
const vegetableTypes = new VegetableTypes() const vegetable = new Vegetables()
vegetableTypes.patchOne(req, function (err, item) { vegetable.patchOne(req, function (err, item) {
if (err) { if (err) {
res.status(item || 500).send(err.message) res.status(item || 500).send(err.message)
} else { } else {
@ -60,8 +63,60 @@ module.exports = function (passport) {
.delete( .delete(
passport.authenticate(['basic-auth']), passport.authenticate(['basic-auth']),
function (req, res) { function (req, res) {
const vegetableTypes = new VegetableTypes() const vegetable = new Vegetables()
vegetableTypes.deleteOne(req, function (err, item) { vegetable.deleteOne(req, function (err, item) {
if (err) {
res.status(item || 500).send(err.message)
} else {
res.status(200).json(item)
}
})
}
)
router.route(picturesPath)
.get(
function (req, res) {
Pictures.getAll(req, function (err, item) {
if (err) {
res.status(item || 500).send(err.message)
} else {
res.status(200).json(item)
}
})
}
)
.post(
passport.authenticate(['basic-auth']),
function (req, res) {
const picture = new Pictures()
picture.createOne(req, function (err, item) {
if (err) {
res.status(item || 500).send(err.message)
} else {
res.status(201).json(item)
}
})
}
)
router.route(picturePath)
.get(
function (req, res) {
Pictures.getOne(req, function (err, item) {
if (err) {
res.status(item || 500).send(err.message)
} else {
res.status(200).json(item)
}
})
}
)
.delete(
passport.authenticate(['basic-auth']),
function (req, res) {
const picture = new Pictures()
picture.deleteOne(req, function (err, item) {
if (err) { if (err) {
res.status(item || 500).send(err.message) res.status(item || 500).send(err.message)
} else { } else {