|
|
@@ -17,6 +17,7 @@ const { UploadJob } = require('./UploadJob');
|
|
|
const { DownloadJob } = require('./DownloadJob');
|
|
|
const { Order, SubOrder, File, Download } = require('./model');
|
|
|
const rimraf = require('rimraf');
|
|
|
+const fsUtils = require('nodejs-fs-utils');
|
|
|
|
|
|
if (!fs.existsSync(path.resolve(app.getPath('userData'), 'db'))) {
|
|
|
fs.mkdirSync(path.resolve(app.getPath('userData'), 'db'));
|
|
|
@@ -71,13 +72,16 @@ async function checkFalse() {
|
|
|
where: { status: DownloadStatus.DOWNLOADING, status: DownloadStatus.WAITING },
|
|
|
})).map(i => i.get());
|
|
|
downloadList.forEach(async i => {
|
|
|
- await db.Download.update({
|
|
|
- status: DownloadStatus.PAUSE,
|
|
|
- }, {
|
|
|
- where: {
|
|
|
- id: i.id,
|
|
|
+ await db.Download.update(
|
|
|
+ {
|
|
|
+ status: DownloadStatus.PAUSE,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ where: {
|
|
|
+ id: i.id,
|
|
|
+ },
|
|
|
},
|
|
|
- }, );
|
|
|
+ );
|
|
|
});
|
|
|
|
|
|
//上传
|
|
|
@@ -85,13 +89,16 @@ async function checkFalse() {
|
|
|
i.get(),
|
|
|
);
|
|
|
fileList.forEach(async i => {
|
|
|
- await db.File.update({
|
|
|
- status: UploadStatus.PAUSE,
|
|
|
- }, {
|
|
|
- where: {
|
|
|
- id: i.id,
|
|
|
+ await db.File.update(
|
|
|
+ {
|
|
|
+ status: UploadStatus.PAUSE,
|
|
|
},
|
|
|
- }, );
|
|
|
+ {
|
|
|
+ where: {
|
|
|
+ id: i.id,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ );
|
|
|
});
|
|
|
}
|
|
|
|
|
|
@@ -102,32 +109,11 @@ function sleep(ms) {
|
|
|
}
|
|
|
|
|
|
let initiated = false;
|
|
|
-const init = async() => {
|
|
|
+const init = async () => {
|
|
|
if (initiated) {
|
|
|
return;
|
|
|
}
|
|
|
- let records = (await db.File.findAll({
|
|
|
- where: {
|
|
|
- status: {
|
|
|
- [Op.not]: UploadStatus.FINISHED,
|
|
|
- },
|
|
|
- },
|
|
|
- })).map(i => i.get());
|
|
|
- console.log(records);
|
|
|
- records.forEach(i => {
|
|
|
- let job = new UploadJob(i, db);
|
|
|
- uploadQueue.push(job);
|
|
|
- });
|
|
|
-
|
|
|
- // let record = (await db.File.findOne({
|
|
|
- // where: {
|
|
|
- // status: {
|
|
|
- // [Op.not]: UploadStatus.FINISHED
|
|
|
- // }
|
|
|
- // }
|
|
|
- // })).get()
|
|
|
- // let job = new UploadJob(record, db)
|
|
|
- // uploadQueue.push(job)
|
|
|
+ resume();
|
|
|
|
|
|
initiated = true;
|
|
|
};
|
|
|
@@ -143,12 +129,42 @@ const PromiseQueue = arr => {
|
|
|
};
|
|
|
|
|
|
const pause = async arg => {
|
|
|
+ if (arg && arg.orderId) {
|
|
|
+ await db.Order.update(
|
|
|
+ {
|
|
|
+ pause: 1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ where: {
|
|
|
+ id: arg.orderId,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ );
|
|
|
+ await db.SubOrder.update(
|
|
|
+ { pause: 1 },
|
|
|
+ {
|
|
|
+ where: {
|
|
|
+ orderId: arg.orderId,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ );
|
|
|
+ }
|
|
|
+ if (arg && arg.subOrderId) {
|
|
|
+ await db.SubOrder.update(
|
|
|
+ { pause: 1 },
|
|
|
+ {
|
|
|
+ where: {
|
|
|
+ id: arg.subOrderId,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ );
|
|
|
+ }
|
|
|
eventBus.publish('pause', arg);
|
|
|
};
|
|
|
|
|
|
const resume = async arg => {
|
|
|
let records = [];
|
|
|
- if (arg.orderId) {
|
|
|
+ if (arg && arg.orderId) {
|
|
|
records = (await db.File.findAll({
|
|
|
where: {
|
|
|
orderId: arg.orderId,
|
|
|
@@ -157,7 +173,7 @@ const resume = async arg => {
|
|
|
},
|
|
|
},
|
|
|
})).map(i => i.get());
|
|
|
- } else if (arg.subOrderId) {
|
|
|
+ } else if (arg && arg.subOrderId) {
|
|
|
records = (await db.File.findAll({
|
|
|
where: {
|
|
|
subOrderId: arg.subOrderId,
|
|
|
@@ -166,7 +182,7 @@ const resume = async arg => {
|
|
|
},
|
|
|
},
|
|
|
})).map(i => i.get());
|
|
|
- } else if (arg.fileId) {
|
|
|
+ } else if (arg && arg.fileId) {
|
|
|
records = (await db.File.findAll({
|
|
|
where: {
|
|
|
id: arg.fileId,
|
|
|
@@ -176,9 +192,42 @@ const resume = async arg => {
|
|
|
},
|
|
|
})).map(i => i.get());
|
|
|
} else {
|
|
|
- records = (await db.File.findAll()).map(i => i.get());
|
|
|
+ records = (await db.File.findAll({
|
|
|
+ where: {
|
|
|
+ status: {
|
|
|
+ [Op.not]: UploadStatus.FINISHED,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ })).map(i => i.get());
|
|
|
}
|
|
|
- console.log(records);
|
|
|
+ let orderIds = [];
|
|
|
+ let subOrderIds = [];
|
|
|
+ records.forEach(i => {
|
|
|
+ if (orderIds.indexOf(i.orderId) === -1) {
|
|
|
+ orderIds.push(i.orderId);
|
|
|
+ }
|
|
|
+ if (subOrderIds.indexOf(i.subOrderId) === -1) {
|
|
|
+ subOrderIds.push(i.subOrderId);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ await db.Order.update(
|
|
|
+ {
|
|
|
+ pause: 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ where: {
|
|
|
+ id: orderIds,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ );
|
|
|
+ await db.SubOrder.update(
|
|
|
+ { pause: 0 },
|
|
|
+ {
|
|
|
+ where: {
|
|
|
+ id: subOrderIds,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ );
|
|
|
records.forEach(i => {
|
|
|
let job = new UploadJob(i, db);
|
|
|
uploadQueue.push(job);
|
|
|
@@ -186,27 +235,42 @@ const resume = async arg => {
|
|
|
};
|
|
|
|
|
|
const queryUnfinishedOrder = async userId => {
|
|
|
- let res = await sequelize.query(
|
|
|
- `SELECT
|
|
|
- o.*,
|
|
|
- fileNum,
|
|
|
- totalSize,
|
|
|
- uploadedSize
|
|
|
+ // let sql = `
|
|
|
+ // SELECT
|
|
|
+ // o.*,
|
|
|
+ // fileNum,
|
|
|
+ // totalSize,
|
|
|
+ // uploadedSize
|
|
|
+ // FROM
|
|
|
+ // Orders o
|
|
|
+ // JOIN ( SELECT SUM( size ) AS totalSize, SUM( progress * size ) AS uploadedSize, COUNT( * ) AS fileNum, orderId FROM Files GROUP BY orderId ) t ON o.id = t.orderId
|
|
|
+ // WHERE
|
|
|
+ // o.id IN (
|
|
|
+ // SELECT
|
|
|
+ // orderId
|
|
|
+ // FROM
|
|
|
+ // Files
|
|
|
+ // WHERE
|
|
|
+ // status != ${UploadStatus.FINISHED}
|
|
|
+ // GROUP BY
|
|
|
+ // orderId)
|
|
|
+ // and o.userId = ${userId}`;
|
|
|
+ let sql = `
|
|
|
+ SELECT
|
|
|
+ Orders.* ,
|
|
|
+ ( SELECT SUM( size ) FROM SubOrders WHERE SubOrders.orderId = Orders.id ) AS totalSize,
|
|
|
+ ( SELECT SUM( f0.progress * f0.size ) FROM Files f0 WHERE f0.orderId = Orders.id ) AS uploadedSize,
|
|
|
+ ( SELECT COUNT( f1.id ) FROM Files f1 WHERE f1.orderId = Orders.id ) AS fileNum
|
|
|
FROM
|
|
|
- Orders o
|
|
|
- JOIN ( SELECT SUM( size ) AS totalSize, SUM( progress * size ) AS uploadedSize, COUNT( * ) AS fileNum, orderId FROM Files GROUP BY orderId ) t ON o.id = t.orderId
|
|
|
+ Orders
|
|
|
+ JOIN Files ON Files.orderId = Orders.id
|
|
|
WHERE
|
|
|
- o.id IN (
|
|
|
- SELECT
|
|
|
- orderId
|
|
|
- FROM
|
|
|
- Files
|
|
|
- WHERE
|
|
|
- status != ${UploadStatus.FINISHED}
|
|
|
+ Files.status != ${UploadStatus.FINISHED}
|
|
|
+ AND Orders.userId = ${userId}
|
|
|
GROUP BY
|
|
|
- orderId)
|
|
|
- and o.userId = ${userId}`, { type: sequelize.QueryTypes.SELECT },
|
|
|
- );
|
|
|
+ Orders.id
|
|
|
+ `;
|
|
|
+ let res = await sequelize.query(sql, { type: sequelize.QueryTypes.SELECT });
|
|
|
return res;
|
|
|
};
|
|
|
|
|
|
@@ -223,7 +287,8 @@ const queryFinishedOrder = async userId => {
|
|
|
Orders
|
|
|
WHERE
|
|
|
totalNum = finishedNum AND userId= ${userId}
|
|
|
- order by updatedAt DESC`, { type: sequelize.QueryTypes.SELECT },
|
|
|
+ order by updatedAt DESC`,
|
|
|
+ { type: sequelize.QueryTypes.SELECT },
|
|
|
);
|
|
|
return res;
|
|
|
};
|
|
|
@@ -231,13 +296,19 @@ const queryFinishedOrder = async userId => {
|
|
|
const queryDetail = async orderId => {
|
|
|
let res = await sequelize.query(
|
|
|
`SELECT
|
|
|
- s.*,
|
|
|
+ s.id,
|
|
|
+ s.orderId,
|
|
|
+ s.parentId,
|
|
|
+ s.path,
|
|
|
+ s.name,
|
|
|
+ s.size AS totalSize,
|
|
|
+ s.pause,
|
|
|
+ s.createdAt,
|
|
|
+ s.updatedAt,
|
|
|
COUNT( * ) AS fileNum,
|
|
|
- SUM( size ) AS totalSize,
|
|
|
( SELECT COUNT( * ) FROM Files WHERE src LIKE '%.zip' AND subOrderId = s.id ) > 0 AS hasZip,
|
|
|
( SELECT COUNT( * ) FROM Files WHERE status = - 1 AND subOrderId = s.id ) > 0 AS packing,
|
|
|
- (
|
|
|
- SUM( progress * size ) / SUM( size )) AS progress,
|
|
|
+ ( SUM( progress * f.size ) / s.size) AS progress,
|
|
|
(
|
|
|
SELECT
|
|
|
a = b
|
|
|
@@ -255,7 +326,8 @@ const queryDetail = async orderId => {
|
|
|
WHERE
|
|
|
f.orderId = ${orderId}
|
|
|
GROUP BY
|
|
|
- f.subOrderId`, { type: sequelize.QueryTypes.SELECT },
|
|
|
+ f.subOrderId`,
|
|
|
+ { type: sequelize.QueryTypes.SELECT },
|
|
|
);
|
|
|
return res;
|
|
|
};
|
|
|
@@ -271,12 +343,14 @@ const checkClientOrder = async clientOrderId => {
|
|
|
FROM
|
|
|
Orders
|
|
|
WHERE
|
|
|
- clientOrderId = ${clientOrderId} `, { type: sequelize.QueryTypes.SELECT },
|
|
|
+ clientOrderId = ${clientOrderId} `,
|
|
|
+ { type: sequelize.QueryTypes.SELECT },
|
|
|
);
|
|
|
return res;
|
|
|
};
|
|
|
|
|
|
-const uploadOrder = async(topDir, prefixes, userId, clientOrderId) => {
|
|
|
+const uploadOrder = async (topDir, prefixes, userId, clientOrderId) => {
|
|
|
+ console.log(topDir, JSON.stringify(prefixes), userId, clientOrderId);
|
|
|
if (!prefixes instanceof Object) {
|
|
|
throw 'prefixes not found';
|
|
|
}
|
|
|
@@ -286,6 +360,7 @@ const uploadOrder = async(topDir, prefixes, userId, clientOrderId) => {
|
|
|
name: name,
|
|
|
userId: userId,
|
|
|
clientOrderId: clientOrderId,
|
|
|
+ pause: 0,
|
|
|
})).get();
|
|
|
let orderId = mainOrder.id;
|
|
|
|
|
|
@@ -317,6 +392,8 @@ const uploadOrder = async(topDir, prefixes, userId, clientOrderId) => {
|
|
|
parentId: mainOrder.id,
|
|
|
path: topDir,
|
|
|
name,
|
|
|
+ size: fsUtils.fsizeSync(topDir),
|
|
|
+ pause: 0,
|
|
|
})).get();
|
|
|
|
|
|
let outPath = path.resolve(archiveDir, uuidv1() + '.zip');
|
|
|
@@ -334,13 +411,19 @@ const uploadOrder = async(topDir, prefixes, userId, clientOrderId) => {
|
|
|
await readDir(topDir, orderId, subOrder.id, null, prefix);
|
|
|
let archiveFile = await archive(topDir, outPath);
|
|
|
let info = fs.statSync(archiveFile);
|
|
|
- await db.File.update({
|
|
|
- status: UploadStatus.WAITING,
|
|
|
- size: info.size,
|
|
|
- }, { where: { id: fileinfo.id } }, );
|
|
|
+ await sequelize.query(`UPDATE SubOrders
|
|
|
+ SET size = ( SELECT SUM( size ) FROM Files WHERE subOrderId = ${subOrder.id} )
|
|
|
+ WHERE id = ${subOrder.id}`);
|
|
|
+ await db.File.update(
|
|
|
+ {
|
|
|
+ status: UploadStatus.WAITING,
|
|
|
+ size: info.size,
|
|
|
+ },
|
|
|
+ { where: { id: fileinfo.id } },
|
|
|
+ );
|
|
|
uploadQueue.push(new UploadJob(fileinfo, db));
|
|
|
} else {
|
|
|
- for await (const child of fs.readdirSync(topDir)) {
|
|
|
+ fs.readdirSync(topDir).forEach(async child => {
|
|
|
if (!child.startsWith('.')) {
|
|
|
let prefix = prefixes[child];
|
|
|
let info = fs.statSync(path.resolve(topDir, child));
|
|
|
@@ -350,6 +433,8 @@ const uploadOrder = async(topDir, prefixes, userId, clientOrderId) => {
|
|
|
parentId: mainOrder.id,
|
|
|
path: path.resolve(topDir, child),
|
|
|
name: child,
|
|
|
+ size: fsUtils.fsizeSync(path.resolve(topDir, child)),
|
|
|
+ pause: 0,
|
|
|
})).get();
|
|
|
|
|
|
let outPath = path.resolve(archiveDir, uuidv1() + '.zip');
|
|
|
@@ -367,14 +452,21 @@ const uploadOrder = async(topDir, prefixes, userId, clientOrderId) => {
|
|
|
await readDir(path.resolve(topDir, child), orderId, subOrder.id, child, prefix);
|
|
|
let archiveFile = await archive(path.resolve(topDir, child), outPath);
|
|
|
let info = fs.statSync(archiveFile);
|
|
|
- await db.File.update({
|
|
|
- status: UploadStatus.WAITING,
|
|
|
- size: info.size,
|
|
|
- }, { where: { id: fileinfo.id } }, );
|
|
|
+ await db.File.update(
|
|
|
+ {
|
|
|
+ status: UploadStatus.WAITING,
|
|
|
+ size: info.size,
|
|
|
+ },
|
|
|
+ { where: { id: fileinfo.id } },
|
|
|
+ );
|
|
|
+ await sequelize.query(`
|
|
|
+ UPDATE SubOrders SET size = ( SELECT SUM( size ) FROM Files WHERE subOrderId = ${
|
|
|
+ subOrder.id
|
|
|
+ } ) WHERE id = ${subOrder.id}`);
|
|
|
uploadQueue.push(new UploadJob(fileinfo, db));
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ });
|
|
|
}
|
|
|
async function readDir(dir, orderId, subOrderId, relative, prefix) {
|
|
|
for await (const child of fs.readdirSync(dir)) {
|
|
|
@@ -423,7 +515,7 @@ const uploadOrder = async(topDir, prefixes, userId, clientOrderId) => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-const archive = async(dir, outPath) => {
|
|
|
+const archive = async (dir, outPath) => {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
// create a file to stream archive data to.
|
|
|
let output = fs.createWriteStream(outPath);
|
|
|
@@ -469,7 +561,7 @@ const archive = async(dir, outPath) => {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
-const clearDB = async() => {
|
|
|
+const clearDB = async () => {
|
|
|
await db.Order.destroy({ where: {} });
|
|
|
await db.SubOrder.destroy({ where: {} });
|
|
|
await db.File.destroy({ where: {} });
|
|
|
@@ -490,11 +582,14 @@ const downloadPause = async arg => {
|
|
|
|
|
|
const downloadResume = async arg => {
|
|
|
if (arg.id) {
|
|
|
- await db.Download.update({ status: DownloadStatus.WAITING }, {
|
|
|
- where: {
|
|
|
- id: arg.id,
|
|
|
+ await db.Download.update(
|
|
|
+ { status: DownloadStatus.WAITING },
|
|
|
+ {
|
|
|
+ where: {
|
|
|
+ id: arg.id,
|
|
|
+ },
|
|
|
},
|
|
|
- }, );
|
|
|
+ );
|
|
|
var record = await db.Download.findOne({ where: { id: arg.id } });
|
|
|
|
|
|
console.log(record);
|
|
|
@@ -509,7 +604,8 @@ const queryUnfinishedDownloadOrder = async userId => {
|
|
|
FROM
|
|
|
Downloads
|
|
|
WHERE
|
|
|
- userId = ${userId} AND status != ${DownloadStatus.FINISHED}`, { type: sequelize.QueryTypes.SELECT },
|
|
|
+ userId = ${userId} AND status != ${DownloadStatus.FINISHED}`,
|
|
|
+ { type: sequelize.QueryTypes.SELECT },
|
|
|
);
|
|
|
return res;
|
|
|
};
|
|
|
@@ -522,7 +618,8 @@ const queryfinishedDownloadOrder = async userId => {
|
|
|
Downloads
|
|
|
WHERE
|
|
|
userId = ${userId} AND status = ${DownloadStatus.FINISHED}
|
|
|
- order by updatedAt DESC`, { type: sequelize.QueryTypes.SELECT },
|
|
|
+ order by updatedAt DESC`,
|
|
|
+ { type: sequelize.QueryTypes.SELECT },
|
|
|
);
|
|
|
return res;
|
|
|
};
|
|
|
@@ -534,10 +631,10 @@ async function getFilePath(pathName, i) {
|
|
|
_path = path.resolve(
|
|
|
window.localStorage['downLoadingPath2'],
|
|
|
path.basename(pathName, path.extname(pathName)) +
|
|
|
- '(' +
|
|
|
- i +
|
|
|
- ')' +
|
|
|
- path.extname(pathName),
|
|
|
+ '(' +
|
|
|
+ i +
|
|
|
+ ')' +
|
|
|
+ path.extname(pathName),
|
|
|
);
|
|
|
}
|
|
|
var exist = await fs.existsSync(_path);
|
|
|
@@ -548,7 +645,7 @@ async function getFilePath(pathName, i) {
|
|
|
return _path;
|
|
|
}
|
|
|
|
|
|
-const downloadFile = async(objectName, orderName, userId, quantity, userOrderId) => {
|
|
|
+const downloadFile = async (objectName, orderName, userId, quantity, userOrderId) => {
|
|
|
let pathName = await getFilePath(userOrderId + '_' + orderName, 0);
|
|
|
let download = (await db.Download.create({
|
|
|
dst: objectName,
|
|
|
@@ -564,7 +661,7 @@ const downloadFile = async(objectName, orderName, userId, quantity, userOrderId)
|
|
|
})).get();
|
|
|
downloadQueue.push(new DownloadJob(download, db));
|
|
|
};
|
|
|
-const clearCache = async() => {
|
|
|
+const clearCache = async () => {
|
|
|
rmDir = function(dirPath) {
|
|
|
try {
|
|
|
var files = fs.readdirSync(dirPath);
|
|
|
@@ -583,6 +680,21 @@ const clearCache = async() => {
|
|
|
};
|
|
|
window.clearCache = clearCache;
|
|
|
|
|
|
+const deleteUploadedFile = async () => {
|
|
|
+ let files = await db.File.findAll({
|
|
|
+ where: {
|
|
|
+ status: UploadStatus.FINISHED,
|
|
|
+ },
|
|
|
+ }).map(i => i.get());
|
|
|
+ files.forEach(i => {
|
|
|
+ fs.unlink(i.src, err => {
|
|
|
+ if (!err) {
|
|
|
+ console.log(`${i.src} deleted`);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
export default {
|
|
|
init,
|
|
|
pause,
|
|
|
@@ -599,4 +711,5 @@ export default {
|
|
|
queryUnfinishedDownloadOrder,
|
|
|
queryfinishedDownloadOrder,
|
|
|
checkClientOrder,
|
|
|
-};
|
|
|
+ deleteUploadedFile,
|
|
|
+};
|