1-
2-
31import _ from 'lodash' ;
2+ import Joi from 'joi' ;
3+ import validate from 'express-validation' ;
44import { middleware as tcMiddleware } from 'tc-core-library-js' ;
55import util from '../../util' ;
6- import { USER_ROLE , PROJECT_MEMBER_ROLE , MANAGER_ROLES , INVITE_STATUS } from '../../constants' ;
6+ import { INVITE_STATUS , MANAGER_ROLES , PROJECT_MEMBER_ROLE , USER_ROLE } from '../../constants' ;
77import models from '../../models' ;
88
99/**
@@ -13,14 +13,40 @@ import models from '../../models';
1313 */
1414const permissions = tcMiddleware . permissions ;
1515
16+ const createProjectMemberValidations = {
17+ body : {
18+ param : Joi . object ( )
19+ . keys ( {
20+ role : Joi . any ( )
21+ . valid ( PROJECT_MEMBER_ROLE . MANAGER , PROJECT_MEMBER_ROLE . ACCOUNT_MANAGER , PROJECT_MEMBER_ROLE . COPILOT ) ,
22+ } ) ,
23+ } ,
24+ } ;
25+
1626module . exports = [
1727 // handles request validations
28+ validate ( createProjectMemberValidations ) ,
1829 permissions ( 'project.addMember' ) ,
1930 ( req , res , next ) => {
2031 let targetRole ;
21- if ( util . hasRoles ( req , [ USER_ROLE . MANAGER ] ) ) {
32+ if ( _ . get ( req , 'body.param.role' ) ) {
33+ targetRole = _ . get ( req , 'body.param.role' ) ;
34+
35+ if ( [ PROJECT_MEMBER_ROLE . MANAGER , PROJECT_MEMBER_ROLE . ACCOUNT_MANAGER ] . includes ( targetRole ) &&
36+ ! util . hasRoles ( req , [ USER_ROLE . MANAGER ] ) ) {
37+ const err = new Error ( `Only manager is able to join as ${ targetRole } ` ) ;
38+ err . status = 401 ;
39+ return next ( err ) ;
40+ }
41+
42+ if ( targetRole === PROJECT_MEMBER_ROLE . COPILOT && ! util . hasRoles ( req , [ USER_ROLE . COPILOT ] ) ) {
43+ const err = new Error ( `Only copilot is able to join as ${ targetRole } ` ) ;
44+ err . status = 401 ;
45+ return next ( err ) ;
46+ }
47+ } else if ( util . hasRoles ( req , [ USER_ROLE . MANAGER , USER_ROLE . CONNECT_ADMIN ] ) ) {
2248 targetRole = PROJECT_MEMBER_ROLE . MANAGER ;
23- } else if ( util . hasRoles ( req , [ USER_ROLE . COPILOT ] ) ) {
49+ } else if ( util . hasRoles ( req , [ USER_ROLE . COPILOT , USER_ROLE . CONNECT_ADMIN ] ) ) {
2450 targetRole = PROJECT_MEMBER_ROLE . COPILOT ;
2551 } else {
2652 const err = new Error ( 'Only copilot or manager is able to call this endpoint' ) ;
@@ -60,13 +86,17 @@ module.exports = [
6086 . then ( ( _invite ) => {
6187 invite = _invite ;
6288 if ( ! invite ) {
63- return res . status ( 201 ) . json ( util . wrapResponse ( req . id , newMember , 1 , 201 ) ) ;
89+ return res . status ( 201 )
90+ . json ( util . wrapResponse ( req . id , newMember , 1 , 201 ) ) ;
6491 }
6592 return invite . update ( {
6693 status : INVITE_STATUS . ACCEPTED ,
67- } ) . then ( ( ) => res . status ( 201 ) . json ( util . wrapResponse ( req . id , newMember , 1 , 201 ) ) ) ;
94+ } )
95+ . then ( ( ) => res . status ( 201 )
96+ . json ( util . wrapResponse ( req . id , newMember , 1 , 201 ) ) ) ;
6897 } ) ;
6998 } ) ;
70- } ) . catch ( err => next ( err ) ) ;
99+ } )
100+ . catch ( err => next ( err ) ) ;
71101 } ,
72102] ;
0 commit comments