126 lines
4.0 KiB
JavaScript
126 lines
4.0 KiB
JavaScript
"use strict";
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
const assert_1 = require("oak-domain/lib/utils/assert");
|
||
const index_backend_1 = require("../utils/cos/index.backend");
|
||
const uuid_1 = require("oak-domain/lib/utils/uuid");
|
||
const lodash_1 = require("oak-domain/lib/utils/lodash");
|
||
const Projection_1 = require("../types/Projection");
|
||
async function checkWhetherSuccess(context, applicationId, rows) {
|
||
const successIds = [];
|
||
const failedIds = [];
|
||
await context.setApplication(applicationId);
|
||
for (const d of rows) {
|
||
const { origin } = d;
|
||
const cos = (0, index_backend_1.getCosBackend)(origin);
|
||
(0, assert_1.assert)(cos);
|
||
const success = await cos.checkWhetherSuccess(context.getApplication(), d, context);
|
||
if (success) {
|
||
successIds.push(d.id);
|
||
}
|
||
else {
|
||
failedIds.push(d.id);
|
||
}
|
||
}
|
||
if (successIds.length > 0) {
|
||
await context.operate('extraFile', {
|
||
id: await (0, uuid_1.generateNewIdAsync)(),
|
||
action: 'update',
|
||
data: {
|
||
uploadState: 'success',
|
||
},
|
||
filter: {
|
||
id: {
|
||
$in: successIds,
|
||
}
|
||
}
|
||
}, {});
|
||
}
|
||
if (failedIds.length > 0) {
|
||
await context.operate('extraFile', {
|
||
id: await (0, uuid_1.generateNewIdAsync)(),
|
||
action: 'update',
|
||
data: {
|
||
uploadState: 'failed',
|
||
},
|
||
filter: {
|
||
id: {
|
||
$in: successIds,
|
||
}
|
||
}
|
||
}, {});
|
||
}
|
||
}
|
||
const watchers = [
|
||
{
|
||
name: '确定uploading的文件状态',
|
||
entity: 'extraFile',
|
||
filter: async () => {
|
||
const now = Date.now();
|
||
const deadline = process.env.NODE_ENV === 'production' ? now - 3600 * 1000 : now - 60 * 1000;
|
||
return {
|
||
$$updateAt$$: {
|
||
$lt: deadline,
|
||
},
|
||
uploadState: 'uploading',
|
||
enableChunkedUpload: {
|
||
$exists: false,
|
||
}
|
||
};
|
||
},
|
||
projection: {
|
||
id: 1,
|
||
applicationId: 1,
|
||
origin: 1,
|
||
bucket: 1,
|
||
uploadState: 1,
|
||
objectId: 1,
|
||
extension: 1,
|
||
},
|
||
fn: async (context, data) => {
|
||
const eg = (0, lodash_1.groupBy)(data, 'applicationId');
|
||
for (const appId in eg) {
|
||
await checkWhetherSuccess(context, appId, eg[appId]);
|
||
}
|
||
return {
|
||
extraFile: {
|
||
update: data.length,
|
||
}
|
||
};
|
||
}
|
||
},
|
||
{
|
||
name: '确定uploading的文件状态',
|
||
entity: 'extraFile',
|
||
filter: async () => {
|
||
const now = Date.now();
|
||
const deadline = process.env.NODE_ENV === 'production' ? now - 3 * 24 * 60 * 60 * 1000 : now - 60 * 1000;
|
||
return {
|
||
$$updateAt$$: {
|
||
$lt: deadline,
|
||
},
|
||
uploadState: 'uploading',
|
||
enableChunkedUpload: true
|
||
};
|
||
},
|
||
projection: {
|
||
...Projection_1.extraFileProjection,
|
||
application: {
|
||
...Projection_1.applicationProjection,
|
||
}
|
||
},
|
||
fn: async (context, data) => {
|
||
const eg = (0, lodash_1.groupBy)(data, 'applicationId');
|
||
for (const appId in eg) {
|
||
// 这里检查需要分片上传的文件信息,但是考虑到可能还在上传之类的,所以先不管,后面再处理
|
||
// 1. 要去查询分片信息,看看是不是都有etag了,如果都有etag了,就说明上传完成了,否则就标记为失败
|
||
}
|
||
return {
|
||
extraFile: {
|
||
update: data.length,
|
||
}
|
||
};
|
||
}
|
||
},
|
||
];
|
||
exports.default = watchers;
|