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
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)
|
|
}
|