Преглед на файлове

Merge pull request #2879 from Lezek123/giza-postinstall-fix

Giza: Make postinstall scripts work even if executed multiple times
Mokhtar Naamani преди 3 години
родител
ревизия
6d4a305036
променени са 3 файла, в които са добавени 57 реда и са изтрити 43 реда
  1. 15 15
      query-node/mappings/scripts/postHydraCLIInstall.ts
  2. 23 28
      query-node/mappings/scripts/postInstall.ts
  3. 19 0
      query-node/mappings/scripts/utils.ts

+ 15 - 15
query-node/mappings/scripts/postHydraCLIInstall.ts

@@ -1,23 +1,23 @@
 // A script to be executed post hydra-cli install, that may include patches for Hydra CLI
-import fs from 'fs'
 import path from 'path'
+import { replaceInFile } from './utils'
 
 // FIXME: Temporary fix for missing JOIN and HAVING conditions in search queries (Hydra)
 const searchServiceTemplatePath = path.resolve(
   __dirname,
   '../../codegen/node_modules/@joystream/hydra-cli/lib/src/templates/textsearch/service.ts.mst'
 )
-const searchServiceTemplateContent = fs.readFileSync(searchServiceTemplatePath).toString()
-const searchServiceTemplateContentLines = searchServiceTemplateContent.split('\n')
-searchServiceTemplateContentLines.splice(
-  searchServiceTemplateContentLines.findIndex((l) => l.match(/Add new query to queryString/)) + 1,
-  1, // remove 1 line
-  `queries = queries.concat(generateSqlQuery(repositories[index].metadata.tableName, qb.createJoinExpression(), WHERE, qb.createHavingExpression()));`
-)
-searchServiceTemplateContentLines.splice(
-  searchServiceTemplateContentLines.findIndex((l) => l.match(/const generateSqlQuery = /)),
-  3, // remove 3 lines
-  `const generateSqlQuery = (table: string, joins: string, where: string, having: string) =>
-    \`SELECT '\${table}_' || "\${table}"."id" AS unique_id FROM "\${table}" \` + joins + ' ' + where + ' ' + having;`
-)
-fs.writeFileSync(searchServiceTemplatePath, searchServiceTemplateContentLines.join('\n'))
+
+replaceInFile({
+  filePath: searchServiceTemplatePath,
+  regex: /queries = queries\.concat\(generateSqlQuery\(repositories\[index\]\.metadata\.tableName, WHERE\)\);/,
+  newContent:
+    'queries = queries.concat(generateSqlQuery(repositories[index].metadata.tableName, qb.createJoinExpression(), WHERE, qb.createHavingExpression()));',
+})
+
+replaceInFile({
+  filePath: searchServiceTemplatePath,
+  regex: /const generateSqlQuery =[\s\S]+\+ where;/,
+  newContent: `const generateSqlQuery = (table: string, joins: string, where: string, having: string) =>
+  \`SELECT '\${table}_' || "\${table}"."id" AS unique_id FROM "\${table}" \` + joins + ' ' + where + ' ' + having;`,
+})

+ 23 - 28
query-node/mappings/scripts/postInstall.ts

@@ -1,50 +1,45 @@
 // A script to be executed post query-node install, that may include workarounds in Hydra node_modules
-import fs from 'fs'
 import path from 'path'
+import { replaceInFile } from './utils'
 
 // FIXME: Temporarly remove broken sanitizeNullCharacter call
 const subscribersJsPath = path.resolve(
   __dirname,
   '../../../node_modules/@joystream/hydra-processor/lib/db/subscribers.js'
 )
-const subscribersJsContent = fs.readFileSync(subscribersJsPath).toString()
-fs.writeFileSync(
-  subscribersJsPath,
-  subscribersJsContent.replace(/sanitizeNullCharacter\(entity, field\);/g, '//sanitizeNullCharacter(entity, field)')
-)
+replaceInFile({
+  filePath: subscribersJsPath,
+  regex: /sanitizeNullCharacter\(entity, field\);/g,
+  newContent: '//sanitizeNullCharacter(entity, field)',
+})
 
 // FIXME: Temporarly replace broken relations resolution in @joystream/warthog
 const dataLoaderJsPath = path.resolve(
   __dirname,
   '../../../node_modules/@joystream/warthog/dist/middleware/DataLoaderMiddleware.js'
 )
