Skip to content
This repository has been archived by the owner on Sep 22, 2020. It is now read-only.

Commit

Permalink
Bug 1025805 multiple RIDs over time
Browse files Browse the repository at this point in the history
  • Loading branch information
adamlofting committed Aug 13, 2014
1 parent ae3a481 commit b87b38c
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 6 deletions.
48 changes: 46 additions & 2 deletions app/db/user/index.js
@@ -1,6 +1,10 @@
module.exports = function (sequelize) {
var hatchet = require('hatchet');
var model = sequelize.import(__dirname + '/model.js');
var modelReferrerCode = sequelize.import(__dirname + '/modelreferrercode.js');

model.hasMany(modelReferrerCode);
modelReferrerCode.belongsTo(model);

return {

Expand Down Expand Up @@ -94,7 +98,6 @@ module.exports = function (sequelize) {
subscribeToWebmakerList: data.mailingList,
username: data.username.toLowerCase(),
lastLoggedIn: new Date(),
referrer: data.referrer,
prefLocale: data.prefLocale
});

Expand All @@ -115,7 +118,6 @@ module.exports = function (sequelize) {
username: user.getDataValue("username"),
email: user.getDataValue("email"),
locale: user.getDataValue("prefLocale"),
referrer: user.getDataValue("referrer"),
subscribeToWebmakerList: user.getDataValue("subscribeToWebmakerList")
});

Expand Down Expand Up @@ -202,6 +204,48 @@ module.exports = function (sequelize) {
model.findAll({
where: { "email": emails }
}).complete( callback );
},

/**
* engagedWithReferrerCode( email, data, userStatus, callback )
* -
* email: email address
* referrerCode: referrer code
* userStatus: enum ['new', 'existing']
* callback: function( err )
*/
engagedWithReferrerCode: function ( email, referrerCode, userStatus, callback ) {
if ( !referrerCode ) {
return callback();
}

this.getUserByEmail( email, function( err, user ) {
if ( err ) {
return callback( err );
}

if ( !user ) {
return callback( new Error ("User not found!") );
}

var desiredRecord = {
UserId: user.id,
referrer: referrerCode
};

// Using findOrCreate() so we only have one record per campaign + user
// but the updatedAt field can change with multiple interactions
modelReferrerCode.findOrCreate(desiredRecord, desiredRecord).success(function(referrercode, created) {
if (created) {
// this was new and has now been saved
referrercode.userStatus = userStatus;
referrercode.save().complete( callback );
} else {
// save this again to update the autogenerated updatedAt field
referrercode.save().complete( callback );
}
});
});
}
};
};
4 changes: 0 additions & 4 deletions app/db/user/model.js
Expand Up @@ -106,10 +106,6 @@ module.exports = function( sequelize, DataTypes ) {
type: DataTypes.BOOLEAN,
defaultValue: false
},
referrer: {
type: DataTypes.STRING,
allowNull: true
},
bio: {
type: DataTypes.STRING,
validate: {
Expand Down
17 changes: 17 additions & 0 deletions app/db/user/modelreferrercode.js
@@ -0,0 +1,17 @@
/**
* Exports
*/
module.exports = function( sequelize, DataTypes ) {
return sequelize.define( "ReferrerCode", {
referrer: {
type: DataTypes.STRING
},
userStatus: {
type: DataTypes.ENUM,
values: ['new', 'existing']
}
}, {
charset: 'utf8',
collate: 'utf8_general_ci'
});
};
17 changes: 17 additions & 0 deletions app/http/middleware.js
Expand Up @@ -86,3 +86,20 @@ module.exports.updateLastLoggedIn = function(User) {
});
};
};

module.exports.engagedWithReferrerCode = function(User, options) {
return function(req, res, next) {

// the referrer value is only passed in if the cookie exists client-side
if (req.body.user && req.body.user.referrer) {

User.engagedWithReferrerCode( res.locals.email, req.body.user.referrer, options.userStatus,
function( err ) {
//TODO do something useful if this error happens
process.nextTick(next);
});
}

process.nextTick(next);
};
};
2 changes: 2 additions & 0 deletions app/http/routes.js
Expand Up @@ -92,6 +92,7 @@ module.exports = function( http, userHandle, webmakerAuth ){
middleware.personaVerifier,
routes.user2.authenticateUser( userHandle ),
middleware.updateLastLoggedIn( userHandle ),
middleware.engagedWithReferrerCode( userHandle, {"userStatus": "existing"} ),
middleware.filterUserAttributesForSession,
routes.user2.outputUser
);
Expand All @@ -101,6 +102,7 @@ module.exports = function( http, userHandle, webmakerAuth ){
middleware.personaVerifier,
routes.user2.createUser( userHandle ),
middleware.updateLastLoggedIn( userHandle ),
middleware.engagedWithReferrerCode( userHandle, {"userStatus": "new"} ),
middleware.filterUserAttributesForSession,
routes.user2.outputUser
);
Expand Down
4 changes: 4 additions & 0 deletions migrations/2014-08-01-A-ReferrerCodes.sql
@@ -0,0 +1,4 @@
# Create the new table, then migrate the existing data
CREATE TABLE `ReferrerCodes` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `referrer` VARCHAR(255), `userStatus` TEXT, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `UserId` INTEGER);
INSERT INTO `ReferrerCodes` (`referrer`, `userStatus`, `createdAt`, `updatedAt`, `UserId`)
SELECT referrer, 'new' as userStatus, createdAt, createdAt, id FROM Users WHERE referrer IS NOT NULL;
2 changes: 2 additions & 0 deletions migrations/2014-08-01-B-drop-referrer-col.sql
@@ -0,0 +1,2 @@
ALTER TABLE `Users`
DROP COLUMN `referrer`;

0 comments on commit b87b38c

Please sign in to comment.