@@ -113,6 +113,7 @@ func reportFailedWorkspaceBuilds(ctx context.Context, logger slog.Logger, db dat
113
113
return statsRows [i ].TemplateName < statsRows [j ].TemplateName
114
114
})
115
115
116
+ reportRecipients := map [uuid.UUID ]bool {}
116
117
for _ , stats := range statsRows {
117
118
var failedBuilds []database.GetFailedWorkspaceBuildsByTemplateIDRow
118
119
reportData := map [string ]any {}
@@ -143,32 +144,19 @@ func reportFailedWorkspaceBuilds(ctx context.Context, logger slog.Logger, db dat
143
144
NotificationTemplateID : notifications .TemplateWorkspaceBuildsFailedReport ,
144
145
})
145
146
if err != nil && ! xerrors .Is (err , sql .ErrNoRows ) { // sql.ErrNoRows: report not generated yet
146
- return xerrors .Errorf ("unable to get recent report generator log for user: %w" , err )
147
+ logger .Error (ctx , "unable to get recent report generator log for user" , slog .F ("user_id" , templateAdmin .ID ), slog .Error (err ))
148
+ continue
147
149
}
148
150
149
151
if ! reportLog .LastGeneratedAt .IsZero () && reportLog .LastGeneratedAt .Add (failedWorkspaceBuildsReportFrequencyDays * 24 * time .Hour ).After (now ) {
150
152
// report generated recently, no need to send it now
151
- err = db .UpsertReportGeneratorLog (ctx , database.UpsertReportGeneratorLogParams {
152
- UserID : templateAdmin .ID ,
153
- NotificationTemplateID : notifications .TemplateWorkspaceBuildsFailedReport ,
154
- LastGeneratedAt : dbtime .Time (now ).UTC (),
155
- })
156
- if err != nil {
157
- logger .Error (ctx , "unable to update report generator logs" , slog .F ("template_id" , stats .TemplateID ), slog .F ("user_id" , templateAdmin .ID ), slog .F ("failed_builds" , len (failedBuilds )), slog .Error (err ))
158
- }
153
+ reportRecipients [templateAdmin .ID ] = true
159
154
continue
160
155
}
161
156
162
157
if len (failedBuilds ) == 0 {
163
158
// no failed workspace builds, no need to send the report
164
- err = db .UpsertReportGeneratorLog (ctx , database.UpsertReportGeneratorLogParams {
165
- UserID : templateAdmin .ID ,
166
- NotificationTemplateID : notifications .TemplateWorkspaceBuildsFailedReport ,
167
- LastGeneratedAt : dbtime .Time (now ).UTC (),
168
- })
169
- if err != nil {
170
- logger .Error (ctx , "unable to update report generator logs" , slog .F ("template_id" , stats .TemplateID ), slog .F ("user_id" , templateAdmin .ID ), slog .F ("failed_builds" , len (failedBuilds )), slog .Error (err ))
171
- }
159
+ reportRecipients [templateAdmin .ID ] = true
172
160
continue
173
161
}
174
162
@@ -188,16 +176,18 @@ func reportFailedWorkspaceBuilds(ctx context.Context, logger slog.Logger, db dat
188
176
); err != nil {
189
177
logger .Warn (ctx , "failed to send a report with failed workspace builds" , slog .Error (err ))
190
178
}
179
+ reportRecipients [templateAdmin .ID ] = true
180
+ }
181
+ }
191
182
192
- err = db .UpsertReportGeneratorLog (ctx , database.UpsertReportGeneratorLogParams {
193
- UserID : templateAdmin .ID ,
194
- NotificationTemplateID : notifications .TemplateWorkspaceBuildsFailedReport ,
195
- LastGeneratedAt : dbtime .Time (now ).UTC (),
196
- })
197
- if err != nil {
198
- logger .Error (ctx , "unable to update report generator logs" , slog .F ("template_id" , stats .TemplateID ), slog .F ("user_id" , templateAdmin .ID ), slog .F ("failed_builds" , len (failedBuilds )), slog .Error (err ))
199
- continue
200
- }
183
+ for recipient := range reportRecipients {
184
+ err = db .UpsertReportGeneratorLog (ctx , database.UpsertReportGeneratorLogParams {
185
+ UserID : recipient ,
186
+ NotificationTemplateID : notifications .TemplateWorkspaceBuildsFailedReport ,
187
+ LastGeneratedAt : dbtime .Time (now ).UTC (),
188
+ })
189
+ if err != nil {
190
+ logger .Error (ctx , "unable to update report generator logs" , slog .F ("user_id" , recipient ), slog .Error (err ))
201
191
}
202
192
}
203
193
0 commit comments