@crowdin/app-project-module
Version:
Module that generates for you all common endpoints for serving standalone Crowdin App
138 lines (137 loc) • 7.25 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCrowdinSnapshot = getCrowdinSnapshot;
exports.getIntegrationSnapshot = getIntegrationSnapshot;
exports.createOrUpdateFileSnapshot = createOrUpdateFileSnapshot;
const types_1 = require("../types");
const storage_1 = require("../../../storage");
const defaults_1 = require("./defaults");
const files_1 = require("./files");
const types_2 = require("./types");
const DEFAULT_SNAPSHOT_FETCH_CONCURRENCY = 1;
function getCrowdinSnapshot(config, integration, crowdinApiClient, projectId, integrationSettings) {
return __awaiter(this, void 0, void 0, function* () {
let files = [];
if (integration.getCrowdinFiles) {
const rootFolder = yield (0, defaults_1.getRootFolder)(config, integration, crowdinApiClient, projectId);
files = yield integration.getCrowdinFiles({
projectId,
client: crowdinApiClient,
rootFolder,
settings: integrationSettings,
});
}
return files;
});
}
function getTreeItems(integrationData) {
let files = [];
if ((0, files_1.isExtendedResultType)(integrationData)) {
files = integrationData.data;
}
else {
files = integrationData;
}
return files;
}
function getOneLevelFetchingFiles(integration_1, integrationCredentials_1, integrationSettings_1, parentFiles_1, client_1, projectId_1, job_1) {
return __awaiter(this, arguments, void 0, function* (integration, integrationCredentials, integrationSettings, parentFiles, client, projectId, job, visitedIds = new Set()) {
var _a;
const folders = parentFiles.filter((file) => !file.type && !visitedIds.has(file.id));
if (folders.length === 0) {
return parentFiles;
}
const concurrency = (_a = integration.snapshotFetchConcurrency) !== null && _a !== void 0 ? _a : DEFAULT_SNAPSHOT_FETCH_CONCURRENCY;
const results = [];
for (let i = 0; i < folders.length; i += concurrency) {
const batch = folders.slice(i, i + concurrency);
const batchResults = yield Promise.all(batch.map((folder) => __awaiter(this, void 0, void 0, function* () {
var _a;
if (job && types_2.JobStatus.CANCELED === ((_a = (yield job.get())) === null || _a === void 0 ? void 0 : _a.status)) {
throw new Error('Job canceled');
}
visitedIds.add(folder.id);
const childs = getTreeItems(yield integration.getIntegrationFiles({
credentials: integrationCredentials,
client,
projectId,
settings: integrationSettings,
parentId: folder.id,
search: '',
page: 0,
}));
if (job) {
yield job.update({ info: `Loading snapshot from ${folder.name}` });
}
if (childs.length === 0) {
return [];
}
return getOneLevelFetchingFiles(integration, integrationCredentials, integrationSettings, childs, client, projectId, job, visitedIds);
})));
results.push(...batchResults.flat());
}
return [...parentFiles, ...results];
});
}
function getIntegrationSnapshot(_a) {
return __awaiter(this, arguments, void 0, function* ({ integration, integrationCredentials, integrationSettings, client, projectId, job, }) {
var _b;
let files = [];
let integrationData = [];
integrationData = yield integration.getIntegrationFiles({
credentials: integrationCredentials,
client,
projectId,
settings: integrationSettings,
search: '',
page: 0,
});
files = getTreeItems(integrationData);
if (integration.integrationOneLevelFetching) {
files = yield getOneLevelFetchingFiles(integration, integrationCredentials, integrationSettings, files, client, projectId, job);
}
if ((integrationSettings === null || integrationSettings === void 0 ? void 0 : integrationSettings.skipIntegrationNodesToggle) === true ||
((integrationSettings === null || integrationSettings === void 0 ? void 0 : integrationSettings.skipIntegrationNodesToggle) === null && ((_b = integration.skipIntegrationNodesToggle) === null || _b === void 0 ? void 0 : _b.value))) {
files = (0, files_1.skipFilesByRegex)(files, integration.skipIntegrationNodes);
}
// trick for compatibility in requests and set files
files = files.map((file) => (Object.assign(Object.assign({}, file), { parentId: file.parent_id || file.parentId, parent_id: file.parent_id || file.parentId, node_type: file.nodeType || file.node_type })));
return files;
});
}
function createOrUpdateFileSnapshot(config, integration, req, provider, job) {
return __awaiter(this, void 0, void 0, function* () {
let files = [];
const existingSnapshot = yield (0, storage_1.getStorage)().getFilesSnapshot(req.crowdinContext.clientId, req.crowdinContext.crowdinId, provider);
if (provider === types_1.Provider.CROWDIN) {
files = yield getCrowdinSnapshot(config, integration, req.crowdinApiClient, req.crowdinContext.jwtPayload.context.project_id, req.integrationSettings);
}
if (provider === types_1.Provider.INTEGRATION) {
files = yield getIntegrationSnapshot({
integration,
integrationCredentials: req.integrationCredentials,
integrationSettings: req.integrationSettings,
client: req.crowdinApiClient,
projectId: req.crowdinContext.jwtPayload.context.project_id,
job,
});
}
if (existingSnapshot) {
req.logInfo(`Updating file snapshot for provider ${provider} ${JSON.stringify(files, null, 2)}`);
yield (0, storage_1.getStorage)().updateFilesSnapshot(JSON.stringify(files), req.crowdinContext.clientId, req.crowdinContext.crowdinId, provider);
}
else {
req.logInfo(`Saving file snapshot for provider ${provider} ${JSON.stringify(files, null, 2)}`);
yield (0, storage_1.getStorage)().saveFilesSnapshot(JSON.stringify(files), req.crowdinContext.clientId, req.crowdinContext.crowdinId, provider);
}
});
}