119 lines
4.7 KiB
JavaScript
119 lines
4.7 KiB
JavaScript
"use strict";
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
const tslib_1 = require("tslib");
|
||
const index_backend_1 = require("../utils/cos/index.backend");
|
||
const Exception_1 = require("oak-domain/lib/types/Exception");
|
||
const Projection_1 = require("../types/Projection");
|
||
const assert_1 = tslib_1.__importDefault(require("assert"));
|
||
const triggers = [
|
||
{
|
||
name: '生成extraFile需要的上传meta',
|
||
when: 'before',
|
||
entity: 'extraFile',
|
||
action: 'create',
|
||
priority: 9,
|
||
fn: async ({ operation }, context) => {
|
||
const { data } = operation;
|
||
let cachedOrigin = undefined;
|
||
const getCosOrigin = async () => {
|
||
if (cachedOrigin) {
|
||
return cachedOrigin;
|
||
}
|
||
const [application] = await context.select("application", {
|
||
data: {
|
||
config: 1,
|
||
system: {
|
||
config: 1,
|
||
platform: {
|
||
config: 1
|
||
}
|
||
}
|
||
},
|
||
filter: {
|
||
id: context.getApplicationId(),
|
||
},
|
||
}, {
|
||
dontCollect: true
|
||
});
|
||
(0, assert_1.default)(application, `找不到 当前应用程序`);
|
||
cachedOrigin = application.config?.cos?.defaultOrigin ||
|
||
application.system?.config?.Cos?.defaultOrigin ||
|
||
application.system?.platform?.config?.Cos?.defaultOrigin;
|
||
return cachedOrigin;
|
||
};
|
||
const formMeta = async (data) => {
|
||
// 如果提供了就用提供的origin,否则尝试从应用程序、系统配置、平台配置中获取默认的Cos源
|
||
const configOrigin = data.origin || await getCosOrigin();
|
||
data.origin = configOrigin;
|
||
(0, assert_1.default)(configOrigin, `extraFile的origin未指定,且应用程序、系统配置、平台配置中也没有默认的Cos源,请检查`);
|
||
if (!data.applicationId) {
|
||
data.applicationId = context.getApplicationId();
|
||
}
|
||
if (configOrigin === 'unknown') {
|
||
Object.assign(data, {
|
||
uploadState: 'success',
|
||
});
|
||
return;
|
||
}
|
||
const cos = (0, index_backend_1.getCosBackend)(configOrigin);
|
||
if (!cos) {
|
||
throw new Exception_1.OakException(`origin为${configOrigin}的extraFile没有定义Cos类,请调用registerCos注入`);
|
||
}
|
||
await cos.formUploadMeta(context.getApplication(), data);
|
||
Object.assign(data, {
|
||
uploadState: 'uploading',
|
||
});
|
||
};
|
||
if (data instanceof Array) {
|
||
await Promise.all(data.map(ele => formMeta(ele)));
|
||
return data.length;
|
||
}
|
||
await formMeta(data);
|
||
return 1;
|
||
}
|
||
},
|
||
{
|
||
name: '删除extraFile时远端也进行删除',
|
||
when: 'commit',
|
||
strict: 'makeSure',
|
||
entity: 'extraFile',
|
||
action: 'remove',
|
||
fn: async ({ ids }, context) => {
|
||
const fn = context.openRootMode();
|
||
const rows = await context.select('extraFile', {
|
||
data: {
|
||
id: 1,
|
||
origin: 1,
|
||
objectId: 1,
|
||
bucket: 1,
|
||
extension: 1,
|
||
entity: 1,
|
||
entityId: 1,
|
||
extra2: 1,
|
||
applicationId: 1,
|
||
application: Projection_1.applicationProjection
|
||
},
|
||
filter: {
|
||
id: { $in: ids },
|
||
},
|
||
}, { includedDeleted: true });
|
||
for (const extraFile of rows) {
|
||
const { origin, objectId, application } = extraFile;
|
||
// 用objectId来去重,只有当没有还有效的objectId方可删除
|
||
const count = await context.count('extraFile', {
|
||
filter: {
|
||
objectId: objectId,
|
||
},
|
||
}, {});
|
||
if (count === 0) {
|
||
const uploader = (0, index_backend_1.getCosBackend)(origin);
|
||
const application2 = context.getApplication(true) || application;
|
||
await uploader.removeFile(application2, extraFile);
|
||
}
|
||
}
|
||
fn();
|
||
}
|
||
},
|
||
];
|
||
exports.default = triggers;
|