From 86181253c6f5338a56ad4628d39cfc7daef4e567 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 18 Feb 2016 20:30:02 +0100 Subject: [PATCH 1/6] store reminders for tasks --- common/script/index.js | 5 ++++- website/src/models/task.js | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/common/script/index.js b/common/script/index.js index dd5d2bf2f5..996cfabde1 100644 --- a/common/script/index.js +++ b/common/script/index.js @@ -815,10 +815,13 @@ api.wrap = function(user, main) { message: i18n.t('messageTaskNotFound', req.language) }) : void 0; } - _.merge(task, _.omit(req.body, ['checklist', 'id', 'type'])); + _.merge(task, _.omit(req.body, ['checklist', 'remidners', 'id', 'type'])); if (req.body.checklist) { task.checklist = req.body.checklist; } + if (req.body.reminders) { + task.reminders = req.body.reminders; + } if (typeof task.markModified === "function") { task.markModified('tags'); } diff --git a/website/src/models/task.js b/website/src/models/task.js index 8ae24e353a..97a0e1e7c6 100644 --- a/website/src/models/task.js +++ b/website/src/models/task.js @@ -28,7 +28,12 @@ var TaskSchema = { broken: String, // CHALLENGE_DELETED, TASK_DELETED, UNSUBSCRIBED, CHALLENGE_CLOSED winner: String // user.profile.name // group: {type: 'Strign', ref: 'Group'} // if we restore this, rename `id` above to `challenge` - } + }, + reminders: [{ + id: {type:String,'default':shared.uuid}, + startDate: Date, + time: Date + }] }; var HabitSchema = new Schema( From c751ee74c010dc7c4a14981e6c9c95a6b5598606 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 18 Feb 2016 20:30:14 +0100 Subject: [PATCH 2/6] store which areas the user wants to improve in --- website/src/models/user.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/website/src/models/user.js b/website/src/models/user.js index f9ac573179..8b41ad626a 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -390,6 +390,15 @@ var UserSchema = new Schema({ hatchPet: {type: Boolean, 'default': false}, raisePet: {type: Boolean, 'default': false}, streak: {type: Boolean, 'default': false} + }, + improvementCategories: { + "work": {type: Boolean, 'default': false}, + "exercise": {type: Boolean, 'default': false}, + "healthWellness": {type: Boolean, 'default': false}, + "school": {type: Boolean, 'default': false}, + "teams": {type: Boolean, 'default': false}, + "chores": {type: Boolean, 'default': false}, + "creativity": {type: Boolean, 'default': false}, } }, profile: { From 762576e7a283e417ca299bd736576cbd074ac7d3 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 18 Feb 2016 20:59:20 +0100 Subject: [PATCH 3/6] fix typo --- common/script/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/script/index.js b/common/script/index.js index 996cfabde1..d1616613eb 100644 --- a/common/script/index.js +++ b/common/script/index.js @@ -815,7 +815,7 @@ api.wrap = function(user, main) { message: i18n.t('messageTaskNotFound', req.language) }) : void 0; } - _.merge(task, _.omit(req.body, ['checklist', 'remidners', 'id', 'type'])); + _.merge(task, _.omit(req.body, ['checklist', 'reminders', 'id', 'type'])); if (req.body.checklist) { task.checklist = req.body.checklist; } From 668ad6ff4556f46749da0867f4aec6e4e2f02b21 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 24 Feb 2016 15:57:08 +0100 Subject: [PATCH 4/6] change imrovementCategories to array; --- website/src/models/user.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/website/src/models/user.js b/website/src/models/user.js index 8b41ad626a..d950bc27fc 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -391,15 +391,15 @@ var UserSchema = new Schema({ raisePet: {type: Boolean, 'default': false}, streak: {type: Boolean, 'default': false} }, - improvementCategories: { - "work": {type: Boolean, 'default': false}, - "exercise": {type: Boolean, 'default': false}, - "healthWellness": {type: Boolean, 'default': false}, - "school": {type: Boolean, 'default': false}, - "teams": {type: Boolean, 'default': false}, - "chores": {type: Boolean, 'default': false}, - "creativity": {type: Boolean, 'default': false}, - } + improvementCategories: {type: Array, validate: function (categories) { + var validValues = true; + categories.forEach(function (cat) { + if (['work', 'exercise', 'healthWellness', 'school', 'teams', 'chores', 'creativity'].indexOf(cat) === -1){ + validValues = false; + } + }); + return validValues; + }} }, profile: { blurb: String, From a1e1ac211fa1ab697c65dc6cc02797cdcd3287df Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 4 Mar 2016 14:00:26 +0100 Subject: [PATCH 5/6] improve improvement category validation --- website/src/models/user.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/website/src/models/user.js b/website/src/models/user.js index d950bc27fc..d23d401f0d 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -391,14 +391,12 @@ var UserSchema = new Schema({ raisePet: {type: Boolean, 'default': false}, streak: {type: Boolean, 'default': false} }, - improvementCategories: {type: Array, validate: function (categories) { - var validValues = true; - categories.forEach(function (cat) { - if (['work', 'exercise', 'healthWellness', 'school', 'teams', 'chores', 'creativity'].indexOf(cat) === -1){ - validValues = false; - } - }); - return validValues; + improvementCategories: { + type: Array, + validate: (categories) => { + const validCategories = ['work', 'exercise', 'healthWellness', 'school', 'teams', 'chores', 'creativity']; + let isValidCategory = categories.every(category => validValues.indexOf(category) !== -1); + return isValidCategory; }} }, profile: { From 36790592c68a4f39e7945ba55bc1e1cbdf3d32c2 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Sun, 6 Mar 2016 17:56:51 +0100 Subject: [PATCH 6/6] add tests for improvement categories --- test/api/v2/user/PUT-user.test.js | 23 +++++++++++++++++++++++ website/src/controllers/api-v2/user.js | 10 +++++++++- website/src/models/user.js | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/test/api/v2/user/PUT-user.test.js b/test/api/v2/user/PUT-user.test.js index 033a278646..e4774528ae 100644 --- a/test/api/v2/user/PUT-user.test.js +++ b/test/api/v2/user/PUT-user.test.js @@ -175,4 +175,27 @@ describe('PUT /user', () => { }); }); }); + + context('Improvement Categories', () => { + it('sets valid categories', async () => { + await user.put('/user', { + 'preferences.improvementCategories': ['work', 'school'], + }); + + await user.sync(); + + expect(user.preferences.improvementCategories).to.eql(['work', 'school']); + }); + + it('discards invalid categories', async () => { + await expect(user.put('/user', { + 'preferences.improvementCategories': ['work', 'procrastination', 'school'], + })).to.eventually.be.rejected.and.eql({ + code: 400, + text: [ + 'Validator failed for path `preferences.improvementCategories` with value `work,procrastination,school`', + ], + }); + }); + }); }); diff --git a/website/src/controllers/api-v2/user.js b/website/src/controllers/api-v2/user.js index 201d1d034d..d06bb96288 100644 --- a/website/src/controllers/api-v2/user.js +++ b/website/src/controllers/api-v2/user.js @@ -355,7 +355,15 @@ api.update = (req, res, next) => { user.save((err) => { if (!_.isEmpty(errors)) return res.json(401, {err: errors}); - if (err) return next(err); + if (err) { + if (err.name == 'ValidationError') { + let errorMessages = _.map(_.values(err.errors), (error) => { + return error.message; + }); + return res.json(400, {err: errorMessages}); + } + return next(err); + } res.json(200, user); user = errors = null; diff --git a/website/src/models/user.js b/website/src/models/user.js index d23d401f0d..9c2f11bcfd 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -395,7 +395,7 @@ var UserSchema = new Schema({ type: Array, validate: (categories) => { const validCategories = ['work', 'exercise', 'healthWellness', 'school', 'teams', 'chores', 'creativity']; - let isValidCategory = categories.every(category => validValues.indexOf(category) !== -1); + let isValidCategory = categories.every(category => validCategories.indexOf(category) !== -1); return isValidCategory; }} },