Skip to content

Commit 57017b9

Browse files
committed
move team notifications to notification configuration resources, use patched jsonapi
1 parent b5ede4b commit 57017b9

10 files changed

+553
-899
lines changed

errors.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ var (
145145

146146
ErrInvalidNotificationConfigID = errors.New("invalid value for notification configuration ID")
147147

148+
ErrInvalidNotificationConfigSubscribableChoice = errors.New("invalid value for notification configuration subscribable choice")
149+
148150
ErrInvalidMembership = errors.New("invalid value for membership")
149151

150152
ErrInvalidMembershipIDs = errors.New("invalid value for organization membership ids")

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,5 @@ require (
2222
golang.org/x/sys v0.25.0 // indirect
2323
gopkg.in/yaml.v3 v3.0.1 // indirect
2424
)
25+
26+
replace github.com/hashicorp/jsonapi => github.com/notchairmk/jsonapi v0.0.0-20241223221631-b0c6a5b7edd8

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/C
1616
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
1717
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
1818
github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
19-
github.com/hashicorp/jsonapi v1.3.1 h1:GtPvnmcWgYwCuDGvYT5VZBHcUyFdq9lSyCzDjn1DdPo=
20-
github.com/hashicorp/jsonapi v1.3.1/go.mod h1:kWfdn49yCjQvbpnvY1dxxAuAFzISwrrMDQOcu6NsFoM=
2119
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
2220
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
21+
github.com/notchairmk/jsonapi v0.0.0-20241223221631-b0c6a5b7edd8 h1:Nll3UptyKamtMP60oCHnRKI3l/kgadZHKQ6/uLYPyVM=
22+
github.com/notchairmk/jsonapi v0.0.0-20241223221631-b0c6a5b7edd8/go.mod h1:kWfdn49yCjQvbpnvY1dxxAuAFzISwrrMDQOcu6NsFoM=
2323
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
2424
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
2525
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=

helper_test.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ func createNotificationConfiguration(t *testing.T, client *Client, w *Workspace,
615615
}
616616
}
617617