-const dataLoaderJsContent = fs.readFileSync(dataLoaderJsPath).toString()
-const dataLoaderJsContentLines = dataLoaderJsContent.split('\n')
-dataLoaderJsContentLines.splice(
-  dataLoaderJsContentLines.findIndex((l) => l.match(/return context\.connection\.relationIdLoader/)),
-  0,
-  `return Promise.all(
+replaceInFile({
+  filePath: dataLoaderJsPath,
+  regex: /return context\.connection\.relationIdLoader[\s\S]+return group\.related;\s+\}\);\s+\}\)/,
+  newContent: `return Promise.all(
     entities.map(entity => context.connection.relationLoader.load(relation, entity))
   ).then(function (results) {
     return results.map(function (related) {
       return (relation.isManyToOne || relation.isOneToOne) ? related[0] : related
     })
-  })
-  `
-)
-fs.writeFileSync(dataLoaderJsPath, dataLoaderJsContentLines.join('\n'))
+  })`,
+})
 
 // FIXME: Temporary fix for "table name x specified more than once"
 const baseServiceJsPath = path.resolve(__dirname, '../../../node_modules/@joystream/warthog/dist/core/BaseService.js')
-const baseServiceJsContent = fs.readFileSync(baseServiceJsPath).toString()
-const baseServiceJsContentLines = baseServiceJsContent.split('\n')
-baseServiceJsContentLines.splice(
-  baseServiceJsContentLines.findIndex((l) => l.match(/function common/)) + 1,
-  4, // remove 4 lines (function body)
-  `const uuid = require('uuid/v4')
-  const foreignTableAlias = uuid().replace('-', '')
-  var foreingIdColumn = "\\"" + foreignTableAlias + "\\".\\"" + foreignColumnMap[foreignColumnName] + "\\"";
-  parameters.topLevelQb.leftJoin(foreignTableName, foreignTableAlias, localIdColumn + " = " + foreingIdColumn);
-  addWhereCondition(parameters, foreignTableAlias, foreignColumnMap);`
-)
-fs.writeFileSync(baseServiceJsPath, baseServiceJsContentLines.join('\n'))
+replaceInFile({
+  filePath: baseServiceJsPath,
+  regex: /function common\(parameters, localIdColumn, foreignTableName, foreignColumnMap, foreignColumnName\) \{[^}]+\}/,
+  newContent: `function common(parameters, localIdColumn, foreignTableName, foreignColumnMap, foreignColumnName) {
+    const uuid = require('uuid/v4')
+    const foreignTableAlias = uuid().replace('-', '')
+    var foreingIdColumn = "\\"" + foreignTableAlias + "\\".\\"" + foreignColumnMap[foreignColumnName] + "\\"";
+    parameters.topLevelQb.leftJoin(foreignTableName, foreignTableAlias, localIdColumn + " = " + foreingIdColumn);
+    addWhereCondition(parameters, foreignTableAlias, foreignColumnMap);
+  }`,
+})

+ 19 - 0
query-node/mappings/scripts/utils.ts

@@ -0,0 +1,19 @@
+import fs from 'fs'
+import { blake2AsHex } from '@polkadot/util-crypto'
+
+type ReplaceLinesInFileParams = {
+  filePath: string
+  regex: RegExp
+  newContent: string
+}
+
+export function replaceInFile({ filePath, regex, newContent }: ReplaceLinesInFileParams): void {
+  const paramsHash = blake2AsHex(filePath + '|' + regex.source + '|' + newContent)
+  const startMark = `/* BEGIN REPLACED CONTENT ${paramsHash} */`
+  const endMark = `/* END REPLACED CONTENT ${paramsHash} */`
+  const fileContent = fs.readFileSync(filePath).toString()
+  if (fileContent.includes(startMark)) {
+    return
+  }
+  fs.writeFileSync(filePath, fileContent.replace(regex, `${startMark}\n${newContent}\n${endMark}`))
+}