@rokmohar/medusa-plugin-meilisearch
Version:
Meilisearch plugin for Medusa 2
120 lines • 9.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const framework_1 = require("@medusajs/framework");
const medusa_1 = require("./utils/medusa");
const route_1 = require("./store/meilisearch/categories-hits/route");
const route_2 = require("./store/meilisearch/products-hits/route");
const route_3 = require("./admin/meilisearch/categories-hits/route");
const route_4 = require("./admin/meilisearch/products-hits/route");
require("./types");
/**
* Meilisearch-only params are not part of the native Medusa validators (which are
* strict and reject unknown keys). Pull them off `req.query` BEFORE the native
* `validateAndTransformQuery` runs, and stash them on `req.meiliParams` for the
* route handler. Express 4: `req.query` is a mutable plain object.
*/
function extractMeiliParams(req, _res, next) {
const q = req.query;
const semanticRatioRaw = q.semanticRatio;
req.meiliParams = {
query: typeof q.query === 'string' ? q.query : undefined,
language: typeof q.language === 'string' ? q.language : undefined,
semanticSearch: q.semanticSearch === 'true',
semanticRatio: typeof semanticRatioRaw === 'string' && semanticRatioRaw !== '' ? Number(semanticRatioRaw) : 0.5,
};
delete q.query;
delete q.language;
delete q.semanticSearch;
delete q.semanticRatio;
next();
}
/**
* Port of the native `/store/products` `applyMaybeLinkFilterIfNecessary` middleware.
* Sales-channel link filtering is only applied when more than one sales channel
* exists; otherwise the `sales_channel_id` filter is dropped (same as native).
*
* The native index-engine early-return is intentionally omitted: it only applies
* when the (opt-in) index engine feature flag is enabled, in which case native uses
* a different query path entirely. These routes always use `query.graph`, so the
* default-flag-off behaviour is the correct parity target.
*/
async function applyMaybeLinkFilterIfNecessary(req, res, next) {
const query = req.scope.resolve(medusa_1.ContainerRegistrationKeys.QUERY);
const salesChannelsQueryRes = await query.graph({
entity: 'sales_channels',
fields: ['id'],
pagination: { skip: 0, take: 1 },
});
const salesChannelCount = salesChannelsQueryRes.metadata?.count ?? 0;
if (!(salesChannelCount > 1)) {
delete req.filterableFields['sales_channel_id'];
return next();
}
return (0, medusa_1.maybeApplyLinkFilter)({
entryPoint: 'product_sales_channel',
resourceId: 'product_id',
filterableField: 'sales_channel_id',
})(req, res, next);
}
exports.default = (0, framework_1.defineMiddlewares)({
routes: [
// Mirrors native `/store/products` middleware stack so the custom endpoint
// behaves identically (auth, sales channels, published default, pricing/tax).
{
methods: ['GET'],
matcher: '/store/meilisearch/products',
middlewares: [
(0, medusa_1.authenticate)('customer', ['session', 'bearer'], { allowUnauthenticated: true }),
extractMeiliParams,
(0, framework_1.validateAndTransformQuery)(medusa_1.StoreGetProductsParams, medusa_1.listProductQueryConfig),
(0, medusa_1.filterByValidSalesChannels)(),
applyMaybeLinkFilterIfNecessary,
(0, medusa_1.applyDefaultFilters)({
status: medusa_1.ProductStatus.PUBLISHED,
categories: (filters) => {
const categoryIds = filters.category_id;
delete filters.category_id;
if (!(0, medusa_1.isPresent)(categoryIds)) {
return;
}
return { id: categoryIds, is_internal: false, is_active: true };
},
}),
(0, medusa_1.normalizeDataForContext)(),
(0, medusa_1.setPricingContext)(),
(0, medusa_1.setTaxContext)(),
(0, medusa_1.clearFiltersByKey)(['region_id', 'country_code', 'province', 'cart_id']),
],
},
// Mirrors native `/store/product-categories` (validate/transform only).
{
methods: ['GET'],
matcher: '/store/meilisearch/categories',
middlewares: [
extractMeiliParams,
(0, framework_1.validateAndTransformQuery)(medusa_1.StoreProductCategoriesParams, medusa_1.listProductCategoryConfig),
],
},
{
methods: ['GET'],
matcher: '/store/meilisearch/categories-hits',
middlewares: [(0, framework_1.validateAndTransformQuery)(route_1.StoreSearchCategoriesSchema, {})],
},
{
methods: ['GET'],
matcher: '/store/meilisearch/products-hits',
middlewares: [(0, framework_1.validateAndTransformQuery)(route_2.StoreSearchProductsSchema, {})],
},
{
methods: ['POST'],
matcher: '/admin/meilisearch/categories-hits',
middlewares: [(0, framework_1.validateAndTransformBody)(route_3.AdminSearchCategoriesSchema)],
},
{
methods: ['POST'],
matcher: '/admin/meilisearch/products-hits',
middlewares: [(0, framework_1.validateAndTransformBody)(route_4.AdminSearchProductsSchema)],
},
],
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBTzRCO0FBQzVCLDJDQWdCdUI7QUFDdkIscUVBQXVGO0FBQ3ZGLG1FQUFtRjtBQUNuRixxRUFBdUY7QUFDdkYsbUVBQW1GO0FBQ25GLG1CQUFnQjtBQUVoQjs7Ozs7R0FLRztBQUNILFNBQVMsa0JBQWtCLENBQUMsR0FBa0IsRUFBRSxJQUFvQixFQUFFLElBQXdCO0lBQzVGLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUE7SUFDbkIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFBO0lBRXhDLEdBQUcsQ0FBQyxXQUFXLEdBQUc7UUFDaEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDeEQsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakUsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjLEtBQUssTUFBTTtRQUMzQyxhQUFhLEVBQUUsT0FBTyxnQkFBZ0IsS0FBSyxRQUFRLElBQUksZ0JBQWdCLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztLQUNoSCxDQUFBO0lBRUQsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFBO0lBQ2QsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFBO0lBQ2pCLE9BQU8sQ0FBQyxDQUFDLGNBQWMsQ0FBQTtJQUN2QixPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUE7SUFFdEIsSUFBSSxFQUFFLENBQUE7QUFD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