From dbb4e3745bac4c539340bff5cab6a027c36b16f6 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Wed, 25 Nov 2020 17:29:03 +0530 Subject: [PATCH] migrate collective's expense & contribution policy to html --- ...750-migrate-collective-policies-to-html.js | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 migrations/20201125113750-migrate-collective-policies-to-html.js diff --git a/migrations/20201125113750-migrate-collective-policies-to-html.js b/migrations/20201125113750-migrate-collective-policies-to-html.js new file mode 100644 index 000000000000..5dcd977a89cf --- /dev/null +++ b/migrations/20201125113750-migrate-collective-policies-to-html.js @@ -0,0 +1,73 @@ +'use strict'; + +import showdown from 'showdown'; +import { buildSanitizerOptions, sanitizeHTML } from '../server/lib/sanitize-html'; + +const converter = new showdown.Converter(); + +module.exports = { + up: async (queryInterface, Sequelize) => { + const collectivesWithExpensePolicy = await queryInterface.sequelize.query( + ` + SELECT "id", "expensePolicy" FROM "Collectives" + WHERE LENGTH("expensePolicy") > 0 AND "expensePolicy" NOT LIKE '<%' + AND "deletedAt" IS NULL; + `, + { type: Sequelize.QueryTypes.SELECT }, + ); + + const collectivesWithContribPolicy = await queryInterface.sequelize.query( + ` + SELECT "id", "contributionPolicy" FROM "Collectives" + WHERE LENGTH("contributionPolicy") > 0 AND "contributionPolicy" NOT LIKE '<%' + AND "deletedAt" IS NULL; + `, + { type: Sequelize.QueryTypes.SELECT }, + ); + + const sanitizeOptions = buildSanitizerOptions({ + basicTextFormatting: true, + links: true, + }); + + for (const collective of collectivesWithExpensePolicy) { + const htmlContent = converter.makeHtml(collective.expensePolicy); + const sanitizedContent = sanitizeHTML(htmlContent, sanitizeOptions); + await queryInterface.sequelize.query( + ` + UPDATE "Collectives" c + SET "expensePolicy" = :expensePolicy + WHERE c.id = :id + `, + { + replacements: { + expensePolicy: sanitizedContent, + id: collective.id, + }, + }, + ); + } + + for (const collective of collectivesWithContribPolicy) { + const htmlContent = converter.makeHtml(collective.contributionPolicy); + const sanitizedContent = sanitizeHTML(htmlContent, sanitizeOptions); + await queryInterface.sequelize.query( + ` + UPDATE "Collectives" c + SET "contributionPolicy" = :contributionPolicy + WHERE c.id = :id + `, + { + replacements: { + contributionPolicy: sanitizedContent, + id: collective.id, + }, + }, + ); + } + }, + + down: async () => { + // can't rollback this one + }, +};