UNPKG

@crowdin/app-project-module

Version:

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

246 lines (245 loc) 10.9 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()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateOrCreateFile = updateOrCreateFile; exports.getFolder = getFolder; exports.getOrCreateFolder = getOrCreateFolder; exports.uploadTranslations = uploadTranslations; exports.updateSourceFiles = updateSourceFiles; exports.handleTranslations = handleTranslations; exports.createOrUpdateWebhook = createOrUpdateWebhook; exports.getSubscription = getSubscription; exports.generateReport = generateReport; const axios_1 = __importDefault(require("axios")); const types_1 = require("../../types"); function updateOrCreateFile(options) { return __awaiter(this, void 0, void 0, function* () { const storageFile = yield options.client.uploadStorageApi.addStorage(options.name, options.data); if (options.file) { yield options.client.sourceFilesApi.updateOrRestoreFile(options.projectId, options.file.id, Object.assign({ storageId: storageFile.data.id }, (options.importOptions && { importOptions: options.importOptions }))); const updates = []; if (options.title && options.title !== options.file.title) { updates.push({ value: options.title, op: 'replace', path: '/title', }); } if (options.excludedTargetLanguages) { updates.push({ value: options.excludedTargetLanguages, op: 'replace', path: '/excludedTargetLanguages', }); } if (updates.length > 0) { yield options.client.sourceFilesApi.editFile(options.projectId, options.file.id, updates); } return options.file.id; } else { const newFile = yield options.client.sourceFilesApi.createFile(options.projectId, { storageId: storageFile.data.id, name: options.name, title: options.title, type: options.type, directoryId: options.directoryId, excludedTargetLanguages: options.excludedTargetLanguages, importOptions: options.importOptions, }); return newFile.data.id; } }); } function getFolder(args) { return __awaiter(this, void 0, void 0, function* () { const folder = args.directories.find((d) => { var _a; return d.name === args.directoryName && ((!args.parentDirectory && !d.directoryId) || d.directoryId === ((_a = args.parentDirectory) === null || _a === void 0 ? void 0 : _a.id)); }); let files = []; if (folder) { files = (yield args.client.sourceFilesApi.withFetchAll().listProjectFiles(args.projectId, { directoryId: folder.id })).data.map((e) => e.data); } return { folder, files }; }); } function getOrCreateFolder(args) { return __awaiter(this, void 0, void 0, function* () { let { folder, files } = yield getFolder(args); let created = false; if (!folder) { created = true; folder = (yield args.client.sourceFilesApi.createDirectory(args.projectId, { name: args.directoryName, directoryId: args.parentDirectory ? args.parentDirectory.id : undefined, })).data; files = (yield args.client.sourceFilesApi.withFetchAll().listProjectFiles(args.projectId, { directoryId: folder.id })).data.map((e) => e.data); } return { folder, files, created }; }); } function uploadTranslations(args) { return __awaiter(this, void 0, void 0, function* () { const storage = yield args.client.uploadStorageApi.addStorage(args.fileName, args.fileContent); return (yield args.client.translationsApi.uploadTranslation(args.projectId, args.language, Object.assign({ fileId: args.fileId, storageId: storage.data.id }, (args.request || {})))).data; }); } function updateSourceFiles(args) { return __awaiter(this, void 0, void 0, function* () { const directories = yield args.client.sourceFilesApi.withFetchAll().listProjectDirectories(args.projectId); const { folder, files } = yield getOrCreateFolder({ directories: directories.data.map((d) => d.data), client: args.client, projectId: args.projectId, directoryName: args.directory, parentDirectory: args.parentDirectory, }); yield Promise.all(args.fileEntities.map((fileEntity) => __awaiter(this, void 0, void 0, function* () { return yield updateOrCreateFile({ client: args.client, projectId: args.projectId, name: fileEntity.name, title: fileEntity.title, type: fileEntity.type, directoryId: folder.id, data: fileEntity.data, file: files.find((f) => f.name === fileEntity.name), }); }))); }); } function handleTranslations(args) { return __awaiter(this, void 0, void 0, function* () { const directories = yield args.client.sourceFilesApi.withFetchAll().listProjectDirectories(args.projectId); const { files } = yield getFolder({ directories: directories.data.map((d) => d.data), client: args.client, projectId: args.projectId, directoryName: args.directory, parentDirectory: args.parentDirectory, }); for (const [fileId, targetLanguages] of Object.entries(args.request)) { const file = files.find((f) => f.id === parseInt(fileId)); if (!file) { continue; } yield Promise.all(targetLanguages.map((languageCode) => __awaiter(this, void 0, void 0, function* () { const translationsLink = yield args.client.translationsApi.buildProjectFileTranslation(args.projectId, file.id, { targetLanguageId: languageCode, }); if (!translationsLink) { return; } const response = yield axios_1.default.get(translationsLink.data.url); yield args.handleFn(response.data, languageCode, file); }))); } }); } function createOrUpdateWebhook(args) { return __awaiter(this, void 0, void 0, function* () { const { client, projectId, events, name, url, payload, requestType = 'POST', batchingEnabled = true, headers, contentType, webhookId, webhookMatch, } = args; let id = webhookId; if (webhookMatch) { const webhooks = yield client.webhooksApi.withFetchAll().listWebhooks(projectId); const webhook = webhooks.data.find((e) => webhookMatch(e.data)); if (webhook) { id = webhook.data.id; } } if (id) { yield client.webhooksApi.editWebhook(projectId, id, [ { value: events, op: 'replace', path: '/events', }, { value: payload, op: 'replace', path: '/payload', }, { value: url, op: 'replace', path: '/url', }, ]); return id; } else { const newWebhook = yield client.webhooksApi.addWebhook(projectId, { name, url, events, requestType, payload, batchingEnabled, headers, contentType, }); return newWebhook.data.id; } }); } function getSubscription(_a) { return __awaiter(this, arguments, void 0, function* ({ appIdentifier, token, organization, baseUrl, }) { var _b, _c, _d, _e; let requestUrl; if (baseUrl) { requestUrl = `${baseUrl}/api/v2/applications/${appIdentifier}/subscription`; } else if (!!organization) { requestUrl = `https://${organization}.api.crowdin.com/api/v2/applications/${appIdentifier}/subscription`; } else { requestUrl = `https://crowdin.com/api/v2/applications/${appIdentifier}/subscription`; } try { const response = yield axios_1.default.get(requestUrl, { headers: { Authorization: `Bearer ${token}`, }, }); return response.data; } catch (error) { const e = error; if (e.response) { if (e.response.status === 402) { throw new types_1.PaymentRequiredError((_b = e.response.data) === null || _b === void 0 ? void 0 : _b.subscribeLink, (_c = e.response.data) === null || _c === void 0 ? void 0 : _c.initializedAt); } else if ((_e = (_d = e.response.data) === null || _d === void 0 ? void 0 : _d.error) === null || _e === void 0 ? void 0 : _e.message) { throw new Error(e.response.data.error.message); } } throw e; } }); } function generateReport(_a) { return __awaiter(this, arguments, void 0, function* ({ client, projectId, request, }) { const report = yield client.reportsApi.generateReport(projectId, request); while (true) { const status = yield client.reportsApi.checkReportStatus(projectId, report.data.identifier); if (status.data.status === 'finished') { const downloadRes = yield client.reportsApi.downloadReport(projectId, report.data.identifier); const reportBlob = yield axios_1.default.get(downloadRes.data.url); return reportBlob.data; } } }); }