Skip to content
This repository was archived by the owner on Aug 30, 2025. It is now read-only.

Commit a3db163

Browse files
authored
NEOS-1765: update slack hooks to link to neosync resources (#3333)
1 parent cd0164e commit a3db163

File tree

5 files changed

+40
-14
lines changed

5 files changed

+40
-14
lines changed

backend/internal/cmds/mgmt/serve/connect/cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,7 @@ func serve(ctx context.Context) error {
524524
if cascadelicense.IsValid() {
525525
slogger.Debug("enabling account hooks service")
526526

527-
accountHookOptions := []accounthooks.Option{}
527+
accountHookOptions := []accounthooks.Option{accounthooks.WithAppBaseUrl(getAppBaseUrl())}
528528
var slackClient ee_slack.Interface
529529
if viper.GetBool("SLACK_ACCOUNT_HOOKS_ENABLED") {
530530
encryptor, err := sym_encrypt.NewEncryptor(viper.GetString("NEOSYNC_SYM_ENCRYPTION_PASSWORD"))

backend/internal/ee/hooks/accounts/service.go

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ type Interface interface {
4747
type config struct {
4848
isSlackEnabled bool
4949
slackClient ee_slack.Interface
50+
appBaseUrl string
5051
}
5152

5253
type Option func(*config)
@@ -58,6 +59,12 @@ func WithSlackClient(slackClient ee_slack.Interface) Option {
5859
}
5960
}
6061

62+
func WithAppBaseUrl(appBaseUrl string) Option {
63+
return func(c *config) {
64+
c.appBaseUrl = appBaseUrl
65+
}
66+
}
67+
6168
func New(
6269
db *neosyncdb.NeosyncDb,
6370
userdataclient userdata.Interface,
@@ -685,7 +692,12 @@ func (s *Service) SendSlackMessage(
685692
return nil, fmt.Errorf("unable to unmarshal event: %w", err)
686693
}
687694

688-
blocks := getSlackBlocksByEvent(event, logger)
695+
account, err := s.db.Q.GetAccount(ctx, s.db.Db, accountId)
696+
if err != nil {
697+
return nil, fmt.Errorf("unable to get account: %w", err)
698+
}
699+
700+
blocks := getSlackBlocksByEvent(event, s.cfg.appBaseUrl, account.AccountSlug, logger)
689701

690702
if len(blocks) == 0 {
691703
logger.Warn("received event that generated no slack blocks")
@@ -701,7 +713,19 @@ func (s *Service) SendSlackMessage(
701713
return &mgmtv1alpha1.SendSlackMessageResponse{}, nil
702714
}
703715

704-
func getSlackBlocksByEvent(event *accounthook_events.Event, logger *slog.Logger) []slack.Block {
716+
func buildJobIdUrlForSlack(appBaseUrl, accountName, jobId string) string {
717+
return fmt.Sprintf("<%s/jobs/%s|%s>", buildAccountBaseUrl(appBaseUrl, accountName), jobId, jobId)
718+
}
719+
720+
func buildJobRunUrlForSlack(appBaseUrl, accountName, jobRunId string) string {
721+
return fmt.Sprintf("<%s/runs/%s|%s>", buildAccountBaseUrl(appBaseUrl, accountName), jobRunId, jobRunId)
722+
}
723+
724+
func buildAccountBaseUrl(appBaseUrl, accountName string) string {
725+
return fmt.Sprintf("%s/%s", appBaseUrl, accountName)
726+
}
727+
728+
func getSlackBlocksByEvent(event *accounthook_events.Event, appBaseUrl, accountName string, logger *slog.Logger) []slack.Block {
705729
switch event.Name {
706730
case mgmtv1alpha1.AccountHookEvent_ACCOUNT_HOOK_EVENT_JOB_RUN_CREATED:
707731
if event.JobRunCreated == nil {
@@ -713,9 +737,9 @@ func getSlackBlocksByEvent(event *accounthook_events.Event, logger *slog.Logger)
713737
headerSection := slack.NewHeaderBlock(headerText)
714738

715739
jobFields := []*slack.TextBlockObject{
716-
slack.NewTextBlockObject(slack.MarkdownType, "*Job ID:*\n"+event.JobRunCreated.JobId, false, false),
717-
slack.NewTextBlockObject(slack.MarkdownType, "*Job Run ID:*\n"+event.JobRunCreated.JobRunId, false, false),
718-
slack.NewTextBlockObject(slack.MarkdownType, "*Started At:*\n<!date^"+fmt.Sprint(event.Timestamp.Unix())+"^{date_short_pretty} at {time}|"+event.Timestamp.Format(time.RFC3339)+">", false, false),
740+
slack.NewTextBlockObject(slack.MarkdownType, fmt.Sprintf("*Job ID:*\n%s", buildJobIdUrlForSlack(appBaseUrl, accountName, event.JobRunCreated.JobId)), false, false),
741+
slack.NewTextBlockObject(slack.MarkdownType, fmt.Sprintf("*Job Run ID:*\n%s", buildJobRunUrlForSlack(appBaseUrl, accountName, event.JobRunCreated.JobRunId)), false, false),
742+
slack.NewTextBlockObject(slack.MarkdownType, fmt.Sprintf("*Started At:*\n<!date^%d^{date_short_pretty} at {time}|%s>", event.Timestamp.Unix(), event.Timestamp.Format(time.RFC3339)), false, false),
719743
}
720744
fieldsSection := slack.NewSectionBlock(nil, jobFields, nil)
721745

@@ -739,9 +763,9 @@ func getSlackBlocksByEvent(event *accounthook_events.Event, logger *slog.Logger)
739763
headerSection := slack.NewHeaderBlock(headerText)
740764

741765
jobFields := []*slack.TextBlockObject{
742-
slack.NewTextBlockObject(slack.MarkdownType, "*Job ID:*\n"+event.JobRunFailed.JobId, false, false),
743-
slack.NewTextBlockObject(slack.MarkdownType, "*Job Run ID:*\n"+event.JobRunFailed.JobRunId, false, false),
744-
slack.NewTextBlockObject(slack.MarkdownType, "*Failed At:*\n<!date^"+fmt.Sprint(event.Timestamp.Unix())+"^{date_short_pretty} at {time}|"+event.Timestamp.Format(time.RFC3339)+">", false, false),
766+
slack.NewTextBlockObject(slack.MarkdownType, fmt.Sprintf("*Job ID:*\n%s", buildJobIdUrlForSlack(appBaseUrl, accountName, event.JobRunFailed.JobId)), false, false),
767+
slack.NewTextBlockObject(slack.MarkdownType, fmt.Sprintf("*Job Run ID:*\n%s", buildJobRunUrlForSlack(appBaseUrl, accountName, event.JobRunFailed.JobRunId)), false, false),
768+
slack.NewTextBlockObject(slack.MarkdownType, fmt.Sprintf("*Failed At:*\n<!date^%d^{date_short_pretty} at {time}|%s>", event.Timestamp.Unix(), event.Timestamp.Format(time.RFC3339)), false, false),
745769
}
746770
fieldsSection := slack.NewSectionBlock(nil, jobFields, nil)
747771

@@ -765,9 +789,9 @@ func getSlackBlocksByEvent(event *accounthook_events.Event, logger *slog.Logger)
765789
headerSection := slack.NewHeaderBlock(headerText)
766790

767791
jobFields := []*slack.TextBlockObject{
768-
slack.NewTextBlockObject(slack.MarkdownType, "*Job ID:*\n"+event.JobRunSucceeded.JobId, false, false),
769-
slack.NewTextBlockObject(slack.MarkdownType, "*Job Run ID:*\n"+event.JobRunSucceeded.JobRunId, false, false),
770-
slack.NewTextBlockObject(slack.MarkdownType, "*Succeeded At:*\n<!date^"+fmt.Sprint(event.Timestamp.Unix())+"^{date_short_pretty} at {time}|"+event.Timestamp.Format(time.RFC3339)+">", false, false),
792+
slack.NewTextBlockObject(slack.MarkdownType, fmt.Sprintf("*Job ID:*\n%s", buildJobIdUrlForSlack(appBaseUrl, accountName, event.JobRunSucceeded.JobId)), false, false),
793+
slack.NewTextBlockObject(slack.MarkdownType, fmt.Sprintf("*Job Run ID:*\n%s", buildJobRunUrlForSlack(appBaseUrl, accountName, event.JobRunSucceeded.JobRunId)), false, false),
794+
slack.NewTextBlockObject(slack.MarkdownType, fmt.Sprintf("*Succeeded At:*\n<!date^%d^{date_short_pretty} at {time}|%s>", event.Timestamp.Unix(), event.Timestamp.Format(time.RFC3339)), false, false),
771795
}
772796
fieldsSection := slack.NewSectionBlock(nil, jobFields, nil)
773797

compose.dev.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ services:
5252
- POSTGRES_PASSWORD=foofar
5353
- PGUSER=postgres
5454
healthcheck:
55-
test: ["CMD", "pg_isready"]
55+
test: ['CMD', 'pg_isready']
5656
interval: 10s
5757
timeout: 5s
5858
retries: 5
@@ -73,6 +73,7 @@ services:
7373
- HOST=0.0.0.0
7474
- PORT=8080
7575
- NUCLEUS_ENV=dev
76+
- APP_BASEURL=http://localhost:3000
7677
- TEMPORAL_URL=temporal:7233
7778
- DB_AUTO_MIGRATE=true
7879
- DB_SCHEMA_DIR=/workspace/backend/sql/postgresql/schema

compose.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ services:
6161
- HOST=0.0.0.0
6262
- PORT=8080
6363
- NUCLEUS_ENV=dev
64+
- APP_BASEURL=http://localhost:3000
6465
- TEMPORAL_URL=temporal:7233
6566
- DB_AUTO_MIGRATE=true
6667
- DB_SCHEMA_DIR=/migrations

worker/pkg/workflows/ee/account_hooks/activities/execute/activity.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ func executeSlackMessage(
122122
Event: bits,
123123
}))
124124
if err != nil {
125-
return fmt.Errorf("unable to send slack message: %w", err)
125+
return fmt.Errorf("unable to send slack message to api: %w", err)
126126
}
127127
return nil
128128
}

0 commit comments

Comments
 (0)