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