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