618-
func createTeamNotificationConfiguration(t *testing.T, client *Client, team *Team, options *TeamNotificationConfigurationCreateOptions) (*TeamNotificationConfiguration, func()) {
618+
func createTeamNotificationConfiguration(t *testing.T, client *Client, team *Team, options *NotificationConfigurationCreateOptions) (*NotificationConfiguration, func()) {
619619
var tCleanup func()
620620

621621
if team == nil {
@@ -630,18 +630,19 @@ func createTeamNotificationConfiguration(t *testing.T, client *Client, team *Tea
630630
}
631631

632632
if options == nil {
633-
options = &TeamNotificationConfigurationCreateOptions{
634-
DestinationType: NotificationDestination(NotificationDestinationTypeGeneric),
635-
Enabled: Bool(false),
636-
Name: String(randomString(t)),
637-
Token: String(randomString(t)),
638-
URL: String(runTaskURL),
639-
Triggers: []NotificationTriggerType{NotificationTriggerChangeRequestCreated},
633+
options = &NotificationConfigurationCreateOptions{
634+
DestinationType: NotificationDestination(NotificationDestinationTypeGeneric),
635+
Enabled: Bool(false),
636+
Name: String(randomString(t)),
637+
Token: String(randomString(t)),
638+
URL: String(runTaskURL),
639+
Triggers: []NotificationTriggerType{NotificationTriggerChangeRequestCreated},
640+
SubscribableChoice: &NotificationConfigurationSubscribableChoice{Team: team},
640641
}
641642
}
642643

643644
ctx := context.Background()
644-
nc, err := client.TeamNotificationConfigurations.Create(
645+
nc, err := client.NotificationConfigurations.Create(
645646
ctx,
646647
team.ID,
647648
*options,
@@ -651,10 +652,10 @@ func createTeamNotificationConfiguration(t *testing.T, client *Client, team *Tea
651652
}
652653

653654
return nc, func() {
654-
if err := client.TeamNotificationConfigurations.Delete(ctx, nc.ID); err != nil {
655+
if err := client.NotificationConfigurations.Delete(ctx, nc.ID); err != nil {
655656
t.Errorf("Error destroying team notification configuration! WARNING: Dangling\n"+
656657
"resources may exist! The full error is shown below.\n\n"+
657-
"TeamNotificationConfiguration: %s\nError: %s", nc.ID, err)
658+
"NotificationConfiguration: %s\nError: %s", nc.ID, err)
658659
}
659660

660661
if tCleanup != nil {

notification_configuration.go

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,14 @@ type NotificationConfigurationList struct {
8181
Items []*NotificationConfiguration
8282
}
8383

84+
// NotificationConfigurationSubscribableChoice is a choice type struct that represents the possible values
85+
// within a polymorphic relation. If a value is available, exactly one field
86+
// will be non-nil.
87+
type NotificationConfigurationSubscribableChoice struct {
88+
Team *Team
89+
Workspace *Workspace
90+
}
91+
8492
// NotificationConfiguration represents a Notification Configuration.
8593
type NotificationConfiguration struct {
8694
ID string `jsonapi:"primary,notification-configurations"`
@@ -98,8 +106,11 @@ type NotificationConfiguration struct {
98106
EmailAddresses []string `jsonapi:"attr,email-addresses"`
99107

100108
// Relations
101-
Subscribable *Workspace `jsonapi:"relation,subscribable"`
102-
EmailUsers []*User `jsonapi:"relation,users"`
109+
// DEPRECATED. The subscribable field is polymorphic. Use NotificationConfigurationSubscribableChoice instead.
110+
Subscribable *Workspace `jsonapi:"relation,subscribable"`
111+
SubscribableChoice *NotificationConfigurationSubscribableChoice `jsonapi:"polyrelation,subscribable"`
112+
113+
EmailUsers []*User `jsonapi:"relation,users"`
103114
}
104115

105116
// DeliveryResponse represents a notification configuration delivery response.
@@ -116,6 +127,8 @@ type DeliveryResponse struct {
116127
// notification configurations.
117128
type NotificationConfigurationListOptions struct {
118129
ListOptions
130+
131+
SubscribableChoice *NotificationConfigurationSubscribableChoice `jsonapi:"polyrelation,subscribable"`
119132
}
120133

121134
// NotificationConfigurationCreateOptions represents the options for
@@ -151,6 +164,9 @@ type NotificationConfigurationCreateOptions struct {
151164

152165
// Optional: The list of users belonging to the organization that will receive notification emails.
153166
EmailUsers []*User `jsonapi:"relation,users,omitempty"`
167+
168+
// Required: The workspace or team that the notification configuration is associated with.
169+
SubscribableChoice *NotificationConfigurationSubscribableChoice `jsonapi:"polyrelation,subscribable"`
154170
}
155171

156172
// NotificationConfigurationUpdateOptions represents the options for
@@ -186,12 +202,22 @@ type NotificationConfigurationUpdateOptions struct {
186202
}
187203

188204
// List all the notification configurations associated with a workspace.
189-
func (s *notificationConfigurations) List(ctx context.Context, workspaceID string, options *NotificationConfigurationListOptions) (*NotificationConfigurationList, error) {
190-
if !validStringID(&workspaceID) {
191-
return nil, ErrInvalidWorkspaceID
205+
func (s *notificationConfigurations) List(ctx context.Context, subscribableID string, options *NotificationConfigurationListOptions) (*NotificationConfigurationList, error) {
206+
var u string
207+
if options == nil || options.SubscribableChoice == nil || options.SubscribableChoice.Workspace != nil {
208+
if !validStringID(&subscribableID) {
209+
return nil, ErrInvalidWorkspaceID
210+
}
211+
u = fmt.Sprintf("workspaces/%s/notification-configurations", url.PathEscape(subscribableID))
212+
} else if options.SubscribableChoice.Team != nil {
213+
if !validStringID(&subscribableID) {
214+
return nil, ErrInvalidTeamID
215+
}
216+
u = fmt.Sprintf("teams/%s/notification-configurations", url.PathEscape(subscribableID))
217+
} else {
218+
return nil, ErrInvalidNotificationConfigSubscribableChoice
192219
}
193220

194-
u := fmt.Sprintf("workspaces/%s/notification-configurations", url.PathEscape(workspaceID))
195221
req, err := s.client.NewRequest("GET", u, options)
196222
if err != nil {
197223
return nil, err
@@ -207,22 +233,39 @@ func (s *notificationConfigurations) List(ctx context.Context, workspaceID strin
207233
}
208234

209235
// Create a notification configuration with the given options.
210-
func (s *notificationConfigurations) Create(ctx context.Context, workspaceID string, options NotificationConfigurationCreateOptions) (*NotificationConfiguration, error) {
211-
if !validStringID(&workspaceID) {
212-
return nil, ErrInvalidWorkspaceID
213-
}
236+
func (s *notificationConfigurations) Create(ctx context.Context, subscribableID string, options NotificationConfigurationCreateOptions) (*NotificationConfiguration, error) {
214237
if err := options.valid(); err != nil {
215238
return nil, err
216239
}
217240

218-
u := fmt.Sprintf("workspaces/%s/notification-configurations", url.PathEscape(workspaceID))
241+
var u string
242+
var subscribableChoice *NotificationConfigurationSubscribableChoice
243+
if options.SubscribableChoice == nil || options.SubscribableChoice.Workspace != nil {
244+
if !validStringID(&subscribableID) {
245+
return nil, ErrInvalidWorkspaceID
246+
}
247+
248+
u = fmt.Sprintf("workspaces/%s/notification-configurations", url.PathEscape(subscribableID))
249+
subscribableChoice = &NotificationConfigurationSubscribableChoice{Workspace: &Workspace{ID: subscribableID}}
250+
} else if options.SubscribableChoice != nil && options.SubscribableChoice.Team != nil {
251+
if !validStringID(&subscribableID) {
252+
return nil, ErrInvalidTeamID
253+
}
254+
255+
u = fmt.Sprintf("teams/%s/notification-configurations", url.PathEscape(subscribableID))
256+
subscribableChoice = &NotificationConfigurationSubscribableChoice{Team: &Team{ID: subscribableID}}
257+
} else {
258+
return nil, ErrInvalidNotificationConfigSubscribableChoice
259+
}
260+
219261
req, err := s.client.NewRequest("POST", u, &options)
220262
if err != nil {
221263
return nil, err
222264
}
223265

224-
nc := &NotificationConfiguration{}
266+
nc := &NotificationConfiguration{SubscribableChoice: subscribableChoice}
225267
err = req.Do(ctx, nc)
268+
226269
if err != nil {
227270
return nil, err
228271
}
@@ -364,6 +407,7 @@ func validNotificationTriggerType(triggers []NotificationTriggerType) bool {
364407
NotificationTriggerAssessmentFailed,
365408
NotificationTriggerWorkspaceAutoDestroyReminder,
366409
NotificationTriggerWorkspaceAutoDestroyRunResults,
410+
NotificationTriggerChangeRequestCreated,
367411
NotificationTriggerAssessmentCheckFailed:
368412
continue
369413
default:

0 commit comments

Comments
 (0)