263 lines
9.6 KiB
JavaScript
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);
|
|
});
|
|
}
|