diff --git a/index.js b/index.js index e695ad8..054c355 100644 --- a/index.js +++ b/index.js @@ -12,11 +12,12 @@ var Modules = { , github: require('./lib/modules/github') , instagram: require('./lib/modules/instagram') , google: require('./lib/modules/google') + , foursquare: require('./lib/modules/foursquare') }; // Mostly, we need this because password needs to be loaded before everything else // so that other modules can use everyauth.password.loginKey() -var moduleLoadOrder = ['everymodule', 'password', 'facebook', 'twitter', 'github', 'instagram', 'google']; +var moduleLoadOrder = ['everymodule', 'password', 'facebook', 'twitter', 'github', 'instagram', 'google', 'foursquare']; /** * Decorates the (User) Schema with the proper attributes. diff --git a/lib/modules/foursquare/everyauth.js b/lib/modules/foursquare/everyauth.js new file mode 100644 index 0000000..2c13133 --- /dev/null +++ b/lib/modules/foursquare/everyauth.js @@ -0,0 +1,18 @@ +// Defaults +module.exports = { + findOrCreateUser: function (sess, accessTok, accessTokExtra, foursquareUser) { + var promise = this.Promise() + , self = this; + this.User()().findOne({'foursquare.id': foursquareUser.id}, function (err, foundUser) { + if (err) return promise.fail(err); + if (foundUser) { + return promise.fulfill(foundUser); + } + self.User()().createWithFoursquare(foursquareUser, accessTok, accessTokExtra, function (err, createdUser) { + if (err) return promise.fail(err); + return promise.fulfill(createdUser); + }); + }); + return promise; + } +}; diff --git a/lib/modules/foursquare/index.js b/lib/modules/foursquare/index.js new file mode 100644 index 0000000..8510f47 --- /dev/null +++ b/lib/modules/foursquare/index.js @@ -0,0 +1,3 @@ +exports.schema = require('./schema'); +exports.plugin = require('./plugin'); +exports.everyauth = require('./everyauth'); diff --git a/lib/modules/foursquare/plugin.js b/lib/modules/foursquare/plugin.js new file mode 100644 index 0000000..2b87830 --- /dev/null +++ b/lib/modules/foursquare/plugin.js @@ -0,0 +1,48 @@ +var mongoose = require('mongoose') + , mongooseTypes = require('mongoose-types') + , _schema = require('./schema') + , everyauth = require('everyauth'); +mongooseTypes.loadTypes(mongoose); +var Url = mongoose.SchemaTypes.Url; + +everyauth.debug = true; + +// See https://developer.foursquare.com/docs/responses/user +module.exports = function foursquare (schema, opts) { + schema.add(_schema); + + schema.static('createWithFoursquare', function (foursquareUserMeta, accessToken, accessTokenExtra, callback) { + var params = { + foursquare: { + accessToken: accessToken + , id: foursquareUserMeta.id + , firstName: foursquareUserMeta.firstName + , lastName: foursquareUserMeta.lastName + , homeCity: foursquareUserMeta.homeCity + , photo: foursquareUserMeta.photo + , gender: foursquareUserMeta.gender + , relationship: foursquareUserMeta.relationship + , type: foursquareUserMeta.type + , contact: foursquareUserMeta.contact + , pings: foursquareUserMeta.pings + , badges: foursquareUserMeta.badges + , checkins: foursquareUserMeta.checkins + , mayorships: foursquareUserMeta.mayorships + , tips: foursquareUserMeta.tips + , todos: foursquareUserMeta.todos + , photos: foursquareUserMeta.photos + , friends: foursquareUserMeta.friends + , followers: foursquareUserMeta.followers + , requests: foursquareUserMeta.requests + , pageInfo: foursquareUserMeta.pageInfo + } + }; + + // TODO Only do this if password module is enabled + // Currently, this is not a valid way to check for enabled + if (everyauth.password) + params[everyauth.password.loginKey()] = "foursquare:" + foursquareUserMeta.id; // Hack because of way mongodb treate unique indexes + + this.create(params, callback); + }); +}; diff --git a/lib/modules/foursquare/schema.js b/lib/modules/foursquare/schema.js new file mode 100644 index 0000000..1097b90 --- /dev/null +++ b/lib/modules/foursquare/schema.js @@ -0,0 +1,25 @@ +module.exports = { + foursquare: { + accessToken: String + , id: String + , firstName: String + , lastName: String + , homeCity: String + , photo: String + , gender: String + , relationship: String + , type: String + , contact: String + , pings: Boolean + , badges: Number + , checkins: Number + , mayorships: Number + , tips: Number + , todos: Number + , photos: Number + , friends: Number + , followers: Number + , requests: Number + , pageInfo: {} + } +};