oak-general-business/es/watchers/extraFile.js

87 lines
2.4 KiB
JavaScript

import { assert } from 'oak-domain/lib/utils/assert';
import { getCos } from '../utils/cos';
import { generateNewIdAsync } from 'oak-domain';
import { groupBy } from 'oak-domain/lib/utils/lodash';
async function checkWhetherSuccess(context, applicationId, rows) {
const successIds = [];
const failedIds = [];
await context.setApplication(applicationId);
for (const d of rows) {
const { origin } = d;
const cos = getCos(origin);
assert(cos);
const success = await cos.checkWhetherSuccess(d, context);
if (success) {
successIds.push(d.id);
}
else {
failedIds.push(d.id);
}
}
if (successIds.length > 0) {
await context.operate('extraFile', {
id: await generateNewIdAsync(),
action: 'update',
data: {
uploadState: 'success',
},
filter: {
id: {
$in: successIds,
}
}
}, {});
}
if (failedIds.length > 0) {
await context.operate('extraFile', {
id: await 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',
};
},
projection: {
id: 1,
applicationId: 1,
origin: 1,
bucket: 1,
uploadState: 1,
objectId: 1,
extension: 1,
},
fn: async (context, data) => {
const eg = groupBy(data, 'applicationId');
for (const appId in eg) {
await checkWhetherSuccess(context, appId, eg[appId]);
}
return {
extraFile: {
update: data.length,
}
};
}
},
];
export default watchers;