
* 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
78 lines
2.6 KiB
TypeScript
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,
|
|
[],
|
|
);
|