saleor-apps-redis_apl/apps/search/src/pages/api/setup-indices.ts
Krzysztof Wolski 2a1385bab1
Search: Fix stale variants after product removal, add indices setup and product descriptions (#932)
* Move plaintext renderer to shared package and use it for Algolia documents

* Fix stale variants after product removal, add indices setup

* Search: webhooks migration script (#936)

* Add webhook recreation script

* Add changeset
2023-08-29 13:19:31 +02:00

78 lines
2.6 KiB
TypeScript

import { createProtectedHandler, NextProtectedApiHandler } from "@saleor/app-sdk/handlers/next";
import { saleorApp } from "../../../saleor-app";
import { createSettingsManager } from "../../lib/metadata";
import { createLogger } from "../../lib/logger";
import { SettingsManager } from "@saleor/app-sdk/settings-manager";
import { createGraphQLClient } from "@saleor/apps-shared";
import { Client } from "urql";
import { ChannelsDocument } from "../../../generated/graphql";
import { AlgoliaSearchProvider } from "../../lib/algolia/algoliaSearchProvider";
const logger = createLogger({
service: "setupIndicesHandler",
});
/**
* Simple dependency injection - factory injects all services, in tests everything can be configured without mocks
*/
type FactoryProps = {
settingsManagerFactory: (client: Client) => SettingsManager;
graphqlClientFactory: (saleorApiUrl: string, token: string) => Client;
};
export const setupIndicesHandlerFactory =
({ settingsManagerFactory, graphqlClientFactory }: FactoryProps): NextProtectedApiHandler =>
async (req, res, { authData }) => {
if (req.method !== "POST") {
logger.debug("Request method is different than POST, returning 405");
return res.status(405).end();
}
logger.debug("Fetching settings");
const client = graphqlClientFactory(authData.saleorApiUrl, authData.token);
const settingsManager = settingsManagerFactory(client);
const domain = new URL(authData.saleorApiUrl).host;
const [secretKey, appId, indexNamePrefix, channelsRequest] = await Promise.all([
settingsManager.get("secretKey", domain),
settingsManager.get("appId", domain),
settingsManager.get("indexNamePrefix", domain),
client.query(ChannelsDocument, {}).toPromise(),
]);
if (!secretKey || !appId) {
logger.debug("Missing secretKey or appId, returning 400");
return res.status(400).end();
}
const channels = channelsRequest.data?.channels || [];
const algoliaClient = new AlgoliaSearchProvider({
appId,
apiKey: secretKey,
indexNamePrefix: indexNamePrefix,
channels,
});
try {
logger.debug("Running indices update");
await algoliaClient.updateIndicesSettings();
logger.debug("Indices updated");
return res.status(200).end();
} catch (e) {
logger.error(e);
return res.status(500).end();
}
};
export default createProtectedHandler(
setupIndicesHandlerFactory({
settingsManagerFactory: createSettingsManager,
graphqlClientFactory(saleorApiUrl: string, token: string) {
return createGraphQLClient({ saleorApiUrl, token });
},
}),
saleorApp.apl,
[],
);