diff --git a/services/web/app/src/Features/UserMembership/UserMembershipAuthorization.js b/services/web/app/src/Features/UserMembership/UserMembershipAuthorization.js index c2f6269538..0daefe020a 100644 --- a/services/web/app/src/Features/UserMembership/UserMembershipAuthorization.js +++ b/services/web/app/src/Features/UserMembership/UserMembershipAuthorization.js @@ -122,6 +122,18 @@ module.exports = UserMembershipAuthorization = { ) }, + requireAdminMetricsStaffAccess(req, res, next) { + return requireAccessToEntity( + 'admin', + 'admin', + req, + res, + next, + 'adminMetrics', + true + ) + }, + requireTemplateMetricsAccess(req, res, next) { const templateId = req.params.id return request( @@ -202,6 +214,12 @@ module.exports = UserMembershipAuthorization = { res, next ) + } else if (req.query.resource_type === 'admin') { + return UserMembershipAuthorization.requireAdminMetricsStaffAccess( + req, + res, + next + ) } return requireAccessToEntity( req.query.resource_type, @@ -294,6 +312,9 @@ var getEntity = function( if (!entityConfig) { return callback(new Errors.NotFoundError(`No such entity: ${entityName}`)) } + if (!entityConfig.modelName) { + return callback(null, { id: entityName }, entityConfig, true) + } return UserMembershipHandler.getEntity( entityId, diff --git a/services/web/app/src/Features/UserMembership/UserMembershipEntityConfigs.js b/services/web/app/src/Features/UserMembership/UserMembershipEntityConfigs.js index 52b8a871f0..bc4e194d9f 100644 --- a/services/web/app/src/Features/UserMembership/UserMembershipEntityConfigs.js +++ b/services/web/app/src/Features/UserMembership/UserMembershipEntityConfigs.js @@ -127,5 +127,10 @@ module.exports = { primaryKey: 'slug', access: 'managerIds' } + }, + + admin: { + // for metrics only + modelName: null } } diff --git a/services/web/app/src/Features/UserMembership/UserMembershipsHandler.js b/services/web/app/src/Features/UserMembership/UserMembershipsHandler.js index c524e51015..10965e84e7 100644 --- a/services/web/app/src/Features/UserMembership/UserMembershipsHandler.js +++ b/services/web/app/src/Features/UserMembership/UserMembershipsHandler.js @@ -28,7 +28,7 @@ module.exports = UserMembershipsHandler = { const entityConfigs = [] for (let key in UserMembershipEntityConfigs) { const entityConfig = UserMembershipEntityConfigs[key] - if (entityConfig.fields.write != null) { + if (entityConfig.fields && entityConfig.fields.write != null) { entityConfigs.push(entityConfig) } } diff --git a/services/web/app/src/models/User.js b/services/web/app/src/models/User.js index 7f58d78d73..48eee2f5cf 100644 --- a/services/web/app/src/models/User.js +++ b/services/web/app/src/models/User.js @@ -42,7 +42,8 @@ const UserSchema = new Schema({ institutionMetrics: { type: Boolean, default: false }, institutionManagement: { type: Boolean, default: false }, groupMetrics: { type: Boolean, default: false }, - groupManagement: { type: Boolean, default: false } + groupManagement: { type: Boolean, default: false }, + adminMetrics: { type: Boolean, default: false } }, signUpDate: { type: Date,