From 55315b89f3fd01cc4fc8ee9bf3ada2348af86c12 Mon Sep 17 00:00:00 2001 From: Lukasz Ostrowski Date: Mon, 4 Sep 2023 20:13:58 +0200 Subject: [PATCH] Fix Search webhooks toggling (#961) * Fix Search webhooks toggling * fix test --- .../search/src/pages/api/recreate-webhooks.ts | 16 +++----- apps/search/src/pages/api/webhooks-status.ts | 19 +++++----- .../handlers/webhooks-status-handler.test.ts | 37 +++++++++++++------ 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/apps/search/src/pages/api/recreate-webhooks.ts b/apps/search/src/pages/api/recreate-webhooks.ts index 0617196..f2205eb 100644 --- a/apps/search/src/pages/api/recreate-webhooks.ts +++ b/apps/search/src/pages/api/recreate-webhooks.ts @@ -10,6 +10,7 @@ import { SettingsManager } from "@saleor/app-sdk/settings-manager"; import { createGraphQLClient, getAppBaseUrl } from "@saleor/apps-shared"; import { Client } from "urql"; import { isConfigured } from "../../lib/algolia/is-configured"; +import { AppConfigMetadataManager } from "../../modules/configuration/app-config-metadata-manager"; const logger = createLogger({ service: "recreateWebhooksHandler", @@ -41,22 +42,17 @@ export const recreateWebhooksHandlerFactory = const webhooksToggler = webhookActivityTogglerFactory(authData.appId, client); const settingsManager = settingsManagerFactory(client, authData.appId); - const domain = new URL(authData.saleorApiUrl).host; + const configManager = new AppConfigMetadataManager(settingsManager); - const [secretKey, appId] = await Promise.all([ - settingsManager.get("secretKey", domain), - settingsManager.get("appId", domain), - ]); + const config = (await configManager.get(authData.saleorApiUrl)).getConfig(); - const settings = { secretKey, appId }; - - logger.debug(settings, "fetched settings"); + logger.debug("fetched settings"); const baseUrl = getAppBaseUrl(req.headers); const enableWebhooks = isConfigured({ configuration: { - appId: appId, - secretKey: secretKey, + appId: config.appConfig?.appId, + secretKey: config.appConfig?.secretKey, }, }); diff --git a/apps/search/src/pages/api/webhooks-status.ts b/apps/search/src/pages/api/webhooks-status.ts index 42555a5..345e90d 100644 --- a/apps/search/src/pages/api/webhooks-status.ts +++ b/apps/search/src/pages/api/webhooks-status.ts @@ -13,6 +13,7 @@ import { SearchProvider } from "../../lib/searchProvider"; import { createGraphQLClient } from "@saleor/apps-shared"; import { Client } from "urql"; import { isWebhookUpdateNeeded } from "../../lib/algolia/is-webhook-update-needed"; +import { AppConfigMetadataManager } from "../../modules/configuration/app-config-metadata-manager"; const logger = createLogger({ service: "webhooksStatusHandler", @@ -54,23 +55,18 @@ export const webhooksStatusHandlerFactory = const webhooksToggler = webhookActivityTogglerFactory(authData.appId, client); const settingsManager = settingsManagerFactory(client, authData.appId); - const domain = new URL(authData.saleorApiUrl).host; + const configManager = new AppConfigMetadataManager(settingsManager); - const [secretKey, appId] = await Promise.all([ - settingsManager.get("secretKey", domain), - settingsManager.get("appId", domain), - ]); + const config = (await configManager.get(authData.saleorApiUrl)).getConfig(); - const settings = { secretKey, appId }; - - logger.debug(settings, "fetched settings"); + logger.debug("fetched settings"); /** * If settings are incomplete, disable webhooks * * TODO Extract config operations to domain/ */ - if (!settings.appId || !settings.secretKey) { + if (!config.appConfig) { logger.debug("Settings not set, will disable webhooks"); await webhooksToggler.disableOwnWebhooks(); @@ -78,7 +74,10 @@ export const webhooksStatusHandlerFactory = /** * Otherwise, if settings are set, check in Algolia if tokens are valid */ - const algoliaService = algoliaSearchProviderFactory(settings.appId, settings.secretKey); + const algoliaService = algoliaSearchProviderFactory( + config.appConfig.appId, + config.appConfig.secretKey, + ); try { logger.debug("Settings set, will ping Algolia"); diff --git a/apps/search/src/test/handlers/webhooks-status-handler.test.ts b/apps/search/src/test/handlers/webhooks-status-handler.test.ts index e19e985..9527dc8 100644 --- a/apps/search/src/test/handlers/webhooks-status-handler.test.ts +++ b/apps/search/src/test/handlers/webhooks-status-handler.test.ts @@ -1,16 +1,13 @@ -import { beforeEach, describe, expect, it, Mock, vi } from "vitest"; +import { NextProtectedApiHandler } from "@saleor/app-sdk/handlers/next"; +import { SettingsManager } from "@saleor/app-sdk/settings-manager"; import { createMocks } from "node-mocks-http"; -import { webhooksStatusHandlerFactory } from "../../pages/api/webhooks-status"; import { Client, OperationResult } from "urql"; +import { beforeEach, describe, expect, it, Mock, vi } from "vitest"; +import { FetchOwnWebhooksQuery, WebhookEventTypeAsyncEnum } from "../../../generated/graphql"; import { IWebhookActivityTogglerService } from "../../domain/WebhookActivityToggler.service"; import { SearchProvider } from "../../lib/searchProvider"; -import { SettingsManager } from "@saleor/app-sdk/settings-manager"; -import { NextProtectedApiHandler } from "@saleor/app-sdk/handlers/next"; -import { - FetchOwnWebhooksQuery, - WebhookEventTypeAsyncEnum, - WebhookEventTypeEnum, -} from "../../../generated/graphql"; +import { webhooksStatusHandlerFactory } from "../../pages/api/webhooks-status"; +import { AppConfig } from "../../modules/configuration/configuration"; /** * Context provided from ProtectedApiHandler to handler body @@ -100,8 +97,16 @@ describe("webhooksStatusHandler", () => { expect(res._getStatusCode()).toBe(200); }); - it("Disables webhooks if Algolia credentials are invalid", async function () { - (settingsManagerMock.get as Mock).mockReturnValue("metadata-value"); + it("Disables webhooks if Algolia credentials are set, but invalid", async function () { + const invalidConfig = new AppConfig(); + + invalidConfig.setAlgoliaSettings({ + appId: "asd", + secretKey: "wrong", + indexNamePrefix: "test", + }); + + (settingsManagerMock.get as Mock).mockReturnValueOnce(invalidConfig.serialize()); (algoliaSearchProviderMock.ping as Mock).mockImplementationOnce(async () => { throw new Error(); }); @@ -116,7 +121,15 @@ describe("webhooksStatusHandler", () => { }); it("Returns webhooks if Algolia credentials are valid", async function () { - (settingsManagerMock.get as Mock).mockReturnValue("metadata-value"); + const validConfig = new AppConfig(); + + validConfig.setAlgoliaSettings({ + appId: "asd", + secretKey: "asddsada", + indexNamePrefix: "test", + }); + + (settingsManagerMock.get as Mock).mockReturnValueOnce(validConfig.serialize()); (algoliaSearchProviderMock.ping as Mock).mockImplementationOnce(async () => Promise.resolve()); const { req, res } = createMocks({});