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

88 lines
2.0 KiB

const request = require('request')
const sharp = require('sharp')
const { MongoClient, ObjectId } = require('mongodb')
const express = require('express')
const app = express()
const fs = require('fs')
const path = require('path')
const cors = require('cors')
// const resizeBox = sharp().resize(512).png()
const CTX = {
dbHandler: null
}
const CFG = {
port: process.env.PORT || 3000
}
app.use(cors())
app.get('/preview/:id', function (req, res) {
CTX.dbHandler
.collection('hboxes')
.find({_id: ObjectId(req.params.id)})
.project({preview: 1})
.limit(1)
.next(function (pErr, pDoc) {
if (pErr) {
return res.status(404).json(pErr)
}
downloadBox(pDoc._id, pDoc.preview.secure_url, res)
})
})
app.use('/', express.static('webapp'))
MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true }, function (pErr, pDbHandler) {
if (pErr) {
console.error(pErr)
process.exit(1)
}
CTX.dbHandler = pDbHandler.db('hortus-box')
app.listen(CFG.port, function () {
console.log(`[>] pwa-server running on ${CFG.port}`)
})
})
function downloadBox (pId, pUrl, res) {
let cachePath = path.join('./cache', `${pId}.png`)
fs.access(cachePath, fs.constants.F_OK, function (pErr) {
if (pErr) {
let wstream = fs.createWriteStream(cachePath)
request(pUrl).pipe(wstream)
wstream.on('finish', function () {
resizeBox(pId, cachePath, res)
})
} else {
resizeBox(pId, cachePath, res)
}
})
}
function resizeBox (pId, pCachePath, res) {
let previewPath = path.join('./cache', `${pId}.preview.png`)
fs.access(previewPath, fs.constants.F_OK, function (pErr) {
if (pErr) {
sharp(pCachePath)
.resize(512)
.toFile(previewPath, function (pErr, info) {
if (pErr) {
return res.status(404).json(pErr)
}
sendBox(previewPath, res)
})
} else {
sendBox(previewPath, res)
}
})
}
function sendBox (pPreviewPath, res) {
fs.createReadStream(pPreviewPath).pipe(res)
}