Shinobi/libs/fileBin.js

263 lines
9.6 KiB
JavaScript

var fs = require('fs')
var moment = require('moment')
module.exports = function(s,config,lang,app,io){
const getFileBinDirectory = function(monitor){
return s.dir.fileBin + monitor.ke + '/' + monitor.mid + '/'
}
const getFileBinEntry = (options) => {
return new Promise((resolve, reject) => {
s.knexQuery({
action: "select",
columns: "*",
table: "Files",
where: options
},(err,rows) => {
if(rows[0]){
resolve(rows[0])
}else{
resolve()
}
})
})
}
const getFileBinEntries = (options) => {
return new Promise((resolve, reject) => {
s.knexQuery({
action: "select",
columns: "*",
table: "Files",
where: options
},(err,rows) => {
if(rows){
resolve(rows)
}else{
resolve([])
}
})
})
}
const updateFileBinEntry = (options) => {
return new Promise((resolve, reject) => {
const groupKey = options.ke
const monitorId = options.mid
const filename = options.name
const update = options.update
if(!filename){
resolve('No Filename')
return
}
if(!update){
resolve('No Update Options')
return
}
s.knexQuery({
action: "select",
columns: "size",
table: "Files",
where: {
ke: groupKey,
mid: monitorId,
name: filename,
}
},(err,rows) => {
if(rows[0]){
const fileSize = rows[0].size
s.knexQuery({
action: "update",
table: "Files",
where: {
ke: groupKey,
mid: monitorId,
name: filename,
},
update: update
},(err) => {
resolve()
if(update.size){
s.setDiskUsedForGroup(groupKey,-(fileSize/1048576),'fileBin')
s.setDiskUsedForGroup(groupKey,(update.size/1048576),'fileBin')
s.purgeDiskForGroup(groupKey)
}
})
}else{
resolve()
}
})
})
}
const deleteFileBinEntry = (options) => {
return new Promise((resolve, reject) => {
const groupKey = options.ke
const monitorId = options.mid
const filename = options.name
const whereQuery = {
ke: groupKey,
mid: monitorId,
name: filename,
}
if(!filename){
resolve('No Filename')
return
}
const deleteRow = (fileSize) => {
s.knexQuery({
action: "delete",
table: "Files",
where: whereQuery
},(err,r) => {
resolve()
s.file('delete',getFileBinDirectory(whereQuery) + filename)
s.setDiskUsedForGroup(groupKey,-(fileSize/1048576),'fileBin')
s.purgeDiskForGroup(groupKey)
})
}
if(options.size){
deleteRow(options.size)
}else{
s.knexQuery({
action: "select",
columns: "size",
table: "Files",
where: whereQuery
},(err,rows) => {
if(rows[0]){
const fileSize = rows[0].size
deleteRow(fileSize)
}else{
resolve()
}
})
}
})
}
const insertFileBinEntry = (options) => {
return new Promise((resolve, reject) => {
const groupKey = options.ke
const monitorId = options.mid
const filename = options.name
if(!filename){
resolve('No Filename')
return
}
const monitorFileBinDirectory = getFileBinDirectory({ke: groupKey,mid: monitorId,})
const fileSize = options.size || fs.lstatSync(monitorFileBinDirectory + filename).size
const details = options.details instanceof Object ? JSON.stringify(options.details) : options.details
const status = options.status || 0
const time = options.time || new Date()
s.knexQuery({
action: "insert",
table: "Files",
insert: {
ke: groupKey,
mid: monitorId,
name: filename,
size: fileSize,
details: details,
status: status,
time: time,
}
},(err) => {
resolve()
s.setDiskUsedForGroup(groupKey,(fileSize/1048576),'fileBin')
s.purgeDiskForGroup(groupKey)
})
})
}
s.getFileBinDirectory = getFileBinDirectory
s.getFileBinEntry = getFileBinEntry
s.insertFileBinEntry = insertFileBinEntry
s.updateFileBinEntry = updateFileBinEntry
s.deleteFileBinEntry = deleteFileBinEntry
/**
* API : Get fileBin file rows
*/
app.get([config.webPaths.apiPrefix+':auth/fileBin/:ke',config.webPaths.apiPrefix+':auth/fileBin/:ke/:id'],async (req,res) => {
s.auth(req.params,(user) => {
const userDetails = user.details
const monitorId = req.params.id
const groupKey = req.params.ke
const hasRestrictions = userDetails.sub && userDetails.allmonitors !== '1';
s.sqlQueryBetweenTimesWithPermissions({
table: 'Files',
user: user,
groupKey: req.params.ke,
monitorId: req.params.id,
startTime: req.query.start,
endTime: req.query.end,
startTimeOperator: req.query.startOperator,
endTimeOperator: req.query.endOperator,
limit: req.query.limit,
endIsStartTo: true,
noFormat: true,
noCount: true,
preliminaryValidationFailed: (
user.permissions.get_monitors === "0"
)
},(response) => {
response.forEach(function(v){
v.details = s.parseJSON(v.details)
v.href = '/'+req.params.auth+'/fileBin/'+req.params.ke+'/'+req.params.id+'/'+v.details.year+'/'+v.details.month+'/'+v.details.day+'/'+v.name;
})
s.closeJsonResponse(res,{
ok: true,
files: response
})
})
},res,req);
});
/**
* API : Get fileBin file
*/
app.get([
config.webPaths.apiPrefix+':auth/fileBin/:ke/:id/:file',
config.webPaths.apiPrefix+':auth/fileBin/:ke/:id/:year/:month/:day/:file',
], async (req,res) => {
s.auth(req.params,function(user){
var failed = function(){
res.end(user.lang['File Not Found'])
}
if (!s.group[req.params.ke].fileBin[req.params.id+'/'+req.params.file]){
const groupKey = req.params.ke
const monitorId = req.params.id
const monitorRestrictions = s.getMonitorRestrictions(user.details,monitorId)
if(user.details.sub && user.details.allmonitors === '0' && (user.permissions.get_monitors === "0" || monitorRestrictions.length === 0)){
s.closeJsonResponse(res,{
ok: false,
msg: lang['Not Permitted']
})
return
}
s.knexQuery({
action: "select",
columns: "*",
table: "Files",
where: [
['ke','=',groupKey],
['mid','=',req.params.id],
['name','=',req.params.file],
monitorRestrictions
]
},(err,r) => {
if(r && r[0]){
r = r[0]
r.details = JSON.parse(r.details)
const filePath = s.dir.fileBin + req.params.ke + '/' + req.params.id + (r.details.year && r.details.month && r.details.day ? '/' + r.details.year + '/' + r.details.month + '/' + r.details.day : '') + '/' + req.params.file;
fs.stat(filePath,function(err,stats){
if(!err){
res.on('finish',function(){res.end()})
fs.createReadStream(filePath).pipe(res)
}else{
failed()
}
})
}else{
failed()
}
})
}else{
res.end(user.lang['Please Wait for Completion'])
}
},res,req);
});
}