188 lines
5.7 KiB
JavaScript
188 lines
5.7 KiB
JavaScript
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 = '<h1 style="margin-top: 150px;text-align: center;direction: rtl;color: red;">فضای هاست پر میباشد.لطفا نسبت به پاک کردن بکاپ های قبلی یا افزایش فضای هاست اقدام فرمایید.</h1>'
|
|
|
|
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})
|
|
}
|
|
}
|
|
]
|