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