@@ -350,6 +350,61 @@ export async function essEmailHandler(event: ApplicationEvent) {
350350 break ;
351351 }
352352
353+ case Event . DATA_ACCESS_USERS_UPDATED : {
354+ // Only newly added users are notified; a pure removal or no-op update
355+ // carries an empty list and sends nothing.
356+ if ( event . newlyAddedUserIds . length === 0 ) {
357+ return ;
358+ }
359+
360+ const proposal = await proposalDataSource . get ( event . proposalPKey ) ;
361+ if ( ! proposal ) {
362+ logger . logError ( 'No proposal found when trying to send email' , {
363+ proposalPKey : event . proposalPKey ,
364+ event,
365+ } ) ;
366+
367+ return ;
368+ }
369+
370+ const invitedUsers = await userDataSource . getBasicUsersInfo (
371+ event . newlyAddedUserIds
372+ ) ;
373+
374+ for ( const user of invitedUsers ) {
375+ mailService
376+ . sendMail ( {
377+ content : {
378+ template : EmailTemplateId . DATA_ACCESS_USER_ADDED ,
379+ } ,
380+ substitution_data : {
381+ preferredname : user . preferredname ,
382+ firstname : user . firstname ,
383+ lastname : user . lastname ,
384+ proposalTitle : proposal . title ,
385+ proposalId : proposal . proposalId ,
386+ } ,
387+ recipients : [ { address : user . email } ] ,
388+ } )
389+ . then ( ( res ) => {
390+ logger . logInfo ( 'Email sent on data access user added' , {
391+ result : res ,
392+ userId : user . id ,
393+ proposalPKey : event . proposalPKey ,
394+ } ) ;
395+ } )
396+ . catch ( ( err : string ) => {
397+ logger . logError ( 'Could not send email on data access user added' , {
398+ error : err ,
399+ userId : user . id ,
400+ event,
401+ } ) ;
402+ } ) ;
403+ }
404+
405+ return ;
406+ }
407+
353408 case Event . FAP_REVIEWER_NOTIFIED : {
354409 const { id : reviewId , userID, proposalPk } = event . fapReview ;
355410 const fapReviewer = await userDataSource . getUser ( userID ) ;
0 commit comments