From e8936b590bc322d6c9e8339a9d3dee25d0ddd24f Mon Sep 17 00:00:00 2001 From: SachaG <358832+SachaG@users.noreply.github.com> Date: Wed, 9 May 2018 10:38:21 +0900 Subject: [PATCH] Add migration script; fix input prop bug --- .../vulcan-forms/lib/components/FormIntl.jsx | 4 +- packages/vulcan-lib/lib/server/intl.js | 55 ++++++++++++++++++- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/packages/vulcan-forms/lib/components/FormIntl.jsx b/packages/vulcan-forms/lib/components/FormIntl.jsx index 9781e2acb..29d46957e 100644 --- a/packages/vulcan-forms/lib/components/FormIntl.jsx +++ b/packages/vulcan-forms/lib/components/FormIntl.jsx @@ -4,8 +4,8 @@ import { Components, registerComponent } from 'meteor/vulcan:core'; class FormIntl extends PureComponent { render() { - // do not pass FormIntl's own value, input and inputProperties, and intlInput props down - const properties = _.omit(this.props, 'value', 'input', 'inputProperties', 'intlInput'); + // do not pass FormIntl's own value, inputProperties, and intlInput props down + const properties = _.omit(this.props, 'value', 'inputProperties', 'intlInput'); return (
diff --git a/packages/vulcan-lib/lib/server/intl.js b/packages/vulcan-lib/lib/server/intl.js index ed75d94ec..22977d236 100644 --- a/packages/vulcan-lib/lib/server/intl.js +++ b/packages/vulcan-lib/lib/server/intl.js @@ -3,6 +3,11 @@ import { addGraphQLDirective, addGraphQLSchema } from '../modules/graphql'; import { SchemaDirectiveVisitor } from 'graphql-tools'; import { defaultFieldResolver } from 'graphql'; +import { Collections } from '../modules/collections'; +import Vulcan from '../modules/config'; +import { isIntlField } from '../modules/intl'; +import { Connectors } from './connectors'; +import pickBy from 'lodash/pickBy'; class IntlDirective extends SchemaDirectiveVisitor { visitFieldDefinition(field, details) { @@ -24,4 +29,52 @@ class IntlDirective extends SchemaDirectiveVisitor { addGraphQLDirective({ intl: IntlDirective }); -addGraphQLSchema(`directive @intl on FIELD_DEFINITION`); \ No newline at end of file +addGraphQLSchema(`directive @intl on FIELD_DEFINITION`); + +const migrateIntlFields = async (defaultLocale) => { + + if (!defaultLocale) { + throw new Error(`Please pass the id of the locale to which to migrate your current content (e.g. migrateIntlFields('en'))`); + } + + Collections.forEach(async collection => { + + const schema = collection.simpleSchema()._schema; + const intlFields = pickBy(schema, isIntlField); + const intlFieldsNames = Object.keys(intlFields); + if (intlFieldsNames.length) { + console.log(`### Found ${intlFieldsNames.length} field to migrate for collection ${collection.options.collectionName}: ${intlFieldsNames.join(', ')} ###\n`); + + const intlFieldsWithLocale = intlFieldsNames.map(f => `${f}.${defaultLocale}`); + + // find all documents with one or more unmigrated intl fields + const selector = { $or: intlFieldsWithLocale.map(f => ({[f]: { $exists: false }})) }; + const documentsToMigrate = await Connectors.find(collection, selector); + + if (documentsToMigrate.length) { + + console.log(`-> found ${documentsToMigrate.length} documents to migrate \n`); + documentsToMigrate.forEach(doc => { + + console.log(`// Migrating document ${doc._id}`); + const modifier = { $set: {}}; + + intlFieldsNames.forEach(f => { + if (doc[f] && !doc[f][defaultLocale]) { + console.log(`-> migrating field ${f}: ${doc[f]}`); + modifier.$set[f] = { [defaultLocale]: doc[f]} + } + }); + + // update document + Connectors.update(collection, {_id: doc._id}, modifier); + console.log('\n'); + + }); + } + + } + }); +} + +Vulcan.migrateIntlFields = migrateIntlFields; \ No newline at end of file