From 63937c3a56775d018fd00e970c63a4268105a3f8 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Fri, 12 Jun 2015 13:14:07 -0700 Subject: [PATCH 1/3] fix make usernames required --- common/models/user.json | 16 ++++++++++++++-- server/config.json | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/common/models/user.json b/common/models/user.json index 8e15a241dc..ff0cab3495 100644 --- a/common/models/user.json +++ b/common/models/user.json @@ -44,7 +44,8 @@ "username": { "type": "string", "lowercase": true, - "trim": true + "trim": true, + "id": true }, "bio": { "type": "string", @@ -226,7 +227,18 @@ } }, "validations": [], - "relations": {}, + "relations": { + "credentials": { + "type": "hasMany", + "model": "userCredential", + "foreignKey": "" + }, + "identities": { + "type": "hasMany", + "model": "userIdentity", + "foreignKey": "" + } + }, "acls": [ { "accessType": "*", diff --git a/server/config.json b/server/config.json index 643481ac45..953b2f37c5 100644 --- a/server/config.json +++ b/server/config.json @@ -2,7 +2,7 @@ "restApiRoot": "/api", "host": "0.0.0.0", "port": 3000, - "legacyExplorer" : false, + "legacyExplorer": false, "remoting": { "context": { "enableHttpContext": false From e29a340afb4404e37d3d12fa2b0c776c7d4ac36e Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Fri, 12 Jun 2015 13:54:38 -0700 Subject: [PATCH 2/3] add blacklisted usernames to loopback user validations --- common/models/user.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/common/models/user.js b/common/models/user.js index 0806d97e0b..1a577d0979 100644 --- a/common/models/user.js +++ b/common/models/user.js @@ -10,6 +10,12 @@ module.exports = function(User) { delete User.validations.email; // set salt factor for passwords User.settings.saltWorkFactor = 5; + + User.validatesExclusionOf('username', { + inArray: blacklistedUsernames, + message: 'username is taken' + }); + debug('setting up user hooks'); // send verification email to new camper User.afterRemote('create', function(ctx, user, next) { From 90b2f99a704ae1be8b55ade7efeeeb1e2f6eacc2 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Fri, 12 Jun 2015 15:27:51 -0700 Subject: [PATCH 3/3] add create identities on flatten users --- package.json | 1 + seed/flattenUser.js | 68 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 23c49e675c..6813f87726 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "mongodb": "^2.0.33", "morgan": "~1.5.0", "node-slack": "0.0.7", + "node-uuid": "^1.4.3", "nodemailer": "~1.3.0", "passport-facebook": "^2.0.0", "passport-google-oauth": "^0.2.0", diff --git a/seed/flattenUser.js b/seed/flattenUser.js index f919d6b471..3163349cf2 100644 --- a/seed/flattenUser.js +++ b/seed/flattenUser.js @@ -1,12 +1,21 @@ /* eslint-disable no-process-exit */ require('dotenv').load(); -var assign = require('lodash/object/assign'), - Rx = require('rx'), +var Rx = require('rx'), + uuid = require('node-uuid'), + assign = require('lodash/object/assign'), mongodb = require('mongodb'), secrets = require('../config/secrets'); var MongoClient = mongodb.MongoClient; +var providers = [ + 'facebook', + 'twitter', + 'google', + 'github', + 'linkedin' +]; + function createConnection(URI) { return Rx.Observable.create(function(observer) { MongoClient.connect(URI, function(err, database) { @@ -48,6 +57,7 @@ function insertMany(db, collection, users, options) { if (err) { return observer.onError(err); } + observer.onNext(); observer.onCompleted(); }); }); @@ -56,7 +66,8 @@ function insertMany(db, collection, users, options) { var count = 0; // will supply our db object var dbObservable = createConnection(secrets.db).shareReplay(); -dbObservable + +var users = dbObservable .flatMap(function(db) { // returns user document, n users per loop where n is the batchsize. return createQuery(db, 'users', {}); @@ -66,7 +77,17 @@ dbObservable assign(user, user.portfolio, user.profile); return user; }) - // batch them into arrays of twenty documents + .map(function(user) { + if (user.username) { + return user; + } + user.username = 'fcc' + uuid.v4().slice(0, 8); + return user; + }) + .shareReplay(); + +// batch them into arrays of twenty documents +var userSavesCount = users .bufferWithCount(20) // get bd object ready for insert .withLatestFrom(dbObservable, function(users, db) { @@ -80,10 +101,45 @@ dbObservable return insertMany(dats.db, 'user', dats.users, { w: 1 }); }) // count how many times insert completes - .count() + .count(); + +// create User Identities +var userIdentityCount = users + .flatMap(function(user) { + var ids = providers + .map(function(provider) { + return { + provider: provider, + externalId: user[provider] + }; + }) + .filter(function(ident) { + return !!ident.externalId; + }); + + return Rx.Observable.from(ids); + }) + .bufferWithCount(20) + .withLatestFrom(dbObservable, function(identities, db) { + return { + identities: identities, + db: db + }; + }) + .flatMap(function(dats) { + // bulk insert into new collection for loopback + return insertMany(dats.db, 'userIdentity', dats.identities, { w: 1 }); + }) + // count how many times insert completes + .count(); + +Rx.Observable.merge( + userIdentityCount, + userSavesCount +) .subscribe( function(_count) { - count = _count * 20; + count += _count * 20; }, function(err) { console.log('an error occured', err);