const fs = require('fs') const {PassThrough} = require('stream') const archiver = require('archiver') const moment = require('moment') const jwt = require('jsonwebtoken') const {secretKey} = require('../authentication') const {_sr} = require('../plugins/serverResponses') const { appendS3UploadsToArchive, uploadBackupArchive, deleteOldBackups, } = require('../plugins/backupStorage') // models const Category = require('../models/Category') const Comment = require('../models/Comment') const ContactUs = require('../models/ContactUs') const Content = require('../models/Content') const Gallery = require('../models/Gallery') const HomePage = require('../models/HomePage') const Links = require('../models/Links') const Meeting = require('../models/Meeting') const News = require('../models/News') const NewsFile = require('../models/NewsFile') const Occasion = require('../models/Occasion') const Services = require('../models/Services') const Slider = require('../models/Slider') const User = require('../models/User') const YearBanner = require('../models/YearBanner') const hostFullError = '

فضای هاست پر میباشد.لطفا نسبت به پاک کردن بکاپ های قبلی یا افزایش فضای هاست اقدام فرمایید.

' module.exports.createBackUp = [ // check user token and permission to backup async (req, res, next) => { const token = req.params.token if (!token) return res.status(401).json({message: 'unauthorized'}) try { // check if token is not destroyed const user = await User.findOne({token: token}) if (!user) return res.status(401).json({message: 'unauthorized'}) // verify token const checkToken = await jwt.verify(user.token.replace(/^Bearer\s/, ''), secretKey) if (!checkToken) return res.status(401).json({message: 'unauthorized'}) // check user permissions const permissions = user.permissions if (!permissions.includes('superAdmin')) res.status(401).json({message: 'unauthorized'}) return next() } catch (e) { res.status(401).json({message: 'unauthorized'}) } }, // do backup :) async (req, res) => { try { console.log('backup started') const dataBaseQueries = [ // categories Category.find(), // comments Comment.find(), // contact us ContactUs.find(), // content Content.find(), // gallery Gallery.find(), // home page HomePage.find(), // links Links.find(), // meetings Meeting.find(), // news News.find(), // newsFile NewsFile.find(), // services Services.find(), // sliders Slider.find(), // users User.find(), // year banner YearBanner.find(), // occasion Occasion.find() ] const [categories, comments, contactus, contents, galleries, homepage, links, meetings, news, newsFiles, services, sliders, users, yearBanner, occasion] = await Promise.all(dataBaseQueries) const dateStr = moment(Date.now()).format('YYYY-MM-DD') const backupName = `backup_${dateStr}.zip` const archive = archiver('zip', { zlib: {level: 9} }) const output = new PassThrough() const chunks = [] output.on('data', (chunk) => chunks.push(chunk)) archive.on('warning', function (err) { if (err.code === 'ENOENT') { console.log('On archiver warning -- ENOENT error code', err) } else { console.log('On archiver warning -- other error codes ', err) } return res.status(500).send(hostFullError) }) archive.on('error', function (err) { console.log(err) return res.status(500).json({message: 'مشکلی پیش آمده'}) }) archive.pipe(output) const databaseExports = [ ['categories', categories], ['comments', comments], ['contactus', contactus], ['contents', contents], ['galleries', galleries], ['homepage', homepage], ['links', links], ['meetings', meetings], ['news', news], ['newsFiles', newsFiles], ['services', services], ['sliders', sliders], ['users', users], ['yearBanner', yearBanner], ['occasion', occasion], ] for (const [name, data] of databaseExports) { archive.append(JSON.stringify(data), {name: `database/${name}_${dateStr}.json`}) } await appendS3UploadsToArchive(archive) await archive.finalize() await new Promise((resolve, reject) => { output.on('end', resolve) output.on('error', reject) }) const buffer = Buffer.concat(chunks) await uploadBackupArchive(buffer, backupName) res.setHeader('Content-Type', 'application/zip') res.setHeader('Content-Disposition', `attachment; filename="${backupName}"`) return res.send(buffer) } catch (e) { return res.status(500).send(hostFullError) } } ] module.exports.removeOldBackups = [ async (req, res) => { try { await deleteOldBackups() if (fs.existsSync('./backup')) { const files = fs.readdirSync('./backup') for (const file of files) { const filePath = `./backup/${file}` const isDirectory = fs.statSync(filePath).isDirectory() if (isDirectory) fs.rmdirSync(filePath, {recursive: true}) else fs.unlinkSync(filePath) } } return res.json({message: _sr['fa'].response.success_remove}) } catch (e) { return res.status(500).json({message: e}) } } ]