@docupace/pipeline 1.0.2-5.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,715 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import axios from 'axios';
4
- import crypto from 'crypto';
5
- import { deploy } from 'auth0-deploy-cli';
6
- import fl from 'fs/promises';
7
-
8
- import {
9
- cloneEnvRepository,
10
- cloneRepository,
11
- readDeployConfig,
12
- pushDeployConfig
13
- } from '../next/deploy.js';
14
-
15
- import {
16
- getVaultSecrets,
17
- updateVaultSecrets
18
- } from './vault.js';
19
-
20
- import {
21
- getVaultSecretsConfigs,
22
- environmentConfig
23
- } from '../next/config.js';
24
- import { connect } from 'http2';
25
- import { promise } from 'zod';
26
-
27
- async function ensureDirectoryExists(dirPath) {
28
- try {
29
- await fs.promises.mkdir(dirPath, { recursive: true });
30
- console.log(`Directory created or already exists: ${dirPath}`);
31
- } catch (err) {
32
- console.error(`Failed to create directory: ${err.message}`);
33
- }
34
- }
35
-
36
- async function copyDirectory(source, destination) {
37
- try {
38
- await fl.mkdir(destination, { recursive: true });
39
- const items = await fl.readdir(source, { withFileTypes: true });
40
-
41
- for (const item of items) {
42
- const sourcePath = path.join(source, item.name);
43
- const destinationPath = path.join(destination, item.name);
44
-
45
- if (item.isDirectory()) {
46
- await copyDirectory(sourcePath, destinationPath);
47
- } else {
48
- await fl.copyFile(sourcePath, destinationPath);
49
- }
50
- }
51
- } catch (err) {
52
- console.error(`Error copying directory: ${err.message}`);
53
- throw err;
54
- }
55
- }
56
-
57
- async function addApplicationToApi ({application, auth0Domain, auth0AuthToken, coreApiIdentifier}){
58
- console.log("Adding application to API authorized applications...");
59
-
60
- try {
61
- const auth0Response = await axios.get(`https://${auth0Domain}/api/v2/clients`, {
62
- headers: {authorization: `Bearer ${auth0AuthToken}`},
63
- });
64
-
65
- const appAuth0ClientIdData = auth0Response.data.find(client => client.name === `${application}`);
66
- const appAuth0ClientId = appAuth0ClientIdData.client_id;
67
-
68
- await axios.post(
69
- `https://${auth0Domain}/api/v2/client-grants`,
70
- {
71
- client_id: appAuth0ClientId,
72
- audience: `${coreApiIdentifier}`,
73
- scope: [],
74
- },
75
- {
76
- headers: {
77
- Authorization: `Bearer ${auth0AuthToken}`,
78
- "Content-Type": "application/json",
79
- },
80
- }
81
- );
82
- console.log(`Application (${appAuth0ClientId}) authorized for API: ${coreApiIdentifier}`);
83
- } catch (err) {
84
- console.error(`Failed to add application: ${application}: ${err.message}`);
85
- }
86
-
87
- }
88
-
89
- async function initializeAuth0Configuration({
90
- initConfiguration,
91
- auth0Domain,
92
- auth0AuthToken,
93
- coreApiIdentifier,
94
- }) {
95
- if (initConfiguration === "true") {
96
- try {
97
- // Create a new resource server in Auth0
98
- console.log("Creating resource server in Auth0...");
99
-
100
- const resourceServerResponse = await axios.post(
101
- `https://${auth0Domain}/api/v2/resource-servers`,
102
- {
103
- name: "docupace-core",
104
- identifier: `${coreApiIdentifier}`,
105
- token_lifetime: 86400,
106
- allow_offline_access: false,
107
- signing_alg: "RS256",
108
- skip_consent_for_verifiable_first_party_clients: true,
109
- scopes: [],
110
- },
111
- {
112
- headers: {
113
- Authorization: `Bearer ${auth0AuthToken}`,
114
- "Content-Type": "application/json",
115
- },
116
- }
117
- );
118
-
119
- const apiId = resourceServerResponse.data.id;
120
-
121
- // Update tenant settings with the default audience
122
- console.log("Updating tenant settings...");
123
- await axios.patch(
124
- `https://${auth0Domain}/api/v2/tenants/settings`,
125
- {
126
- default_audience: `${coreApiIdentifier}`,
127
- },
128
- {
129
- headers: {
130
- Authorization: `Bearer ${auth0AuthToken}`,
131
- "Content-Type": "application/json",
132
- },
133
- }
134
- );
135
- console.log("Tenant settings updated successfully.");
136
- } catch (error) {
137
- console.error("Error during Auth0 configuration:", error.response?.data || error.message);
138
- }
139
- }
140
- }
141
-
142
- async function importAuth0Templates(directoryPath, auth0Domain, auth0ClientID, auth0ClientSecret) {
143
- try {
144
- const config = {
145
- input_file: directoryPath,
146
- config: {
147
- AUTH0_DOMAIN: auth0Domain,
148
- AUTH0_CLIENT_ID: auth0ClientID,
149
- AUTH0_CLIENT_SECRET: auth0ClientSecret,
150
- },
151
- debug: true,
152
- };
153
-
154
- console.log('Starting Auth0 template import...');
155
- await deploy(config);
156
- console.log('Auth0 template import completed successfully!');
157
- } catch (error) {
158
- console.error('Error during Auth0 template import:', error.message);
159
- process.exit(1); // Exit with an error code
160
- }
161
- }
162
-
163
- async function updateJsonFile(filePath, updates) {
164
- const content = await fs.promises.readFile(filePath, 'utf8');
165
- const jsonContent = JSON.parse(content);
166
- const updatedContent = JSON.stringify({...jsonContent, ...updates}, null, 2);
167
- await fs.promises.writeFile(filePath, updatedContent);
168
- }
169
-
170
- async function replaceInFile(filePath, replacements) {
171
- let content = await fs.promises.readFile(filePath, 'utf8');
172
-
173
- for (const [search, replace] of replacements) {
174
- const escapedSearch = search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); // Escape special chars
175
- content = content.replace(new RegExp(escapedSearch, 'g'), replace);
176
- }
177
- await fs.promises.writeFile(filePath, content, 'utf8');
178
- }
179
-
180
- async function templateAuth0(siteUrl, coreApiContext, env, filePaths, deployUI, deployGraphQLServer, commonSecrets, configureMFA) {
181
- try {
182
- let uiAllowedCallbacksUrls,
183
- uiAllowedLogoutUrls;
184
- let graphqlAllowedCallbacksUrls,
185
- graphqlAllowedLogoutUrls;
186
- let connectAllowedCallbacksUrls,
187
- connectlAllowedLogoutUrls;
188
-
189
- let connectClientMetadata,
190
- connectCallbacks,
191
- connectAddons;
192
- // Configure URLs based on environment
193
- if (env === 'prd') {
194
- uiAllowedCallbacksUrls = [`${siteUrl}/api/auth/callback`];
195
- uiAllowedLogoutUrls = [`${siteUrl}`];
196
-
197
- graphqlAllowedCallbacksUrls = [`${siteUrl}/api/graphql/callback`];
198
- graphqlAllowedLogoutUrls = [`${siteUrl}/api/graphql/`];
199
-
200
- connectAllowedCallbacksUrls = [`${siteUrl}/connect/samlCallback?client_name=auth0`];
201
- connectlAllowedLogoutUrls = [ `${siteUrl}/connect`];
202
- } else {
203
- uiAllowedCallbacksUrls = [
204
- `${siteUrl}/api/auth/callback`,
205
- `http://localhost:3000/api/auth/callback`,
206
- ];
207
- uiAllowedLogoutUrls = [
208
- `${siteUrl}`,
209
- `http://localhost:3000`,
210
- ];
211
- graphqlAllowedCallbacksUrls = [
212
- `${siteUrl}/api/graphql/callback`,
213
- `http://localhost:4000/api/graphql/callback`,
214
- ];
215
- graphqlAllowedLogoutUrls = [
216
- `http://localhost:4000/api/graphql/`,
217
- `${siteUrl}/api/graphql/`,
218
- ];
219
- connectAllowedCallbacksUrls = [
220
- `${siteUrl}/connect/samlCallback?client_name=auth0`,
221
- `http://localhost:9000/connect/samlCallback?client_name=auth0`,
222
- ];
223
- connectlAllowedLogoutUrls = [
224
- `${siteUrl}/connect`
225
- ];
226
-
227
- const siteUrlNoPrefix=siteUrl.replace(/^https?:\/\//, '');
228
- connectClientMetadata ={
229
- "docupaceContext" : "core",
230
- "docupaceHost" : `${siteUrlNoPrefix}`,
231
- "docupace_context" : "core",
232
- "docupace_host" : `${siteUrlNoPrefix} `
233
- };
234
-
235
- connectCallbacks = [
236
- `${siteUrl}/connect/samlCallback?client_name=auth0`
237
- ];
238
-
239
- connectAddons = {
240
- "samlp": {
241
- "audience": `${siteUrl}/connect`,
242
- "recipient": `${siteUrl}/connect/samlCallback?client_name=auth0`,
243
- "destination": `${siteUrl}/connect/samlCallback?client_name=auth0`,
244
- "nameIdentifierFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified",
245
- "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST",
246
- "nameIdentifierProbes": [
247
- "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/docupace-username"
248
- ],
249
- "mappings": {
250
- "proposalHandle": "ProposalHandle"
251
- }
252
- }
253
- };
254
-
255
- }
256
-
257
-
258
- const configureUI = deployUI === 'true';
259
- if (configureUI) {
260
- console.log('ui_allowed_callbacks_urls ->', uiAllowedCallbacksUrls);
261
- console.log('ui_allowed_logout_urls ->', uiAllowedLogoutUrls);
262
-
263
- await updateJsonFile(filePaths.uiJson, {
264
- callbacks: uiAllowedCallbacksUrls,
265
- allowed_logout_urls: uiAllowedLogoutUrls,
266
- });
267
-
268
-
269
- //TODO: move to separate function for connect
270
- console.log('connect_allowed_callbacks_urls ->', connectAllowedCallbacksUrls);
271
- console.log('connect_allowed_logout_urls ->', connectlAllowedLogoutUrls);
272
-
273
- // update allowed callback url
274
- await updateJsonFile(filePaths.connectJson, {
275
- callbacks: connectAllowedCallbacksUrls,
276
- allowed_logout_urls: connectlAllowedLogoutUrls,
277
- client_metadata: connectClientMetadata,
278
- addons: connectAddons
279
- });
280
-
281
-
282
-
283
- console.log('Updated URLs for main UI...');
284
- } else {
285
- await fs.promises.unlink(filePaths.uiJson);
286
- await updateJsonFile(filePaths.databaseJson, {
287
- enabled_clients: (content) => content.enabled_clients.filter((client) => client !== 'docupace-ui-main'),
288
- });
289
- console.log("Removed 'docupace-ui-main' from enabled_clients in database.json");
290
- }
291
-
292
- const configureGraphqlServer = deployGraphQLServer === 'true';
293
- if (configureGraphqlServer) {
294
- console.log('graphql_allowed_callbacks_urls ->', graphqlAllowedCallbacksUrls);
295
- console.log('graphql_allowed_logout_urls ->', graphqlAllowedLogoutUrls);
296
-
297
- await updateJsonFile(filePaths.graphqlJson, {
298
- callbacks: graphqlAllowedCallbacksUrls,
299
- allowed_logout_urls: graphqlAllowedLogoutUrls,
300
- });
301
- console.log('Updated URLs for GraphQL server...');
302
- } else {
303
- await fs.promises.unlink(filePaths.graphqlJson);
304
- await updateJsonFile(filePaths.databaseJson, {
305
- enabled_clients: (content) => content.enabled_clients.filter((client) => client !== 'docupace-graphql'),
306
- });
307
- console.log("Removed 'docupace-graphql' from enabled_clients in database.json");
308
- }
309
-
310
- // TWILIO configuration
311
- await replaceInFile(filePaths.twilioJson, [
312
- ['twilioauthtokenplaceholder', commonSecrets.TWILIO_AUTH_TOKEN],
313
- ['twiliosidplaceholder', commonSecrets.TWILIO_SID],
314
- ['twiliofromplaceholder', commonSecrets.TWILIO_FROM_NUMBER],
315
- ]);
316
-
317
- console.log('TWILIO configuration updated...');
318
-
319
- const tmpSiteUrl = siteUrl.replace(/^https?:\/\//, '');
320
- // Database configuration
321
- await replaceInFile(filePaths.databaseLoginJs, [
322
- ['${docupaceHost}', tmpSiteUrl],
323
- ['${docupaceContext}', coreApiContext],
324
- ]);
325
-
326
- console.log('MFA Template configuration started...');
327
-
328
- try {
329
- const sourceDir = configureMFA === 'DISABLED' ? 'auth0-site-setup/templateNoMFA/' : 'auth0-site-setup/templateMFA/';
330
- const destinationDir = 'auth0-site-setup/template/';
331
-
332
- console.log(`AUTH0 MFA is ${configureMFA === 'DISABLED' ? 'disabled' : 'enabled'}`);
333
- await copyDirectory(sourceDir, destinationDir);
334
-
335
- console.log('MFA configuration completed.');
336
- } catch (err) {
337
- console.error('Error configuring MFA:', err);
338
- throw err;
339
- }
340
-
341
- console.log('Template configuration completed.');
342
- } catch (err) {
343
- // console.error('Error configuring Auth0 templates:', err);
344
- throw err;
345
- }
346
- }
347
-
348
- export async function getAuth0AuthToken(auth0Domain, clientId, clientSecret) {
349
- try {
350
- const response = await axios.post(`https://${auth0Domain}/oauth/token`, {
351
- client_id: clientId,
352
- client_secret: clientSecret,
353
- audience: `https://${auth0Domain}/api/v2/`,
354
- grant_type: 'client_credentials',
355
- }, {
356
- headers: {
357
- 'Content-Type': 'application/json',
358
- },
359
- });
360
-
361
- const authToken = response.data.access_token;
362
- // console.log("Auth0 Auth Token:", authToken);
363
- return authToken;
364
- } catch (error) {
365
- console.error("Error fetching Auth0 token:", error.response ? error.response.data : error.message);
366
- }
367
- }
368
-
369
- async function configureUI(siteHost, coreURL, docupaceHost, site, env, useNewDomain, auth0Domain, auth0ClientId, auth0ClientSecret, auth0Token, vaultSiteSecretsPath, imageTag, repoPath) {
370
- console.log(`Configuring UI for site: ${site} Host: ${siteHost} in env: ${env}`);
371
- siteHost = siteHost.replace('https://', '');
372
- coreURL = coreURL.replace('https://', '');
373
-
374
-
375
- try {
376
- const auth0Response = await axios.get(`https://${auth0Domain}/api/v2/clients`, {
377
- headers: {authorization: `Bearer ${auth0Token}`},
378
- });
379
-
380
- const uiClient = auth0Response.data.find(client => client.name === "docupace-ui-main");
381
- const uiAuth0ClientId = uiClient.client_id;
382
- const uiAuth0ClientSecret = uiClient.client_secret;
383
-
384
- // Generate Auth0 Secret
385
- const uiAuth0Secret = crypto.randomBytes(48).toString('base64').replace(/[^a-zA-Z0-9]/g, '');
386
-
387
- // Prepare data payload
388
- console.log("Preparing Vault UI data payload...");
389
- const uiSecretData = JSON.stringify({
390
- data: {
391
- AUTH0_CLIENT_ID: uiAuth0ClientId,
392
- AUTH0_CLIENT_SECRET: uiAuth0ClientSecret,
393
- AUTH0_SECRET: uiAuth0Secret,
394
- },
395
- });
396
-
397
- await updateVaultSecrets(vaultSiteSecretsPath, uiSecretData);
398
-
399
- // Prepare ui.app.yaml
400
- const uiAppYaml = `
401
- repo: docupace-ui-main
402
- revision: master
403
- `.trim();
404
-
405
- // Prepare ui.values.yaml
406
- const uiValuesYaml = `
407
- uiMain:
408
- auth0BaseUrl: https://${siteHost}
409
- auth0IssuerBaseUrl: https://${auth0Domain}
410
- auth0ClientId: vault:secret/data/${site}/ui/config#AUTH0_CLIENT_ID
411
- graphqlClientUrl: https://${siteHost}/api/graphql
412
- graphqlServerUrl: https://${siteHost}/api/graphql
413
- connectUrl: https://${siteHost}
414
- coreUrl: https://${coreURL}
415
- env:
416
- AUTH0_CLIENT_SECRET: vault:secret/data/${site}/ui/config#AUTH0_CLIENT_SECRET
417
- AUTH0_SECRET: vault:secret/data/${site}/ui/config#AUTH0_SECRET
418
- image:
419
- repository: registry.paperout.com/docupace-ui-main-dev-docker-local/docupace-ui-main
420
- tag: ${imageTag}
421
- imagePullSecrets:
422
- - name: jf-artifactory
423
- ingress:
424
- enabled: true
425
- className: nginx
426
- annotations:
427
- external-dns.alpha.kubernetes.io/hostname: ${siteHost}
428
- external-dns.alpha.kubernetes.io/zone: public
429
- cert-manager.io/cluster-issuer: letsencrypt
430
- nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
431
- hosts:
432
- - host: ${siteHost}
433
- paths:
434
- - path: /
435
- pathType: Prefix
436
- tls:
437
- - hosts:
438
- - ${siteHost}
439
- secretName: dp-next-ui-cert
440
- externalConnectIngress:
441
- enabled: ${useNewDomain}
442
- className: nginx
443
- annotations:
444
- cert-manager.io/cluster-issuer: letsencrypt
445
- external-dns.alpha.kubernetes.io/hostname: ${siteHost}
446
- external-dns.alpha.kubernetes.io/zone: public
447
- nginx.ingress.kubernetes.io/backend-protocol: HTTPS
448
- nginx.ingress.kubernetes.io/configuration-snippet: |
449
- proxy_set_header Host ${siteHost};
450
- nginx.ingress.kubernetes.io/proxy-buffer-size: 8k
451
- hosts:
452
- - host: ${siteHost}
453
- paths:
454
- - path: /core
455
- - path: /core_b2b
456
- - path: /core_reports
457
- - path: /corerealm
458
- - path: /connect
459
- - path: /webstart
460
- - path: /core_ws
461
- - path: /core_docupload
462
- - path: /core_ariws
463
- - path: /core_restws
464
- - path: /core_webdav
465
- tls:
466
- - hosts:
467
- - ${siteHost}
468
- secretName: dp-next-ui-cert
469
- externalConnectService:
470
- enabled: ${useNewDomain}
471
- name: external-connect
472
- domain: ${docupaceHost}
473
- `.trim();
474
-
475
- // Write configuration files
476
- console.log("Writing configuration files...");
477
- await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
478
-
479
- await fs.writeFile(`${repoPath}/dp/${site}/ui.app.yaml`, uiAppYaml, (err) => {
480
- if (err) {
481
- console.error("Failed to write the file:", err);
482
- } else {
483
- console.log("File written successfully.");
484
- }
485
- });
486
-
487
- await fs.writeFile(`${repoPath}/dp/${site}/ui.values.yaml`, uiValuesYaml, (err) => {
488
- if (err) {
489
- console.error("Failed to write the file:", err);
490
- } else {
491
- console.log("File written successfully.");
492
- }
493
- });
494
- console.log("Done!");
495
- } catch (error) {
496
- console.error("Error configuring UI:", error);
497
- }
498
- }
499
-
500
- async function configureGraphQLServer(siteHost, coreURL, docupaceHost, site, env, auth0Domain, auth0ClientId, auth0ClientSecret, auth0Token, vaultSiteSecretsPath, imageTag, standardConfigRemoteBranch, repoPath, commonSecrets) {
501
- siteHost = siteHost.replace('https://', '');
502
- coreURL = coreURL.replace('https://', '');
503
- console.log(`Configuring GraphQL Server for site: ${site} Host: ${siteHost} in env: ${env}`);
504
-
505
- try {
506
- const auth0Response = await axios.get(`https://${auth0Domain}/api/v2/clients`, {
507
- headers: {authorization: `Bearer ${auth0Token}`},
508
- });
509
-
510
- const graphQLServerClient = auth0Response.data.find(client => client.name === "docupace-graphql");
511
- const graphQLServerClientCredentials = auth0Response.data.find(client => client.name === "docupace-graphql-client-credentials");
512
-
513
- const graphQLServerAuth0ClientId = graphQLServerClient.client_id;
514
- const graphQLServerAuth0ClientSecret = graphQLServerClient.client_secret;
515
-
516
- const graphQLServerCCAuth0ClientId = graphQLServerClientCredentials.client_id;
517
- const graphQLServerCCAuth0ClientSecret = graphQLServerClientCredentials.client_secret;
518
-
519
- // Prepare data payload
520
- console.log("Preparing Vault GraphQL Server data payload...");
521
- const graphQLServerSecretData = JSON.stringify({
522
- data: {
523
- AUTH0_CLIENT_ID: graphQLServerAuth0ClientId,
524
- AUTH0_CLIENT_SECRET: graphQLServerAuth0ClientSecret,
525
- AUTH0_CC_CLIENT_ID: graphQLServerCCAuth0ClientId,
526
- AUTH0_CC_CLIENT_SECRET: graphQLServerCCAuth0ClientSecret,
527
- CORE_PASSWORD: commonSecrets.CORE_PASSWORD,
528
- REMOTE_CONFIG_PATH: commonSecrets.REMOTE_CONFIG_PATH,
529
- STANDARD_CONFIG_REMOTE_PATH: commonSecrets.STANDARD_CONFIG_REMOTE_PATH,
530
- },
531
- });
532
-
533
- await updateVaultSecrets(vaultSiteSecretsPath, graphQLServerSecretData);
534
-
535
- // Prepare ui.app.yaml
536
- const graphQLServerAppYaml = `
537
- repo: docupace-graphql-server
538
- revision: ${standardConfigRemoteBranch}
539
- `.trim();
540
-
541
- // Prepare ui.values.yaml
542
- const graphQLServerValuesYaml = `
543
- graphqlServer:
544
- auth0Domain: https://${auth0Domain}
545
- auth0ClientId: vault:secret/data/${site}/graphql-server/config#AUTH0_CLIENT_ID
546
- auth0Audience: ${commonSecrets.CORE_API_IDENTIFIER}
547
- baseUrl: https://${siteHost}/api/graphql
548
- coreUrl: https://${coreURL}
549
- integrationHubUrl: "https://${commonSecrets.INTEGRATION_HUB_URL}"
550
- standardConfigRemoteBranch: ${standardConfigRemoteBranch}
551
- apiLevel: "2"
552
- env:
553
- AUTH0_CLIENT_SECRET: vault:secret/data/${site}/graphql-server/config#AUTH0_CLIENT_SECRET
554
- STANDARD_CONFIG_REMOTE_PATH: vault:secret/data/common/config#STANDARD_CONFIG_REMOTE_PATH
555
- SITE_CONFIG_REMOTE_PATH: vault:secret/data/${site}/common/config#SITE_CONFIG_REMOTE_PATH
556
- AUTH0_CC_CLIENT_ID: vault:secret/data/${site}/graphql-server/config#AUTH0_CC_CLIENT_ID
557
- AUTH0_CC_CLIENT_SECRET: vault:secret/data/${site}/graphql-server/config#AUTH0_CC_CLIENT_SECRET
558
- image:
559
- repository: registry.paperout.com/docupace-graphql-server-dev-docker-local/docupace-graphql-server
560
- tag: ${imageTag}
561
- imagePullSecrets:
562
- - name: jf-artifactory
563
- ingress:
564
- annotations:
565
- external-dns.alpha.kubernetes.io/hostname: ${siteHost}
566
- external-dns.alpha.kubernetes.io/zone: public
567
- cert-manager.io/cluster-issuer: letsencrypt
568
- nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
569
- enabled: true
570
- className: nginx
571
- hosts:
572
- - host: ${siteHost}
573
- paths:
574
- - path: /api/graphql
575
- pathType: Prefix
576
- tls:
577
- - hosts:
578
- - ${siteHost}
579
- secretName: dp-next-ui-cert
580
- `.trim();
581
-
582
- // Write configuration files
583
- console.log("Writing ArgoCD GraphQL Server configuration files...");
584
- await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
585
-
586
- await fs.writeFile(`${repoPath}/dp/${site}/graphql-server.app.yaml`, graphQLServerAppYaml, (err) => {
587
- if (err) {
588
- console.error("Failed to write the file:", err);
589
- } else {
590
- console.log("File written successfully.");
591
- }
592
- });
593
-
594
- await fs.writeFile(`${repoPath}/dp/${site}/graphql-server.values.yaml`, graphQLServerValuesYaml, (err) => {
595
- if (err) {
596
- console.error("Failed to write the file:", err);
597
- } else {
598
- console.log("File written successfully.");
599
- }
600
- });
601
- console.log("Done!");
602
- } catch (error) {
603
- console.error("Error configuring GraphQL Server:", error);
604
- }
605
- }
606
-
607
-
608
- export async function configureFromSite(fromSite, toSite, fromEnv,toEnv, deployUI, deployGraphQLServer, useNewDomain, configureMFA) {
609
- console.log(`Configuring Auth0 tenants and ArgoCD apps for site: ${toSite} in env: ${toEnv} from site: ${fromSite}`);
610
- // Common Secrets
611
- const commonSecretsPath = getVaultSecretsConfigs(toSite).commonSecretsPath;
612
- console.log(`commonSecretsPath => ${commonSecretsPath}`)
613
- const commonSecrets = await getVaultSecrets(commonSecretsPath);
614
-
615
- // Site Common Secrets
616
- const siteCommonSecretsPath = getVaultSecretsConfigs(toSite).siteCommonSecretsPath;
617
- console.log(`siteCommonSecretsPath => ${siteCommonSecretsPath}`)
618
- const siteCommonSecrets = await getVaultSecrets(siteCommonSecretsPath);
619
-
620
- const auth0Domain = `docupace-${toEnv}-${toSite}.us.auth0.com`
621
- const auth0ClientId = siteCommonSecrets.AUTH0_CLIENT_ID;
622
- const auth0ClientSecret = siteCommonSecrets.AUTH0_CLIENT_SECRET;
623
- const auth0Token = await getAuth0AuthToken(auth0Domain, auth0ClientId, auth0ClientSecret);
624
-
625
- // UI app
626
- const uiSecretsPath = getVaultSecretsConfigs(toSite).uiSecretsPath;
627
- console.log(`uiSecretsPath => ${uiSecretsPath}`)
628
-
629
- // GraphQL-Server app
630
- const graphqlSecretsPath = getVaultSecretsConfigs(toSite).graphqlServerSecretsPath;
631
- console.log(`graphqlSecretsPath => ${graphqlSecretsPath}`);
632
-
633
- let repoPathFromEnv ="";
634
- let repoPathToEnv = "";
635
- // Clone repositories
636
- if ( fromEnv == toEnv ) {
637
- repoPathFromEnv = await cloneEnvRepository(fromEnv);
638
- repoPathToEnv = repoPathFromEnv;
639
- }else {
640
- repoPathFromEnv = await cloneEnvRepository(fromEnv);
641
- repoPathToEnv = await cloneEnvRepository(toEnv);
642
- }
643
-
644
- //TODO: clone fromEnv and toEnv. replace above with this
645
-
646
- const auth0RepoPath = await cloneRepository('auth0-site-setup');
647
-
648
- // Read deploy configs
649
- const { deployConfig: deployUIConfig } = await readDeployConfig('ui', fromEnv, fromSite, 'values');
650
- const uiImageTag = deployUIConfig.image.tag;
651
-
652
- const { deployConfig: deployGraphQLServerConfig } = await readDeployConfig('graphql-server', fromEnv, fromSite, 'values');
653
- const graphqlImageTag = deployGraphQLServerConfig.image.tag;
654
- const graphqlStandardConfigRemoteBranch = deployGraphQLServerConfig.graphqlServer.standardConfigRemoteBranch;
655
-
656
- // File paths
657
- const filePaths = {
658
- databaseLoginJs: './auth0-site-setup/template/database-connections/docupace/login.js',
659
- loginHtml: './auth0-site-setup/template/pages/login.html',
660
- graphqlJson: './auth0-site-setup/template/clients/docupace-graphql.json',
661
- uiJson: './auth0-site-setup/template/clients/docupace-ui-main.json',
662
- connectJson: './auth0-site-setup/template/clients/docupace-connect.json',
663
- databaseJson: './auth0-site-setup/template/database-connections/docupace/database.json',
664
- twilioJson: './auth0-site-setup/template/guardian/providers/sms-twilio.json',
665
- };
666
-
667
- console.log(`Copying Latest UI Image Tag: ${deployUIConfig.image.tag} from site: ${fromSite} to site: ${toSite}`);
668
- console.log(`Copying Latest GraphQL Server Image Tag: ${deployGraphQLServerConfig.image.tag} from site: ${fromSite} to site: ${toSite}`);
669
-
670
- const envConfig = environmentConfig[toEnv];
671
-
672
- let CORE_URL,
673
- SITE_HOST,
674
- CORE_API_CONTEXT,
675
- CONNECT_URL,
676
- DOCUPACE_HOST;
677
- if (useNewDomain) {
678
- const newUrl = envConfig.newUrl(toSite);
679
- CORE_URL = `${newUrl}/core`;
680
- SITE_HOST = newUrl;
681
- CORE_API_CONTEXT = "core";
682
- CONNECT_URL = `${newUrl}/connect`;
683
- DOCUPACE_HOST = envConfig.docupaceHost();
684
- } else {
685
- const oldUrl = envConfig.oldUrl(toSite);
686
- CORE_URL = oldUrl;
687
- SITE_HOST = oldUrl;
688
- CORE_API_CONTEXT = toSite;
689
- CONNECT_URL = `${oldUrl}_ui`;
690
- }
691
-
692
- await templateAuth0(SITE_HOST, CORE_API_CONTEXT, toEnv, filePaths, deployUI, deployGraphQLServer, commonSecrets, configureMFA);
693
- await importAuth0Templates('./auth0-site-setup/template', auth0Domain, auth0ClientId, auth0ClientSecret);
694
-
695
- if (deployUI === 'true') {
696
- await configureUI(SITE_HOST, CORE_URL, DOCUPACE_HOST, toSite, toEnv, useNewDomain, auth0Domain, auth0ClientId, auth0ClientSecret, auth0Token, uiSecretsPath, uiImageTag, repoPathToEnv);
697
- }
698
-
699
- await configureGraphQLServer(SITE_HOST, CORE_URL, DOCUPACE_HOST, toSite, toEnv, auth0Domain, auth0ClientId, auth0ClientSecret, auth0Token, graphqlSecretsPath, graphqlImageTag, graphqlStandardConfigRemoteBranch, repoPathToEnv, commonSecrets);
700
- await pushDeployConfig(repoPathToEnv, `Config update for ${toSite} from ${fromSite} with UI: ${uiImageTag} and GraphQL: ${graphqlImageTag}`);
701
-
702
- await initializeAuth0Configuration({
703
- initConfiguration: "true",
704
- auth0Domain: auth0Domain,
705
- auth0AuthToken: auth0Token,
706
- coreApiIdentifier: commonSecrets.CORE_API_IDENTIFIER,
707
- });
708
-
709
- await addApplicationToApi({
710
- application: 'docupace-graphql-client-credentials',
711
- auth0Domain: auth0Domain,
712
- auth0AuthToken: auth0Token,
713
- coreApiIdentifier: commonSecrets.CORE_API_IDENTIFIER
714
- })
715
- }