diff --git a/lib/integration.go b/lib/integration.go index 353a040..c783b44 100644 --- a/lib/integration.go +++ b/lib/integration.go @@ -11,6 +11,7 @@ type IIntegration interface { Create(ctx context.Context, request CreateIntegrationRequest) (*IntegrationResponse, error) GetAll(ctx context.Context) (*GetIntegrationsResponse, error) GetActive(ctx context.Context) (*GetIntegrationsResponse, error) + GetWebhookSupportStatus(ctx context.Context, providerId string) (bool, error) Update(ctx context.Context, integrationId string, request UpdateIntegrationRequest) (*IntegrationResponse, error) Delete(ctx context.Context, integrationId string) (*IntegrationResponse, error) } @@ -83,6 +84,25 @@ func (i IntegrationService) GetActive(ctx context.Context) (*GetIntegrationsResp return &response, nil } +func (i IntegrationService) GetWebhookSupportStatus(ctx context.Context, providerId string) (bool, error) { + URL := i.client.config.BackendURL.JoinPath("integrations", "webhook", "provider", providerId, "status") + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, URL.String(), http.NoBody) + + if err != nil { + return false, err + } + + var status bool + _, err = i.client.sendRequest(req, &status) + + if err != nil { + return false, err + } + + return status, nil +} + func (i IntegrationService) Update(ctx context.Context, integrationId string, request UpdateIntegrationRequest) (*IntegrationResponse, error) { var response IntegrationResponse URL := i.client.config.BackendURL.JoinPath("integrations", integrationId) diff --git a/lib/integration_test.go b/lib/integration_test.go index 57fac2b..bcf1066 100644 --- a/lib/integration_test.go +++ b/lib/integration_test.go @@ -169,6 +169,28 @@ func TestGetActiveIntegration_Success(t *testing.T) { require.NoError(t, err) } +func TestGetWebhookSupportStatusIntegration_Success(t *testing.T) { + providerId := "sendgrid" + response := true + httpServer := IntegrationTestServer(t, IntegrationServerOptions[interface{}]{ + ExpectedRequest: IntegrationRequestDetails[interface{}]{ + Url: fmt.Sprintf("/v1/integrations/webhook/provider/%s/status", providerId), + Method: http.MethodGet, + }, + ExpectedResponse: IntegrationResponseDetails{ + StatusCode: http.StatusOK, + Body: response, + }, + }) + + ctx := context.Background() + novuClient := lib.NewAPIClient(novuApiKey, &lib.Config{BackendURL: lib.MustParseURL(httpServer.URL)}) + + res, err := novuClient.IntegrationsApi.GetWebhookSupportStatus(ctx, providerId) + assert.Equal(t, response, res) + require.NoError(t, err) +} + func TestUpdateIntegration_Success(t *testing.T) { const integrationId = "integrationId" diff --git a/lib/model.go b/lib/model.go index bb955a1..2886edf 100644 --- a/lib/model.go +++ b/lib/model.go @@ -158,6 +158,15 @@ type GetTopicResponse struct { Subscribers []string `json:"subscribers"` } +type CheckTopicSubscriberResponse struct { + OrganizationId string `json:"_organizationId"` + EnvironmentId string `json:"_environmentId"` + SubsriberId string `json:"_subscriberId"` + Id string `json:"_topicId"` + Key string `json:"topicKey"` + ExternalSubscriberId string `json:"externalSubscriberId"` +} + type ListTopicsOptions struct { Page *int `json:"page,omitempty"` PageSize *int `json:"pageSize,omitempty"` diff --git a/lib/topic.go b/lib/topic.go index 5af2c35..40771ed 100644 --- a/lib/topic.go +++ b/lib/topic.go @@ -12,6 +12,7 @@ import ( type ITopic interface { Create(ctx context.Context, key string, name string) error List(ctx context.Context, options *ListTopicsOptions) (*ListTopicsResponse, error) + CheckTopicSubscriber(ctx context.Context, key string, externalsubscriber string) (*CheckTopicSubscriberResponse, error) AddSubscribers(ctx context.Context, key string, subscribers []string) error RemoveSubscribers(ctx context.Context, key string, subscribers []string) error Get(ctx context.Context, key string) (*GetTopicResponse, error) @@ -71,6 +72,23 @@ func (t *TopicService) List(ctx context.Context, options *ListTopicsOptions) (*L return &resp, nil } +func (t *TopicService) CheckTopicSubscriber(ctx context.Context, key string, externalsubscriber string) (*CheckTopicSubscriberResponse, error) { + var resp CheckTopicSubscriberResponse + URL := t.client.config.BackendURL.JoinPath("topics", key, "subscribers", externalsubscriber) + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, URL.String(), bytes.NewBuffer([]byte{})) + if err != nil { + return nil, err + } + + _, err = t.client.sendRequest(req, &resp) + if err != nil { + return nil, err + } + + return &resp, nil +} + func (t *TopicService) AddSubscribers(ctx context.Context, key string, subscribers []string) error { URL := t.client.config.BackendURL.JoinPath("topics", key, "subscribers") diff --git a/lib/topic_test.go b/lib/topic_test.go index 4ccf48a..8965eb2 100644 --- a/lib/topic_test.go +++ b/lib/topic_test.go @@ -91,6 +91,26 @@ func TestCreateTopic_Success(t *testing.T) { require.NoError(t, err) } +func TestCheckTopicSubscriber_Success(t *testing.T) { + topicKey := "topicKey" + subscriber := "subId" + httpServer := createTestServer(t, TestServerOptions[map[string]string, lib.CheckTopicSubscriberResponse]{ + expectedURLPath: fmt.Sprintf("/v1/topics/%s/subscribers/%s", topicKey, subscriber), + expectedSentMethod: http.MethodGet, + expectedSentBody: map[string]string{}, + responseStatusCode: http.StatusOK, + responseBody: lib.CheckTopicSubscriberResponse{ + ExternalSubscriberId: subscriber, + }, + }) + + ctx := context.Background() + c := lib.NewAPIClient(novuApiKey, &lib.Config{BackendURL: lib.MustParseURL(httpServer.URL)}) + _, err := c.TopicsApi.CheckTopicSubscriber(ctx, topicKey, subscriber) + + require.NoError(t, err) +} + func TestAddSubscription_Success(t *testing.T) { subs := []string{"subId"} key := "topicKey"