From ab0eb221a33ecf1cc3f9f114c85321837c0f0327 Mon Sep 17 00:00:00 2001 From: chasprowebdev Date: Thu, 23 Jul 2026 16:48:20 -0400 Subject: [PATCH 1/2] feat(api): email org owners/admins when a portal access request is submitted --- .../evidence-access-request-submitted.tsx | 140 ++++++++++++++++ .../evidence-forms-notifier.service.spec.ts | 137 +++++++++++++++ .../evidence-forms-notifier.service.ts | 157 ++++++++++++++++++ .../evidence-forms/evidence-forms.module.ts | 3 +- .../evidence-forms.service.spec.ts | 84 +++++++++- .../evidence-forms/evidence-forms.service.ts | 19 +++ 6 files changed, 538 insertions(+), 2 deletions(-) create mode 100644 apps/api/src/email/templates/evidence-access-request-submitted.tsx create mode 100644 apps/api/src/evidence-forms/evidence-forms-notifier.service.spec.ts create mode 100644 apps/api/src/evidence-forms/evidence-forms-notifier.service.ts diff --git a/apps/api/src/email/templates/evidence-access-request-submitted.tsx b/apps/api/src/email/templates/evidence-access-request-submitted.tsx new file mode 100644 index 0000000000..d8907be134 --- /dev/null +++ b/apps/api/src/email/templates/evidence-access-request-submitted.tsx @@ -0,0 +1,140 @@ +import * as React from 'react'; +import { + Body, + Button, + Container, + Font, + Heading, + Html, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; +import { Footer } from '../components/footer'; +import { Logo } from '../components/logo'; +import { getUnsubscribeUrl } from '@trycompai/email'; + +interface Props { + toName: string; + toEmail: string; + organizationName: string; + requesterName: string; + accountsNeeded: string; + permissionsNeeded: string; + reasonForRequest: string; + reviewUrl: string; +} + +export const EvidenceAccessRequestSubmittedEmail = ({ + toName, + toEmail, + organizationName, + requesterName, + accountsNeeded, + permissionsNeeded, + reasonForRequest, + reviewUrl, +}: Props) => { + const unsubscribeUrl = getUnsubscribeUrl(toEmail); + + return ( + + + + + + + New access request from {requesterName} + + + + + + New Access Request + + + + Hello {toName}, + + + + {requesterName} submitted an access request in{' '} + {organizationName}. + + +
+ + Request Details + + + + Accounts Needed: {accountsNeeded} + + + + Permissions Needed: {permissionsNeeded} + + + + "{reasonForRequest}" + +
+ +
+ +
+ + + or copy and paste this URL into your browser:{' '} + + {reviewUrl} + + + +
+ + Don't want to receive access request notifications?{' '} + + Manage your email preferences + + . + +
+ +
+ +