|  | @@ -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;
 |