11import db from '@codebuff/common/db'
22import * as schema from '@codebuff/common/db/schema'
3- import { logger } from '@codebuff/common/util/logger'
43import { eq } from 'drizzle-orm'
54import { LoopsClient , APIError } from 'loops'
65
76import type { LoopsEmailData , SendEmailResult } from './types'
7+ import type { ParamsExcluding , WithDefaults } from '@codebuff/types/common'
8+ import type { Logger } from '@codebuff/types/logger'
89
910const ORGANIZATION_INVITATION_TRANSACTIONAL_ID = 'cmbikixxm15xo4a0iiemzkzw1'
1011const BASIC_TRANSACTIONAL_ID = 'cmb8pafk92r820w0i7lkplkt2'
@@ -16,10 +17,22 @@ if (process.env.LOOPS_API_KEY) {
1617}
1718
1819async function sendTransactionalEmail (
19- transactionalId : string ,
20- email : string ,
21- dataVariables : Record < string , any > = { } ,
20+ params : WithDefaults <
21+ {
22+ transactionalId : string
23+ email : string
24+ dataVariables : Record < string , any >
25+ logger : Logger
26+ } ,
27+ 'dataVariables'
28+ > ,
2229) : Promise < SendEmailResult > {
30+ const withDefaults = {
31+ dataVariables : { } ,
32+ ...params ,
33+ }
34+ const { transactionalId, email, dataVariables, logger } = withDefaults
35+
2336 if ( ! loopsClient ) {
2437 return {
2538 success : false ,
@@ -63,11 +76,14 @@ async function sendTransactionalEmail(
6376 }
6477}
6578
66- export async function sendSignupEventToLoops (
67- userId : string ,
68- email : string | null ,
69- name : string | null ,
70- ) : Promise < void > {
79+ export async function sendSignupEventToLoops ( params : {
80+ userId : string
81+ email : string | null
82+ name : string | null
83+ logger : Logger
84+ } ) : Promise < void > {
85+ const { userId, email, name, logger } = params
86+
7187 if ( ! loopsClient ) {
7288 logger . warn ( { userId } , 'Loops SDK not initialized. Skipping signup event.' )
7389 return
@@ -116,9 +132,12 @@ export async function sendSignupEventToLoops(
116132 }
117133}
118134
119- export async function sendOrganizationInvitationEmail (
120- data : LoopsEmailData , // data no longer contains firstName
121- ) : Promise < SendEmailResult > {
135+ export async function sendOrganizationInvitationEmail ( params : {
136+ data : LoopsEmailData // data no longer contains firstName
137+ logger : Logger
138+ } ) : Promise < SendEmailResult > {
139+ const { data, logger } = params
140+
122141 let lookedUpFirstName : string = 'there' // Default to 'there'
123142 try {
124143 const inviteeUserRecord = await db
@@ -142,25 +161,36 @@ export async function sendOrganizationInvitationEmail(
142161 // Continue with default name 'there'
143162 }
144163
145- return sendTransactionalEmail (
146- ORGANIZATION_INVITATION_TRANSACTIONAL_ID ,
147- data . email ,
148- {
164+ return sendTransactionalEmail ( {
165+ transactionalId : ORGANIZATION_INVITATION_TRANSACTIONAL_ID ,
166+ email : data . email ,
167+ dataVariables : {
149168 firstName : lookedUpFirstName , // Use the looked-up or default name
150169 organizationName : data . organizationName || '' , // data.organizationName is still expected
151170 inviterName : data . inviterName || '' , // data.inviterName is still expected
152171 invitationUrl : data . invitationUrl || '' , // data.invitationUrl is still expected
153172 role : data . role || 'member' , // data.role is still expected
154173 } ,
155- )
174+ logger,
175+ } )
156176}
157177
158178export async function sendBasicEmail (
159- email : string ,
160- data : { subject : string ; message : string } ,
179+ params : {
180+ data : { subject : string ; message : string }
181+ } & ParamsExcluding <
182+ typeof sendTransactionalEmail ,
183+ 'transactionalId' | 'dataVariables'
184+ > ,
161185) : Promise < SendEmailResult > {
162- return sendTransactionalEmail ( BASIC_TRANSACTIONAL_ID , email , {
163- subject : data . subject ,
164- message : data . message ,
186+ const { data } = params
187+
188+ return sendTransactionalEmail ( {
189+ ...params ,
190+ transactionalId : BASIC_TRANSACTIONAL_ID ,
191+ dataVariables : {
192+ subject : data . subject ,
193+ message : data . message ,
194+ } ,
165195 } )
166196}
0 commit comments