This repository was archived by the owner on Nov 10, 2022. It is now read-only.
Repository navigation
Expand file tree
/
Copy pathuploadToIntegration.js
More file actions
127 lines (115 loc) · 5.06 KB
/
Copy pathuploadToIntegration.js
File metadata and controls
127 lines (115 loc) · 5.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const axios = require('axios').default;
const { emitEvent } = require('./sockets');
const Mapping = require('./models/mapping');
const { catchRejection } = require('./helpers');
const updateDesignLibraryFile = async ( integrationClient, integrationTranslationFile, originIntegrationFile, translatedFilesData, index, fileName ) => {
if(integrationTranslationFile){
return integrationClient.request({
method: 'PATCH',
url: `/v3/designs/${integrationTranslationFile.id}`,
body: {
subject: originIntegrationFile.subject,
generate_plain_content: true,
html_content: translatedFilesData[index],
categories: originIntegrationFile.categories,
}
})
} else {
return integrationClient.request({
method: 'POST',
url: `/v3/designs`,
body: {
name: fileName,
subject: originIntegrationFile.subject,
generate_plain_content: true,
html_content: translatedFilesData[index],
categories: originIntegrationFile.categories,
}
})
}
};
const updateDynamicTemplateFile = async ( integrationClient, integrationTranslationFile, originIntegrationFile, translatedFilesData, index, fileName ) => {
if(integrationTranslationFile){
return integrationClient.request({
method: 'PATCH',
url: `/v3/templates/${integrationTranslationFile.id}/versions/${integrationTranslationFile.versions[0].id}`,
body: {
generate_plain_content: true,
html_content: translatedFilesData[index],
}
})
} else {
return integrationClient.request({
method: 'POST',
url: `/v3/templates`,
body: {
name: fileName,
generation: originIntegrationFile.generation,
}
})
.then(([resp, data]) => {
return integrationClient.request({
method: 'POST',
url: `/v3/templates/${data.id}/versions`,
body: {
name: fileName,
html_content: translatedFilesData[index],
}
})
})
}
};
function integrationUpdate() {
return async (req, res) => {
try {
const integrationClient = res.integrationClient;
const crowdinApi = res.crowdinApiClient;
const filesTranslations = req.body;
const projectId = res.origin.context.project_id;
const translations = Object.keys(filesTranslations).reduce((acc, fileId) =>
([...acc, ...filesTranslations[fileId].map(lId =>
({fileId: fileId, languageId: lId})
)]), []
);
const mappedFiles = await Mapping.getFilesByDomainProjectId(res);
const mappedFilesById = mappedFiles.reduce((acc, f) => ({...acc, [f.crowdinFileId]: f}), {});
const [integrationListStatus, integrationListBody] = await integrationClient.request({ method: 'GET', url: '/v3/designs' });
const [integrationTemplatesStatus, integrationTemplatesBody] = await integrationClient.request({ method: 'GET', url: '/v3/templates?generations=dynamic,legacy'});
if(integrationListStatus.statusCode !== 200 || integrationTemplatesStatus.statusCode !== 200) {
throw new Error(`cant fetch forms list statusCode: ${integrationListStatus.statusCode}`);
}
const integrationFilesList = [...integrationListBody.result, ...integrationTemplatesBody.templates];
const crowdinFiles = await Promise.all(Object.keys(filesTranslations).map( fId => crowdinApi.sourceFilesApi.getFile(projectId, fId)));
const filesById = crowdinFiles.reduce((acc, fileData) => ({...acc, [`${fileData.data.id}`]: fileData.data}), {});
const translatedFilesData = await ( async () => {
const buildLinks = await Promise.all(
translations.map(t => crowdinApi.translationsApi.buildProjectFileTranslation(projectId, t.fileId, {targetLanguageId: t.languageId, exportAsXliff: false}))
);
const buffers = await Promise.all(buildLinks.map(r => axios.get(r.data.url)));
return buffers.map(b => b.data);
})();
const uploadedFiles = await Promise.all(translations.map( (t, index) => {
const fileName = `${filesById[t.fileId].title}/${t.languageId}`;
const mappedFile = mappedFilesById[t.fileId];
const integrationTranslationFile = integrationFilesList.find(f => f.name === fileName);
const originIntegrationFile = integrationFilesList.find(f => f.id === mappedFile.integrationFileId);
if(mappedFile.integrationDataType === 'Dynamic Templates'){
return updateDynamicTemplateFile(integrationClient, integrationTranslationFile, originIntegrationFile, translatedFilesData, index, fileName);
} else {
return updateDesignLibraryFile(integrationClient, integrationTranslationFile, originIntegrationFile, translatedFilesData, index, fileName);
}
}));
if(!res.headersSent) {
return res.status(200).json(uploadedFiles);
}
emitEvent({
error: false,
refreshIntegration: true,
message: 'Async files upload to SendGrid finished',
}, res);
} catch(e) {
catchRejection('Cant upload files to integration', res)(e);
}
}
}
module.exports = integrationUpdate;