|
|
|
@ -3,7 +3,8 @@ const db = require('knex')(config.database); |
|
|
|
|
const randomstring = require('randomstring'); |
|
|
|
|
const utils = require('./utilsController.js'); |
|
|
|
|
const path = require('path'); |
|
|
|
|
|
|
|
|
|
const fs = require('fs'); |
|
|
|
|
const Zip = require('jszip'); |
|
|
|
|
const albumsController = {}; |
|
|
|
|
|
|
|
|
|
albumsController.list = async (req, res, next) => { |
|
|
|
@ -129,4 +130,44 @@ albumsController.get = async (req, res, next) => { |
|
|
|
|
}); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
albumsController.generateZip = async (req, res, next) => { |
|
|
|
|
const identifier = req.params.identifier; |
|
|
|
|
if (identifier === undefined) return res.status(401).json({ success: false, description: 'No identifier provided' }); |
|
|
|
|
if (!config.uploads.generateZips) return res.status(401).json({ success: false, description: 'Zip generation disabled' }); |
|
|
|
|
|
|
|
|
|
const album = await db.table('albums').where({ identifier, enabled: 1 }).first(); |
|
|
|
|
if (!album) return res.json({ success: false, description: 'Album not found' }); |
|
|
|
|
|
|
|
|
|
if (album.zipGeneratedAt > album.editedAt) { |
|
|
|
|
const filePath = path.join(config.uploads.folder, 'zips', `${identifier}.zip`); |
|
|
|
|
const fileName = `${album.name}.zip`; |
|
|
|
|
return res.download(filePath, fileName); |
|
|
|
|
} else { |
|
|
|
|
console.log(`Generating zip for album identifier: ${identifier}`); |
|
|
|
|
const files = await db.table('files').select('name').where('albumid', album.id); |
|
|
|
|
if (files.length === 0) return res.json({ success: false, description: 'There are no files in the album' }); |
|
|
|
|
|
|
|
|
|
const zipPath = path.join(__dirname, '..', config.uploads.folder, 'zips', `${album.identifier}.zip`); |
|
|
|
|
let archive = new Zip(); |
|
|
|
|
|
|
|
|
|
for (let file of files) { |
|
|
|
|
archive.file(file.name, fs.readFileSync(path.join(__dirname, '..', config.uploads.folder, file.name))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
archive |
|
|
|
|
.generateNodeStream({ type: 'nodebuffer', streamFiles: true }) |
|
|
|
|
.pipe(fs.createWriteStream(zipPath)) |
|
|
|
|
.on('finish', async () => { |
|
|
|
|
await db.table('albums') |
|
|
|
|
.where('id', album.id) |
|
|
|
|
.update({ zipGeneratedAt: Math.floor(Date.now() / 1000) }); |
|
|
|
|
|
|
|
|
|
const filePath = path.join(config.uploads.folder, 'zips', `${identifier}.zip`); |
|
|
|
|
const fileName = `${album.name}.zip`; |
|
|
|
|
return res.download(filePath, fileName); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
module.exports = albumsController; |
|
|
|
|