Skip to content
This repository was archived by the owner on Jan 22, 2026. It is now read-only.

Commit 1486b35

Browse files
authored
Merge pull request #577 from Sage-Bionetworks/develop-fix-571
Give CREATE_PROJECT action permissions to users on first login (SSO)
2 parents 02eb7f8 + 7adb1dc commit 1486b35

File tree

6 files changed

+65
-46
lines changed

6 files changed

+65
-46
lines changed

server/auth/util.js

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import {
2-
omit
3-
} from 'lodash/fp';
4-
import config from '../config/environment';
1+
import { omit } from 'lodash/fp';
2+
import ActionPermission from '../api/action-permission/action-permission.model';
3+
import { userRoles, init, actionPermissionTypes } from '../config/environment';
54

65
export function handleUnauthorizedOrganization(done) {
76
return function (organization) {
@@ -16,23 +15,18 @@ export function handleUnauthorizedOrganization(done) {
1615
export function createOrUpdateUser(User, userDataFromProvider) {
1716
return function (organization) {
1817
if (organization) {
19-
return User
20-
.findOne({
21-
email: userDataFromProvider.email
22-
})
18+
return User.findOne({
19+
email: userDataFromProvider.email,
20+
})
2321
.exec()
2422
.then(user => {
2523
if (user) {
26-
userDataFromProvider = omit([
27-
'username',
28-
'email',
29-
'role'
30-
], userDataFromProvider);
24+
userDataFromProvider = omit(['username', 'email', 'role'], userDataFromProvider);
3125
user = Object.assign(user, userDataFromProvider);
3226
} else {
3327
user = new User(userDataFromProvider);
3428
user = Object.assign(user, {
35-
role: config.userRoles.USER.value
29+
role: userRoles.USER.value,
3630
});
3731
}
3832
return user;
@@ -44,8 +38,8 @@ export function createOrUpdateUser(User, userDataFromProvider) {
4438

4539
export function giveInitAdminRole() {
4640
return function (user) {
47-
if (user && user.email === config.init.admin.email) {
48-
user.role = config.userRoles.ADMIN.value;
41+
if (user && user.email === init.admin.email) {
42+
user.role = userRoles.ADMIN.value;
4943
}
5044
return user;
5145
};
@@ -54,9 +48,24 @@ export function giveInitAdminRole() {
5448
export function saveUser(done) {
5549
return function (user) {
5650
if (user) {
57-
return user.save()
58-
.then(savedUser => done(null, savedUser));
51+
if (user._id) { // returning user
52+
return user.save().then(savedUser => done(null, savedUser));
53+
} else { // new user
54+
return user
55+
.save()
56+
.then(newUser => {
57+
// TODO Implement in a more promise-chain friendly way
58+
ActionPermission.create([
59+
{
60+
user: newUser._id,
61+
action: actionPermissionTypes.CREATE_PROJECT.value,
62+
createdBy: newUser._id, // TODO: Is this the best choice?
63+
},
64+
]).then(() => newUser);
65+
})
66+
.then(savedUser => done(null, savedUser));
67+
}
5968
}
6069
return null;
61-
}
70+
};
6271
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import mongoose from 'mongoose';
22

33
const appId = new mongoose.Types.ObjectId('5cb6ad48e7bdc7740874fd87');
4+
// const appUserId = new mongoose.Types.ObjectId('5cb7bcea2d719614d82bb97f');
45
const adminUserId = new mongoose.Types.ObjectId('5cb7acea2d718614d81bb97f');
56

67
export { appId, adminUserId };

server/config/seeds/default/users.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { adminUserId } from './constants';
22
import config from '../../environment';
33

4+
// Notes:
5+
// - Users must have the property _id.
6+
47
let users = [
58
{
69
_id: adminUserId,
Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
import { adminUserId, testUserId } from './users';
2-
import { actionPermissionTypes } from '../../environment';
1+
// import { adminUserId, testUserId } from './users';
2+
// import { actionPermissionTypes } from '../../environment';
33

4-
let actionPermissions = [
5-
{
6-
user: testUserId,
7-
action: actionPermissionTypes.CREATE_PROJECT.value,
8-
createdBy: adminUserId,
9-
},
10-
];
4+
// Default action-permissions are created in server/config/seeds/index.js
5+
6+
let actionPermissions = [];
117

128
export { actionPermissions };

server/config/seeds/development/users.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import {
44
adminUserId
55
} from '../default/users';
66

7+
// Notes:
8+
// - Users must have the property _id.
9+
710
const testUserId = new mongoose.Types.ObjectId('5cb7acea2d718614d81cc97e');
811
const testUser1Id = new mongoose.Types.ObjectId('5cb7acea2371abc4d8121e91');
912

server/config/seeds/index.js

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
/*eslint no-process-env:0*/
2-
import {
3-
merge
4-
} from 'lodash';
2+
import { merge } from 'lodash';
53
import { flow, groupBy, orderBy, mapValues, uniqBy, get } from 'lodash/fp';
64
import config from '../../config/environment';
75
import { adminUserId } from './default/constants';
86
// import { message } from 'gulp-typescript/release/utils';
97

108
var default_ = require('./default');
119

12-
var seeds = module.exports = config.init.dbSeedName ? merge(
13-
default_,
14-
require(`./${config.init.dbSeedName}`) || {}) : null;
10+
var seeds = module.exports = config.init.dbSeedName
11+
? merge(default_, require(`./${config.init.dbSeedName}`) || {})
12+
: null;
1513

16-
// Creating entity-permissions with Admin access for the authors of projects
14+
// Create entity-permissions with Admin access for the authors of projects
1715
if (seeds && seeds.projects) {
1816
let permissions = seeds.projects.map(project => ({
1917
status: config.inviteStatusTypes.ACCEPTED.value,
@@ -23,13 +21,25 @@ if (seeds && seeds.projects) {
2321
access: config.accessTypes.ADMIN.value,
2422
createdBy: adminUserId,
2523
}));
26-
seeds.entityPermissions = [
27-
...seeds.entityPermissions,
28-
...permissions
29-
];
24+
seeds.entityPermissions = [...seeds.entityPermissions, ...permissions];
3025
}
3126

32-
// Creating entity-permissions with Admin access for the authors of tools
27+
// Create default action-permissions for the seed users
28+
if (seeds && seeds.users) {
29+
const createProject = seeds.users.map(user => ({
30+
user: user._id,
31+
action: config.actionPermissionTypes.CREATE_PROJECT.value,
32+
createdBy: user._id,
33+
}));
34+
35+
if (!seeds.actionPermissions) {
36+
seeds.actionPermissions = [];
37+
}
38+
39+
seeds.actionPermissions.push(...createProject);
40+
}
41+
42+
// Create entity-permissions with Admin access for the authors of tools
3343
if (seeds && seeds.tools) {
3444
let permissions = seeds.tools.map(tool => ({
3545
status: config.inviteStatusTypes.ACCEPTED.value,
@@ -39,13 +49,10 @@ if (seeds && seeds.tools) {
3949
access: config.accessTypes.ADMIN.value,
4050
createdBy: adminUserId,
4151
}));
42-
seeds.entityPermissions = [
43-
...seeds.entityPermissions,
44-
...permissions
45-
];
52+
seeds.entityPermissions = [...seeds.entityPermissions, ...permissions];
4653
}
4754

48-
// Populating thread.contributors from messages
55+
// Populate thread.contributors from messages
4956
if (seeds && seeds.threads && seeds.messages) {
5057
const contributorsByThread = flow([
5158
groupBy('thread'),
@@ -59,7 +66,7 @@ if (seeds && seeds.threads && seeds.messages) {
5966

6067
seeds.threads = seeds.threads.map(thread => ({
6168
...thread,
62-
contributors: get(thread._id, contributorsByThread)
69+
contributors: get(thread._id, contributorsByThread),
6370
}));
6471
}
6572

0 commit comments

Comments
 (0)