Server: Add NSFW in user profile
authorChocobozzz <florian.bigard@gmail.com>
Mon, 3 Apr 2017 19:24:36 +0000 (21:24 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Mon, 3 Apr 2017 19:24:36 +0000 (21:24 +0200)
server/controllers/api/users.js
server/helpers/custom-validators/users.js
server/initializers/constants.js
server/initializers/migrations/0045-user-display-nsfw.js [new file with mode: 0644]
server/middlewares/validators/users.js
server/models/user.js
server/tests/api/check-params/users.js
server/tests/api/users.js
server/tests/utils/users.js

index f854b30826697269d12520bb7b4d1da73dbfcb0a..6b6c0774f4159e5624b3bd12af11683e86bf5535 100644 (file)
@@ -71,6 +71,7 @@ function createUser (req, res, next) {
     username: req.body.username,
     password: req.body.password,
     email: req.body.email,
+    displayNSFW: false,
     role: constants.USER_ROLES.USER
   })
 
@@ -136,7 +137,9 @@ function updateUser (req, res, next) {
   db.User.loadByUsername(res.locals.oauth.token.user.username, function (err, user) {
     if (err) return next(err)
 
-    user.password = req.body.password
+    if (req.body.password) user.password = req.body.password
+    if (req.body.displayNSFW !== undefined) user.displayNSFW = req.body.displayNSFW
+
     user.save().asCallback(function (err) {
       if (err) return next(err)
 
index 88fa1592e858e25ab421b58672734fb0130b5b79..2fc026e9807975079da34604bc82321f783b682b 100644 (file)
@@ -9,7 +9,8 @@ const USERS_CONSTRAINTS_FIELDS = constants.CONSTRAINTS_FIELDS.USERS
 const usersValidators = {
   isUserPasswordValid,
   isUserRoleValid,
-  isUserUsernameValid
+  isUserUsernameValid,
+  isUserDisplayNSFWValid
 }
 
 function isUserPasswordValid (value) {
@@ -26,6 +27,10 @@ function isUserUsernameValid (value) {
   return validator.matches(value, new RegExp(`^[a-zA-Z0-9._]{${min},${max}}$`))
 }
 
+function isUserDisplayNSFWValid (value) {
+  return validator.isBoolean(value)
+}
+
 // ---------------------------------------------------------------------------
 
 module.exports = usersValidators
index f3799ba0fc5610c05d5e185a52e0108d48c49709..6352d7c46d81c47268e870e536bddc03d5e05d27 100644 (file)
@@ -5,7 +5,7 @@ const path = require('path')
 
 // ---------------------------------------------------------------------------
 
-const LAST_MIGRATION_VERSION = 40
+const LAST_MIGRATION_VERSION = 45
 
 // ---------------------------------------------------------------------------
 
diff --git a/server/initializers/migrations/0045-user-display-nsfw.js b/server/initializers/migrations/0045-user-display-nsfw.js
new file mode 100644 (file)
index 0000000..03624e5
--- /dev/null
@@ -0,0 +1,19 @@
+'use strict'
+
+// utils = { transaction, queryInterface, sequelize, Sequelize }
+exports.up = function (utils, finalCallback) {
+  const q = utils.queryInterface
+  const Sequelize = utils.Sequelize
+
+  const data = {
+    type: Sequelize.BOOLEAN,
+    allowNull: false,
+    defaultValue: false
+  }
+
+  q.addColumn('Users', 'displayNSFW', data, { transaction: utils.transaction }).asCallback(finalCallback)
+}
+
+exports.down = function (options, callback) {
+  throw new Error('Not implemented.')
+}
index ce83fc0746b88f9f4e5b6d6ae6531ee7c8a4dba1..1e7a647938b074fb0159202dce156b48430cec22 100644 (file)
@@ -56,7 +56,8 @@ function usersRemove (req, res, next) {
 function usersUpdate (req, res, next) {
   req.checkParams('id', 'Should have a valid id').notEmpty().isInt()
   // Add old password verification
-  req.checkBody('password', 'Should have a valid password').isUserPasswordValid()
+  req.checkBody('password', 'Should have a valid password').optional().isUserPasswordValid()
+  req.checkBody('displayNSFW', 'Should have a valid display Not Safe For Work attribute').optional().isUserDisplayNSFWValid()
 
   logger.debug('Checking usersUpdate parameters', { parameters: req.body })
 
index 24e710fa71c6ff1d36dac846dacb83c91ba3d092..e64bab8abc54061778968453e6a7ff0caff71e84 100644 (file)
@@ -39,6 +39,17 @@ module.exports = function (sequelize, DataTypes) {
           isEmail: true
         }
       },
+      displayNSFW: {
+        type: DataTypes.BOOLEAN,
+        allowNull: false,
+        defaultValue: false,
+        validate: {
+          nsfwValid: function (value) {
+            const res = customUsersValidators.isUserDisplayNSFWValid(value)
+            if (res === false) throw new Error('Display NSFW is not valid.')
+          }
+        }
+      },
       role: {
         type: DataTypes.ENUM(values(constants.USER_ROLES)),
         allowNull: false
@@ -101,6 +112,7 @@ function toFormatedJSON () {
     id: this.id,
     username: this.username,
     email: this.email,
+    displayNSFW: this.displayNSFW,
     role: this.role,
     createdAt: this.createdAt
   }
index b04f9f4a6fa6cdefab7b9406fffb30af0b2db95a..4a176e6c28db0541eeba79d8d063452024d757be 100644 (file)
@@ -270,6 +270,14 @@ describe('Test users API validators', function () {
       requestsUtils.makePutBodyRequest(server.url, path + userId, userAccessToken, data, done)
     })
 
+    it('Should fail with an invalid display NSFW attribute', function (done) {
+      const data = {
+        displayNSFW: -1
+      }
+
+      requestsUtils.makePutBodyRequest(server.url, path + userId, userAccessToken, data, done)
+    })
+
     it('Should fail with an non authenticated user', function (done) {
       const data = {
         password: 'my super password'
@@ -280,7 +288,8 @@ describe('Test users API validators', function () {
 
     it('Should succeed with the correct params', function (done) {
       const data = {
-        password: 'my super password'
+        password: 'my super password',
+        displayNSFW: true
       }
 
       requestsUtils.makePutBodyRequest(server.url, path + userId, userAccessToken, data, done, 204)
index 2b6956baadcc75701772dc158e804522171805e3..a5e8a7edfe909bec73700a8210e724ba76642eaa 100644 (file)
@@ -209,6 +209,7 @@ describe('Test users', function () {
 
       expect(user.username).to.equal('user_1')
       expect(user.email).to.equal('user_1@example.com')
+      expect(user.displayNSFW).to.be.falsy
       expect(user.id).to.exist
 
       done()
@@ -237,10 +238,13 @@ describe('Test users', function () {
       const user = users[0]
       expect(user.username).to.equal('user_1')
       expect(user.email).to.equal('user_1@example.com')
+      expect(user.displayNSFW).to.be.falsy
 
       const rootUser = users[1]
       expect(rootUser.username).to.equal('root')
       expect(rootUser.email).to.equal('admin1@example.com')
+      expect(rootUser.displayNSFW).to.be.falsy
+
       userId = user.id
 
       done()
@@ -261,6 +265,7 @@ describe('Test users', function () {
       const user = users[0]
       expect(user.username).to.equal('root')
       expect(user.email).to.equal('admin1@example.com')
+      expect(user.displayNSFW).to.be.falsy
 
       done()
     })
@@ -280,6 +285,7 @@ describe('Test users', function () {
       const user = users[0]
       expect(user.username).to.equal('user_1')
       expect(user.email).to.equal('user_1@example.com')
+      expect(user.displayNSFW).to.be.falsy
 
       done()
     })
@@ -299,6 +305,7 @@ describe('Test users', function () {
       const user = users[0]
       expect(user.username).to.equal('user_1')
       expect(user.email).to.equal('user_1@example.com')
+      expect(user.displayNSFW).to.be.falsy
 
       done()
     })
@@ -317,15 +324,18 @@ describe('Test users', function () {
 
       expect(users[0].username).to.equal('root')
       expect(users[0].email).to.equal('admin1@example.com')
+      expect(users[0].displayNSFW).to.be.falsy
+
       expect(users[1].username).to.equal('user_1')
       expect(users[1].email).to.equal('user_1@example.com')
+      expect(users[1].displayNSFW).to.be.falsy
 
       done()
     })
   })
 
   it('Should update the user password', function (done) {
-    usersUtils.updateUser(server.url, userId, accessTokenUser, 'new password', function (err, res) {
+    usersUtils.updateUser(server.url, userId, accessTokenUser, 'new password', null, function (err, res) {
       if (err) throw err
 
       server.user.password = 'new password'
@@ -333,6 +343,25 @@ describe('Test users', function () {
     })
   })
 
+  it('Should be able to change the NSFW display attribute', function (done) {
+    usersUtils.updateUser(server.url, userId, accessTokenUser, null, true, function (err, res) {
+      if (err) throw err
+
+      usersUtils.getUserInformation(server.url, accessTokenUser, function (err, res) {
+        if (err) throw err
+
+        const user = res.body
+
+        expect(user.username).to.equal('user_1')
+        expect(user.email).to.equal('user_1@example.com')
+        expect(user.displayNSFW).to.be.truthy
+        expect(user.id).to.exist
+
+        done()
+      })
+    })
+  })
+
   it('Should be able to remove this user', function (done) {
     usersUtils.removeUser(server.url, userId, accessToken, done)
   })
index 7817160b94e9b50c39230fc5d70f171aca244f1d..8138074d014f7553ee60fc9e3cc28076a5e4b35a 100644 (file)
@@ -101,14 +101,18 @@ function removeUser (url, userId, accessToken, expectedStatus, end) {
     .end(end)
 }
 
-function updateUser (url, userId, accessToken, newPassword, end) {
+function updateUser (url, userId, accessToken, newPassword, displayNSFW, end) {
   const path = '/api/v1/users/' + userId
 
+  const toSend = {}
+  if (newPassword !== undefined && newPassword !== null) toSend.password = newPassword
+  if (displayNSFW !== undefined && displayNSFW !== null) toSend.displayNSFW = displayNSFW
+
   request(url)
     .put(path)
     .set('Accept', 'application/json')
     .set('Authorization', 'Bearer ' + accessToken)
-    .send({ password: newPassword })
+    .send(toSend)
     .expect(204)
     .end(end)
 }