11import { db } from '@db' ;
22import { logger , schedules } from '@trigger.dev/sdk' ;
3- import { sendWeeklyTaskDigestEmail } from '@trycompai /email/lib/ weekly-task-digest' ;
3+ import { sendWeeklyTaskDigestEmailTask } from '.. /email/weekly-task-digest-email ' ;
44
55export const weeklyTaskReminder = schedules . task ( {
66 id : 'weekly-task-reminder' ,
@@ -34,11 +34,9 @@ export const weeklyTaskReminder = schedules.task({
3434
3535 logger . info ( `Found ${ organizations . length } organizations to process` ) ;
3636
37- let totalEmailsSent = 0 ;
38- let totalAdminsProcessed = 0 ;
39- const errors : string [ ] = [ ] ;
37+ // Build email payloads for all admins/owners with TODO tasks
38+ const emailPayloads = [ ] ;
4039
41- // Process each organization
4240 for ( const org of organizations ) {
4341 logger . info ( `Processing organization: ${ org . name } (${ org . id } )` ) ;
4442
@@ -65,46 +63,62 @@ export const weeklyTaskReminder = schedules.task({
6563
6664 logger . info ( `Found ${ todoTasks . length } TODO tasks for organization ${ org . name } ` ) ;
6765
68- // Send one email per admin/owner
66+ // Build payload for each admin/owner
6967 for ( const member of org . members ) {
7068 if ( ! member . user . email || ! member . user . name ) {
7169 logger . warn ( `Skipping member ${ member . id } - missing email or name` ) ;
7270 continue ;
7371 }
7472
75- try {
76- const result = await sendWeeklyTaskDigestEmail ( {
73+ emailPayloads . push ( {
74+ payload : {
7775 email : member . user . email ,
7876 userName : member . user . name ,
7977 organizationName : org . name ,
8078 organizationId : org . id ,
8179 tasks : todoTasks ,
82- } ) ;
83-
84- if ( result . success ) {
85- totalEmailsSent ++ ;
86- logger . info ( `Sent weekly task digest to ${ member . user . email } (${ org . name } )` ) ;
87- } else {
88- errors . push ( `Failed to send email to ${ member . user . email } (${ org . name } )` ) ;
89- logger . error ( `Failed to send email to ${ member . user . email } ` ) ;
90- }
91-
92- totalAdminsProcessed ++ ;
93- } catch ( error ) {
94- const errorMsg = `Error sending email to ${ member . user . email } (${ org . name } ): ${ error instanceof Error ? error . message : String ( error ) } ` ;
95- errors . push ( errorMsg ) ;
96- logger . error ( errorMsg ) ;
80+ } ,
81+ } ) ;
82+ }
83+ }
84+
85+ // Batch trigger all emails with concurrency control
86+ // Trigger.dev has a limit of 500 items per batchTrigger
87+ if ( emailPayloads . length > 0 ) {
88+ const BATCH_SIZE = 500 ;
89+ const batches = [ ] ;
90+
91+ for ( let i = 0 ; i < emailPayloads . length ; i += BATCH_SIZE ) {
92+ batches . push ( emailPayloads . slice ( i , i + BATCH_SIZE ) ) ;
93+ }
94+
95+ logger . info ( `Triggering ${ emailPayloads . length } emails in ${ batches . length } batch(es)` ) ;
96+
97+ try {
98+ for ( const batch of batches ) {
99+ await sendWeeklyTaskDigestEmailTask . batchTrigger ( batch ) ;
100+ logger . info ( `Triggered batch of ${ batch . length } emails` ) ;
97101 }
102+
103+ logger . info ( `Successfully triggered all ${ emailPayloads . length } weekly task digest emails` ) ;
104+ } catch ( error ) {
105+ logger . error ( `Failed to trigger batch email sends: ${ error } ` ) ;
106+
107+ return {
108+ success : false ,
109+ timestamp : new Date ( ) . toISOString ( ) ,
110+ organizationsProcessed : organizations . length ,
111+ totalAdminsProcessed : emailPayloads . length ,
112+ emailsTriggered : 0 ,
113+ error : error instanceof Error ? error . message : String ( error ) ,
114+ } ;
98115 }
99116 }
100117
101118 const summary = {
102- success : errors . length === 0 ,
103119 timestamp : new Date ( ) . toISOString ( ) ,
104120 organizationsProcessed : organizations . length ,
105- totalAdminsProcessed,
106- emailsSent : totalEmailsSent ,
107- errors : errors . length > 0 ? errors : undefined ,
121+ emailsTriggered : emailPayloads . length ,
108122 } ;
109123
110124 logger . info ( 'Weekly task reminder job completed' , summary ) ;
0 commit comments