event's API support update and image_url
This commit is contained in:
@@ -236,6 +236,8 @@ const eventController = {
|
||||
|
||||
if (req.file) {
|
||||
eventDetails.image_path = req.file.filename
|
||||
} else if (body.image_url) {
|
||||
eventDetails.image_path = await helpers.getImageFromURL(body.image_url)
|
||||
}
|
||||
|
||||
const event = await Event.create(eventDetails)
|
||||
@@ -289,6 +291,7 @@ const eventController = {
|
||||
}
|
||||
const body = req.body
|
||||
const event = await Event.findByPk(body.id)
|
||||
if (!event) return res.sendStatus(404)
|
||||
if (!req.user.is_admin && event.userId !== req.user.id) {
|
||||
return res.sendStatus(403)
|
||||
}
|
||||
@@ -316,6 +319,8 @@ const eventController = {
|
||||
}
|
||||
}
|
||||
eventDetails.image_path = req.file.filename
|
||||
} else if (body.image_url) {
|
||||
eventDetails.image_path = await helpers.getImageFromURL(body.image_url)
|
||||
}
|
||||
|
||||
await event.update(eventDetails)
|
||||
|
||||
@@ -86,8 +86,7 @@ api.put('/place', isAdmin, eventController.updatePlace)
|
||||
* @param {array} [recurrent.days] - array of days
|
||||
* @param {image} [image] - Image
|
||||
*/
|
||||
api.post('/event', upload.single('image'), eventController.add)
|
||||
|
||||
api.post('/event', hasPerm('event:write'), upload.single('image'), eventController.add)
|
||||
api.put('/event', hasPerm('event:write'), upload.single('image'), eventController.update)
|
||||
|
||||
// remove event
|
||||
|
||||
@@ -45,7 +45,7 @@ const DiskStorage = {
|
||||
.pipe(outStream)
|
||||
.on('error', err)
|
||||
|
||||
outStream.on('finish', function () {
|
||||
outStream.on('finish', () => {
|
||||
cb(null, {
|
||||
destination: config.upload_path,
|
||||
filename,
|
||||
|
||||
@@ -2,7 +2,13 @@ const settingsController = require('./api/controller/settings')
|
||||
const acceptLanguage = require('accept-language')
|
||||
const moment = require('moment-timezone')
|
||||
const config = require('config')
|
||||
const debug = require('debug')('helpers')
|
||||
const pkg = require('../package.json')
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
const sharp = require('sharp')
|
||||
const axios = require('axios')
|
||||
const crypto = require('crypto')
|
||||
|
||||
const DOMPurify = require('dompurify')
|
||||
const { JSDOM } = require('jsdom')
|
||||
@@ -59,6 +65,45 @@ module.exports = {
|
||||
moment.locale(req.settings.locale)
|
||||
moment.tz.setDefault(req.settings.instance_timezone)
|
||||
next()
|
||||
},
|
||||
|
||||
async getImageFromURL (url) {
|
||||
debug(`getImageFromURL ${url}`)
|
||||
const filename = crypto.randomBytes(16).toString('hex') + '.webp'
|
||||
const finalPath = path.resolve(config.upload_path, filename)
|
||||
const thumbPath = path.resolve(config.upload_path, 'thumb', filename)
|
||||
const outStream = fs.createWriteStream(finalPath)
|
||||
const thumbStream = fs.createWriteStream(thumbPath)
|
||||
|
||||
const resizer = sharp().resize(1200).webp({ quality: 95 })
|
||||
const thumbnailer = sharp().resize(400).webp({ quality: 90 })
|
||||
|
||||
const response = await axios({ method: 'GET', url, responseType: 'stream' })
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
let onError = false
|
||||
const err = e => {
|
||||
if (onError) {
|
||||
return
|
||||
}
|
||||
onError = true
|
||||
reject(e)
|
||||
}
|
||||
|
||||
response.data
|
||||
.pipe(thumbnailer)
|
||||
.on('error', err)
|
||||
.pipe(thumbStream)
|
||||
.on('error', err)
|
||||
|
||||
response.data
|
||||
.pipe(resizer)
|
||||
.on('error', err)
|
||||
.pipe(outStream)
|
||||
.on('error', err)
|
||||
|
||||
outStream.on('finish', () => resolve(filename))
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user