From d8d6141d3536665d98f84b5d187e8f67dc5bf961 Mon Sep 17 00:00:00 2001 From: abasic Date: Tue, 30 Oct 2018 13:33:26 +0100 Subject: [PATCH 001/213] Updated role config with method for extracting role names --- config/shared/role.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/config/shared/role.js b/config/shared/role.js index a4333a0f2..32ab7b352 100644 --- a/config/shared/role.js +++ b/config/shared/role.js @@ -1,5 +1,6 @@ 'use strict'; +const isPlainObject = require('lodash/isPlainObject'); const values = require('lodash/values'); const userRoles = { USER: 'USER', ADMIN: 'ADMIN', INTEGRATION: 'INTEGRATION' }; @@ -12,5 +13,9 @@ module.exports = { user: userRoles, course: courseRoles, userRoleRegex, - courseRoleRegex + courseRoleRegex, + getRoleNames(type) { + const roles = this[type]; + return isPlainObject(roles) ? values(roles) : []; + } }; From 090aae4422c3ea3cb2ebbd5231542bf4f3f8283c Mon Sep 17 00:00:00 2001 From: abasic Date: Tue, 30 Oct 2018 13:34:09 +0100 Subject: [PATCH 002/213] Added backend logic for upserting and deleting users --- server/user/index.js | 7 +++++-- server/user/user.controller.js | 26 ++++++++++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/server/user/index.js b/server/user/index.js index efe8b1b11..4577bca84 100644 --- a/server/user/index.js +++ b/server/user/index.js @@ -1,14 +1,17 @@ 'use strict'; +const { authorize } = require('../shared/auth/mw'); const ctrl = require('./user.controller'); const model = require('./user.model'); const router = require('express-promise-router')(); router .post('/users/login', ctrl.login) - .get('/users', ctrl.index) + .get('/users', authorize(), ctrl.index) + .post('/users', authorize(), ctrl.upsert) .post('/users/forgotPassword', ctrl.forgotPassword) - .post('/users/resetPassword', ctrl.resetPassword); + .post('/users/resetPassword', ctrl.resetPassword) + .delete('/users/:id', ctrl.remove); module.exports = { model, diff --git a/server/user/user.controller.js b/server/user/user.controller.js index 5a41ed03f..cefe0cf1e 100644 --- a/server/user/user.controller.js +++ b/server/user/user.controller.js @@ -1,13 +1,25 @@ 'use strict'; const { createError, validationError } = require('../shared/error/helpers'); -const { NOT_FOUND } = require('http-status-codes'); +const { NO_CONTENT, NOT_FOUND } = require('http-status-codes'); +const { role } = require('../../config/shared'); const { User } = require('../shared/database'); -function index(req, res) { - const attributes = ['id', 'email', 'role']; - return User.findAll({ attributes }) - .then(users => res.json({ data: users })); +function index({ query: { roleType } }, res) { + let options = { attributes: ['id', 'email', 'role'], raw: true }; + if (roleType) options.where = { role: { $in: role.getRoleNames(roleType) } }; + return User.findAll(options).then(data => res.json({ data })); +} + +function upsert({ body: { email, role } }, res) { + return User.findOne({ where: { email }, paranoid: false }) + .then(user => user ? user.update({ role }) : User.invite({ email, role })) + .then(user => user.deletedAt ? user.restore() : user) + .then(data => res.json({ data })); +} + +function remove({ params: { id } }, res) { + return User.destroy({ where: { id } }).then(() => res.sendStatus(NO_CONTENT)); } function forgotPassword({ body }, res) { @@ -18,7 +30,7 @@ function forgotPassword({ body }, res) { .then(() => res.end()); } -function resetPassword({ body, params }, res) { +function resetPassword({ body }, res) { const { password, token } = body; return User.find({ where: { token } }) .then(user => user || createError(NOT_FOUND, 'Invalid token')) @@ -46,6 +58,8 @@ function login({ body }, res) { module.exports = { index, + upsert, + remove, forgotPassword, resetPassword, login From 913d4d5b34ce6d62373fcf11ca930af251446d64 Mon Sep 17 00:00:00 2001 From: abasic Date: Tue, 30 Oct 2018 13:41:23 +0100 Subject: [PATCH 003/213] Added UI for listing, upserting and removing users --- client/api/system.js | 21 ++++ .../system-user-management/AddSystemUser.vue | 86 +++++++++++++++ .../system-user-management/SystemUser.vue | 53 +++++++++ .../system-user-management/index.vue | 104 ++++++++++++++++++ 4 files changed, 264 insertions(+) create mode 100644 client/api/system.js create mode 100644 client/components/system-user-management/AddSystemUser.vue create mode 100644 client/components/system-user-management/SystemUser.vue create mode 100644 client/components/system-user-management/index.vue diff --git a/client/api/system.js b/client/api/system.js new file mode 100644 index 000000000..6870015d9 --- /dev/null +++ b/client/api/system.js @@ -0,0 +1,21 @@ +import request from './request'; + +function getUsers() { + const options = { params: { roleType: 'user' } }; + return request.get('/users', options).then(({ data: { data } }) => data); +} + +function upsertUser(email, data) { + const body = { email, ...data }; + return request.post('/users', body).then(({ data: { data } }) => data); +} + +function removeUser(id) { + return request.delete(`/users/${id}`); +} + +module.exports = { + getUsers, + upsertUser, + removeUser +}; diff --git a/client/components/system-user-management/AddSystemUser.vue b/client/components/system-user-management/AddSystemUser.vue new file mode 100644 index 000000000..8b02a1a15 --- /dev/null +++ b/client/components/system-user-management/AddSystemUser.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/client/components/system-user-management/SystemUser.vue b/client/components/system-user-management/SystemUser.vue new file mode 100644 index 000000000..469ef0176 --- /dev/null +++ b/client/components/system-user-management/SystemUser.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/client/components/system-user-management/index.vue b/client/components/system-user-management/index.vue new file mode 100644 index 000000000..f83a21de6 --- /dev/null +++ b/client/components/system-user-management/index.vue @@ -0,0 +1,104 @@ + + + + + From e3ac8fefaf381c8e50da243651a8104cc91c0423 Mon Sep 17 00:00:00 2001 From: abasic Date: Tue, 30 Oct 2018 13:41:54 +0100 Subject: [PATCH 004/213] Added client side routing for system user management --- client/components/common/Navbar.vue | 9 +++++++-- client/router.js | 12 ++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/client/components/common/Navbar.vue b/client/components/common/Navbar.vue index 11091217a..8abfd2956 100644 --- a/client/components/common/Navbar.vue +++ b/client/components/common/Navbar.vue @@ -9,7 +9,7 @@ {{ courseAcronym }} @@ -23,6 +23,11 @@ @@ -44,7 +49,7 @@ export default { }; }, computed: { - ...mapGetters(['user']), + ...mapGetters(['user', 'isAdmin']), ...mapGetters(['course'], 'course'), courseAcronym() { return this.course ? getAcronym(this.course.name) : null; diff --git a/client/router.js b/client/router.js index 7f8de109d..106fe493e 100644 --- a/client/router.js +++ b/client/router.js @@ -13,6 +13,7 @@ import General from './components/course/Settings/General'; import Login from './components/auth/Login'; import Outline from './components/course/Outline'; import ResetPassword from './components/auth/ResetPassword'; +import SystemUserManagement from './components/system-user-management'; import TreeView from './components/course/TreeView'; import UserManagement from './components/course/Settings/UserManagement'; @@ -32,9 +33,12 @@ let router = new Router({ path: '', name: 'course', component: Outline + }, { + path: 'editor/:activityId', + name: 'editor', + component: Editor }, { path: 'settings', - name: 'course-settings', component: CourseSettings, children: [{ path: '', @@ -55,9 +59,9 @@ let router = new Router({ component: TreeView }] }, { - path: '/course/:courseId/editor/:activityId', - name: 'editor', - component: Editor, + path: '/system-users', + name: 'system-user-management', + component: SystemUserManagement, meta: { auth: true } }, { path: '/', From b96b8b630243badb90d1f9e8965bd29603c16601 Mon Sep 17 00:00:00 2001 From: abasic Date: Tue, 30 Oct 2018 15:52:24 +0100 Subject: [PATCH 005/213] Renamed disableInvite to isDisabled --- client/components/system-user-management/AddSystemUser.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/system-user-management/AddSystemUser.vue b/client/components/system-user-management/AddSystemUser.vue index 8b02a1a15..88911acdd 100644 --- a/client/components/system-user-management/AddSystemUser.vue +++ b/client/components/system-user-management/AddSystemUser.vue @@ -26,7 +26,7 @@
From d355c0cf61a79e2041514aba25ab6f66fbfb5cfd Mon Sep 17 00:00:00 2001 From: abasic Date: Wed, 31 Oct 2018 13:07:14 +0100 Subject: [PATCH 009/213] Replaced mounted with created in AddSystemUser component --- client/components/system-user-management/AddSystemUser.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/system-user-management/AddSystemUser.vue b/client/components/system-user-management/AddSystemUser.vue index 37b1df3f1..036a6bed1 100644 --- a/client/components/system-user-management/AddSystemUser.vue +++ b/client/components/system-user-management/AddSystemUser.vue @@ -63,7 +63,7 @@ export default { Object.assign(this, { email: '', role: this.defaultRole }); } }, - mounted() { + created() { this.reset(); }, components: { From 66d5153773540ac18f23e49f5d6de8cae6dc1c49 Mon Sep 17 00:00:00 2001 From: abasic Date: Wed, 31 Oct 2018 13:15:21 +0100 Subject: [PATCH 010/213] Minor clean up --- client/components/system-user-management/index.vue | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/components/system-user-management/index.vue b/client/components/system-user-management/index.vue index 89cb4351e..6747e06a6 100644 --- a/client/components/system-user-management/index.vue +++ b/client/components/system-user-management/index.vue @@ -1,7 +1,7 @@