Skip to content

Commit f4e34a7

Browse files
committed
WIP
1 parent f0f6df2 commit f4e34a7

File tree

1 file changed

+47
-17
lines changed

1 file changed

+47
-17
lines changed

coderd/notifications/reports/generator.go

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,26 @@ package reports
22

33
import (
44
"context"
5+
"database/sql"
56
"io"
67
"time"
78

89
"cdr.dev/slog"
10+
"golang.org/x/xerrors"
911

1012
"github.com/coder/coder/v2/coderd/database"
1113
"github.com/coder/coder/v2/coderd/database/dbauthz"
1214
"github.com/coder/coder/v2/coderd/database/dbtime"
1315
"github.com/coder/coder/v2/coderd/notifications"
16+
"github.com/coder/coder/v2/codersdk"
1417
"github.com/coder/quartz"
1518
)
1619

1720
const (
1821
delay = 5 * time.Minute
1922
)
2023

21-
func NewReportGenerator(ctx context.Context, logger slog.Logger, db database.Store, _ notifications.Enqueuer, clk quartz.Clock) io.Closer {
24+
func NewReportGenerator(ctx context.Context, logger slog.Logger, db database.Store, enqueur notifications.Enqueuer, clk quartz.Clock) io.Closer {
2225
closed := make(chan struct{})
2326

2427
ctx, cancelFunc := context.WithCancel(ctx)
@@ -41,22 +44,11 @@ func NewReportGenerator(ctx context.Context, logger slog.Logger, db database.Sto
4144
return nil
4245
}
4346

44-
// TODO Report - workspace_builds_failed:
45-
//
46-
// 1. Fetch template admins.
47-
// 2. Fetch templates.
48-
// 3. For every template:
49-
// 1. Fetch failed builds.
50-
// 2. If failed builds == 0, continue.
51-
// 3. Render the report.
52-
// 4. Fetch template RW users.
53-
// 5. For user := range template admins + RW users:
54-
// 1. Check if report is enabled for the person.
55-
// 2. Check `report_generator_log`.
56-
// 3. If sent recently, continue
57-
// 4. Send notification
58-
// 5. Upsert into `report_generator_log`.
59-
// 4. clean stale `report_generator_log` entries
47+
err = reportFailedWorkspaceBuilds(ctx, logger, db, enqueur, clk)
48+
if err != nil {
49+
logger.Debug(ctx, "unable to report failed workspace builds")
50+
return err
51+
}
6052

6153
logger.Info(ctx, "report generator finished", slog.F("duration", clk.Since(start)))
6254

@@ -98,3 +90,41 @@ func (i *reportGenerator) Close() error {
9890
<-i.closed
9991
return nil
10092
}
93+
94+
func reportFailedWorkspaceBuilds(ctx context.Context, logger slog.Logger, db database.Store, _ notifications.Enqueuer, clk quartz.Clock) error {
95+
const frequencyDays = 7
96+
97+
templateAdmins, err := db.GetUsers(ctx, database.GetUsersParams{
98+
RbacRole: []string{codersdk.RoleTemplateAdmin},
99+
})
100+
if err != nil {
101+
return xerrors.Errorf("unable to fetch template admins: %w", err)
102+
}
103+
104+
templates, err := db.GetTemplatesWithFilter(ctx, database.GetTemplatesWithFilterParams{
105+
Deleted: false,
106+
Deprecated: sql.NullBool{Bool: false, Valid: true},
107+
})
108+
if err != nil {
109+
return xerrors.Errorf("unable to fetch active templates: %w", err)
110+
}
111+
112+
for _, template := range templates {
113+
// 1. Fetch failed builds.
114+
// 2. If failed builds == 0, continue.
115+
// 3. Render the report.
116+
// 4. Fetch template RW users.
117+
// 5. For user := range template admins + RW users:
118+
// 1. Check if report is enabled for the person.
119+
// 2. Check `report_generator_log`.
120+
// 3. If sent recently, continue
121+
// 4. Send notification
122+
// 5. Upsert into `report_generator_log`.
123+
}
124+
125+
err = db.DeleteOldReportGeneratorLogs(ctx, frequencyDays)
126+
if err != nil {
127+
return xerrors.Errorf("unable to delete old report generator logs: %w", err)
128+
}
129+
return nil
130+
}

0 commit comments

Comments
 (0)