@@ -14,7 +14,7 @@ const errors = require('../common/errors')
1414const constants = require ( '../../app-constants' )
1515const prisma = require ( '../common/prisma' ) . getClient ( )
1616
17- const payloadFields = [ 'id' , 'challengeId' , 'memberId' , 'memberHandle' , 'roleId' , 'created' , 'createdBy' , 'updated' , 'updatedBy' ]
17+ const payloadFields = [ 'id' , 'challengeId' , 'memberId' , 'memberHandle' , 'roleId' , 'phaseChangeNotifications' , ' created', 'createdBy' , 'updated' , 'updatedBy' ]
1818
1919let copilotResourceRoleIdsCache
2020
@@ -170,6 +170,7 @@ async function getResources (currentUser, challengeId, roleId, memberId, memberH
170170 resources = _ . map ( resources , item => {
171171 const ret = _ . omit ( item , 'updatedBy' , 'updatedAt' , 'createdAt' )
172172 ret . created = item . createdAt
173+ ret . phaseChangeNotifications = Boolean ( item . phaseChangeNotifications )
173174 return ret
174175 } )
175176
@@ -423,6 +424,7 @@ async function createResource (currentUser, resource) {
423424 let ret = _ . pick ( createdResource , payloadFields )
424425 ret . created = createdResource . createdAt
425426 ret . updated = createdResource . updatedAt
427+ ret . phaseChangeNotifications = Boolean ( createdResource . phaseChangeNotifications )
426428
427429 logger . debug ( `Created resource: ${ JSON . stringify ( ret ) } ` )
428430 await helper . postEvent ( config . RESOURCE_CREATE_TOPIC , ret )
@@ -525,6 +527,7 @@ async function deleteResource (currentUser, resource) {
525527 created : ret . createdAt ,
526528 updated : ret . updatedAt
527529 }
530+ ret . phaseChangeNotifications = Boolean ( ret . phaseChangeNotifications )
528531 await prisma . resource . deleteMany ( { where : { id : ret . id } } )
529532
530533 logger . debug ( `Deleted resource, posting to Bus API: ${ JSON . stringify ( ret ) } ` )
@@ -568,6 +571,59 @@ deleteResource.schema = {
568571 )
569572}
570573
574+ /**
575+ * Update the phase change notifications preference for a resource.
576+ * @param {Object } currentUser the current user
577+ * @param {String } resourceId the resource id
578+ * @param {Object } payload the incoming payload
579+ * @returns {Object } the updated resource
580+ */
581+ async function updatePhaseChangeNotifications ( currentUser , resourceId , payload ) {
582+ logger . debug ( `updatePhaseChangeNotifications ${ JSON . stringify ( [ resourceId , payload ] ) } ` )
583+
584+ const resource = await prisma . resource . findUnique ( { where : { id : resourceId } } )
585+
586+ if ( ! resource ) {
587+ throw new errors . NotFoundError ( `Resource with id ${ resourceId } not found` )
588+ }
589+
590+ const isMachineUser = Boolean ( currentUser && currentUser . isMachine )
591+ const isAdminUser = Boolean ( currentUser && helper . hasAdminRole ( currentUser ) )
592+
593+ if ( ! isMachineUser && ! isAdminUser ) {
594+ if ( ! currentUser || _ . toString ( resource . memberId ) !== _ . toString ( currentUser . userId ) ) {
595+ throw new errors . ForbiddenError ( 'You may only update your own phase change notification preference.' )
596+ }
597+ }
598+
599+ const updatedBy = isMachineUser
600+ ? ( currentUser . sub || currentUser . clientId || 'system' )
601+ : _ . toString ( currentUser . userId )
602+
603+ const updatedResource = await prisma . resource . update ( {
604+ where : { id : resourceId } ,
605+ data : {
606+ phaseChangeNotifications : payload . phaseChangeNotifications ,
607+ updatedBy
608+ }
609+ } )
610+
611+ const ret = _ . pick ( updatedResource , payloadFields )
612+ ret . created = updatedResource . createdAt
613+ ret . updated = updatedResource . updatedAt
614+ ret . phaseChangeNotifications = Boolean ( updatedResource . phaseChangeNotifications )
615+
616+ return ret
617+ }
618+
619+ updatePhaseChangeNotifications . schema = {
620+ currentUser : Joi . any ( ) ,
621+ resourceId : Joi . id ( ) . required ( ) ,
622+ payload : Joi . object ( ) . keys ( {
623+ phaseChangeNotifications : Joi . boolean ( ) . required ( )
624+ } ) . required ( )
625+ }
626+
571627/**
572628 * List all challenge ids that given member has access to.
573629 * @param {Number } memberId the member id
@@ -658,6 +714,7 @@ module.exports = {
658714 getResources,
659715 createResource,
660716 deleteResource,
717+ updatePhaseChangeNotifications,
661718 listChallengesByMember,
662719 getResourceCount
663720}
0 commit comments