UNPKG

@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
"use strict"; 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); } }); }