UNPKG

@crowdin/app-project-module

Version:

Module that generates for you all common endpoints for serving standalone Crowdin App

134 lines (133 loc) 6.81 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 }); const storage_1 = require("../../../storage"); const util_1 = require("../../../util"); const logger_1 = require("../../../util/logger"); const webhooks_1 = require("../util/webhooks"); const types_1 = require("../types"); const cron_1 = require("../util/cron"); const files_1 = require("../util/files"); function filterSyncFiles(args) { var _a, _b; return __awaiter(this, void 0, void 0, function* () { const { projectId, crowdinClient, events, syncFileSettings, appSettings } = args; const files = {}; let projectData; const addFileToResponse = (fileId, languages) => { if (files[fileId]) { files[fileId] = [...new Set([...files[fileId], ...languages])]; } else { files[fileId] = languages; } }; for (const event of events) { const fileId = event.fileId; const language = event.language; // sync all new files if (event.event === webhooks_1.HookEvents.fileAdded && appSettings['new-crowdin-files']) { if (!projectData) { projectData = yield crowdinClient.projectsGroupsApi.getProject(projectId); } const projectLanguages = projectData.data.targetLanguageIds; if (projectData.data.inContext) { projectLanguages.push(projectData.data.inContextPseudoLanguageId); } addFileToResponse(fileId, projectLanguages); continue; } // sync file that was selected for sync schedule if (syncFileSettings[fileId]) { if (!syncFileSettings[fileId].includes(language)) { continue; } addFileToResponse(fileId, [language]); } else { try { const crowdinFile = yield crowdinClient.sourceFilesApi.getFile(projectId, fileId); // sync file that in selected for sync schedule directory if (syncFileSettings[(_a = crowdinFile === null || crowdinFile === void 0 ? void 0 : crowdinFile.data) === null || _a === void 0 ? void 0 : _a.directoryId] && syncFileSettings[(_b = crowdinFile === null || crowdinFile === void 0 ? void 0 : crowdinFile.data) === null || _b === void 0 ? void 0 : _b.directoryId].includes(language)) { addFileToResponse(fileId, [language]); } } catch (e) { (0, logger_1.logError)(e); } } } return files; }); } function handle(config, integration) { return (0, util_1.runAsyncWrapper)((req, res) => __awaiter(this, void 0, void 0, function* () { var _a, _b; const urlParam = (_a = integration.webhooks) === null || _a === void 0 ? void 0 : _a.urlParam; const webhookUrlParam = req.query[urlParam]; let filesToSync; if (webhookUrlParam) { const { projectId, crowdinClient, rootFolder, appSettings, syncSettings } = yield (0, webhooks_1.prepareWebhookData)({ config, integration, webhookUrlParam, provider: types_1.Provider.CROWDIN, }); if (!crowdinClient) { (0, logger_1.temporaryErrorDebug)('Access denied: crowdin-webhooks', req); return res.status(403).send({ error: 'Access denied' }); } if (!syncSettings) { return res.status(200).send({ message: 'Sync is not configured' }); } const syncFileSettings = (0, files_1.prepareSyncFiles)(JSON.parse(syncSettings.files)); if ((_b = integration.webhooks) === null || _b === void 0 ? void 0 : _b.crowdinWebhookInterceptor) { filesToSync = yield integration.webhooks.crowdinWebhookInterceptor(projectId, crowdinClient.client, rootFolder, appSettings, syncSettings, req.body); } else { filesToSync = yield filterSyncFiles({ projectId, crowdinClient: crowdinClient.client, events: req.body.events, syncFileSettings, appSettings, }); } for (const eventPayload of req.body.events) { if (eventPayload.event === webhooks_1.HookEvents.fileDeleted) { yield (0, storage_1.getStorage)().deleteWebhooks([eventPayload.fileId], syncSettings.integrationId, syncSettings.crowdinId, syncSettings.provider); delete filesToSync[eventPayload.fileId]; delete syncFileSettings[eventPayload.fileId]; } } const crowdinFiles = yield (0, cron_1.filterFilesFromIntegrationRequest)({ config, integration, projectId, crowdinFiles: filesToSync, crowdinClient: crowdinClient.client, }); for (const fileId in crowdinFiles) { const webhook = yield (0, storage_1.getStorage)().getWebhooks(fileId, syncSettings.integrationId, syncSettings.crowdinId, syncSettings.provider); if (!webhook) { yield (0, storage_1.getStorage)().saveWebhooks(fileId, syncSettings.integrationId, syncSettings.crowdinId, syncSettings.provider); } } const newFileIds = Object.keys(crowdinFiles).filter((fileId) => !syncFileSettings[fileId]); if (newFileIds.length) { yield (0, storage_1.getStorage)().updateSyncSettings(JSON.stringify(Object.assign(Object.assign({}, syncFileSettings), crowdinFiles)), syncSettings.integrationId, syncSettings.crowdinId, 'schedule', syncSettings.provider); } res.send({}); } })); } exports.default = handle;