You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
2.2 KiB
JavaScript

const router = module.exports = require('express-promise-router')()
const parseJSON = require('body-parser').json()
const db = require('../db')
const validate = require('./middleware/validators')
const upload = require('multer')({
storage: require('multer').memoryStorage(),
limits: {
files: 1,
fileSize: 3000000
}
})
router.get('/', async (req, res) => {
const showUnpublished =
// Only respect query parameter if user is admin
(req.user && req.user.is_admin)
? req.query.showUnpublished
: false
const items = await db.item.findAll(showUnpublished)
res.json(items)
})
const itemValidators = [
validate.validUrlSlug('urlslug'),
validate.publishedBool,
validate.positiveInteger('price_cents'),
validate.requiredString('name'),
validate.requiredString('description'),
validate.handleApiError
]
router.post('/', parseJSON, itemValidators, async (req, res) => {
const item = await db.item.create(
req.body.name,
req.body.urlslug,
req.body.description,
req.body.price_cents,
req.body.published
)
res.json(item)
})
router.get('/by-slug/:slug', async (req, res) => {
const item = await db.item.findBySlug(req.params.slug);
res.json(item)
})
router.post('/:uuid', parseJSON, itemValidators, async (req, res) => {
const item = await db.item.update(
req.params.uuid,
req.body.name,
req.body.urlslug,
req.body.description,
req.body.price_cents,
req.body.published
)
res.json(item)
})
router.post('/:uuid/images', upload.single('image'), async (req, res) => {
// Handle either image upload body or JSON body
try {
if(req.file)
await db.item.addImage(req.params.uuid, req.file.buffer, req.user.uuid)
else
await db.item.addImage(req.params.uuid, await b64.decode(req.body.image.split(',')[1]), req.user.uuid)
} catch (error) {
error.status = 500
throw error
}
res.json(await db.item.findById(req.params.uuid))
})
router.post('/:uuid/publish', async (req, res) => {
const item = await db.item.publish(req.params.uuid)
res.json(item)
})
router.post('/:uuid/unpublish', async (req, res) => {
const item = await db.item.unpublish(req.params.uuid)
res.json(item)
})