@endora-commerce/mod-search 0.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +53 -0
- package/dist/backend/cli/reindex.d.ts +4 -0
- package/dist/backend/cli/reindex.d.ts.map +1 -0
- package/dist/backend/cli/reindex.js +32 -0
- package/dist/backend/cli/reindex.js.map +1 -0
- package/dist/backend/entities/search-phrase-record.entity.d.ts +40 -0
- package/dist/backend/entities/search-phrase-record.entity.d.ts.map +1 -0
- package/dist/backend/entities/search-phrase-record.entity.js +85 -0
- package/dist/backend/entities/search-phrase-record.entity.js.map +1 -0
- package/dist/backend/index.d.ts +87 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +153 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +133 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +250 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +28 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +33 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.public.d.ts +22 -0
- package/dist/backend/routes.public.d.ts.map +1 -0
- package/dist/backend/routes.public.js +192 -0
- package/dist/backend/routes.public.js.map +1 -0
- package/dist/backend/services/embedder-config-resolver.d.ts +25 -0
- package/dist/backend/services/embedder-config-resolver.d.ts.map +1 -0
- package/dist/backend/services/embedder-config-resolver.js +47 -0
- package/dist/backend/services/embedder-config-resolver.js.map +1 -0
- package/dist/backend/services/llm-toggle.service.d.ts +50 -0
- package/dist/backend/services/llm-toggle.service.d.ts.map +1 -0
- package/dist/backend/services/llm-toggle.service.js +78 -0
- package/dist/backend/services/llm-toggle.service.js.map +1 -0
- package/dist/backend/services/search-event-subscriber.d.ts +125 -0
- package/dist/backend/services/search-event-subscriber.d.ts.map +1 -0
- package/dist/backend/services/search-event-subscriber.js +113 -0
- package/dist/backend/services/search-event-subscriber.js.map +1 -0
- package/dist/backend/services/search-indexer.d.ts +346 -0
- package/dist/backend/services/search-indexer.d.ts.map +1 -0
- package/dist/backend/services/search-indexer.js +670 -0
- package/dist/backend/services/search-indexer.js.map +1 -0
- package/dist/backend/services/search-phrase-recorder.service.d.ts +25 -0
- package/dist/backend/services/search-phrase-recorder.service.d.ts.map +1 -0
- package/dist/backend/services/search-phrase-recorder.service.js +89 -0
- package/dist/backend/services/search-phrase-recorder.service.js.map +1 -0
- package/dist/backend/services/search-query-port.d.ts +29 -0
- package/dist/backend/services/search-query-port.d.ts.map +1 -0
- package/dist/backend/services/search-query-port.js +20 -0
- package/dist/backend/services/search-query-port.js.map +1 -0
- package/dist/backend/services/search-query.service.d.ts +205 -0
- package/dist/backend/services/search-query.service.d.ts.map +1 -0
- package/dist/backend/services/search-query.service.js +346 -0
- package/dist/backend/services/search-query.service.js.map +1 -0
- package/dist/backend/services/search-reindex-worker.d.ts +27 -0
- package/dist/backend/services/search-reindex-worker.d.ts.map +1 -0
- package/dist/backend/services/search-reindex-worker.js +13 -0
- package/dist/backend/services/search-reindex-worker.js.map +1 -0
- package/dist/backend/services/search-suggest.service.d.ts +53 -0
- package/dist/backend/services/search-suggest.service.d.ts.map +1 -0
- package/dist/backend/services/search-suggest.service.js +64 -0
- package/dist/backend/services/search-suggest.service.js.map +1 -0
- package/dist/backend/services/suggestion-pricing-enricher.d.ts +62 -0
- package/dist/backend/services/suggestion-pricing-enricher.d.ts.map +1 -0
- package/dist/backend/services/suggestion-pricing-enricher.js +41 -0
- package/dist/backend/services/suggestion-pricing-enricher.js.map +1 -0
- package/dist/manifest.d.ts +263 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +300 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260501T123145_search_phrase_records_init.d.ts +13 -0
- package/dist/migrations/20260501T123145_search_phrase_records_init.d.ts.map +1 -0
- package/dist/migrations/20260501T123145_search_phrase_records_init.js +40 -0
- package/dist/migrations/20260501T123145_search_phrase_records_init.js.map +1 -0
- package/dist/migrations/index.d.ts +27 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +29 -0
- package/dist/migrations/index.js.map +1 -0
- package/docs/search.md +284 -0
- package/i18n/en.json +10 -0
- package/i18n/pl.json +10 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-indexer.js","sourceRoot":"","sources":["../../../src/backend/services/search-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql';
|
|
2
|
+
import type { SettingsReadPort } from '@endora-commerce/platform/kernel';
|
|
3
|
+
export interface RecordPhraseInput {
|
|
4
|
+
/** Verbatim phrase as the customer typed it. Must be non-empty. */
|
|
5
|
+
phrase: string;
|
|
6
|
+
/** Resolved channel ID (resolver middleware sets this; never trusted from the body). */
|
|
7
|
+
salesChannelId: string;
|
|
8
|
+
/** Number of products the search returned; `0` for dead-end phrases. */
|
|
9
|
+
resultCount: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class SearchPhraseRecorder {
|
|
12
|
+
private readonly emFactory;
|
|
13
|
+
private readonly settingsService?;
|
|
14
|
+
private readonly onError;
|
|
15
|
+
constructor(emFactory: () => EntityManager, settingsService?: SettingsReadPort | undefined, onError?: (err: unknown) => void);
|
|
16
|
+
/**
|
|
17
|
+
* Returns a promise that resolves once the row has been queued for
|
|
18
|
+
* INSERT (or the threshold check has tripped). Callers must NOT
|
|
19
|
+
* await this from a request handler — fire and forget. The handler
|
|
20
|
+
* pattern is `void recorder.record(...)`.
|
|
21
|
+
*/
|
|
22
|
+
record(input: RecordPhraseInput): Promise<void>;
|
|
23
|
+
private resolveThreshold;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=search-phrase-recorder.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-phrase-recorder.service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/search-phrase-recorder.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AA2BzE,MAAM,WAAW,iBAAiB;IAChC,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,SAAS,EAAE,MAAM,aAAa,EAC9B,eAAe,CAAC,EAAE,gBAAgB,YAAA,EAClC,OAAO,GAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAoB;IAGlE;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;YAiCvC,gBAAgB;CAe/B"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { SearchPhraseRecord } from '../entities/search-phrase-record.entity.js';
|
|
3
|
+
import { SalesChannel } from '@endora-commerce/platform/kernel';
|
|
4
|
+
import { SEARCH_SETTING_CODES, DEFAULT_POPUP_MINIMUM_QUERY_LENGTH, } from '../../manifest.js';
|
|
5
|
+
/**
|
|
6
|
+
* SearchPhraseRecorder — feature 006 / US3 / T035.
|
|
7
|
+
*
|
|
8
|
+
* Persists committed search phrases to `search_phrase_records` for the
|
|
9
|
+
* future Analytics module to aggregate. Three contractual properties:
|
|
10
|
+
*
|
|
11
|
+
* 1. Fire-and-forget. Callers (the `/api/v1/search/record` route)
|
|
12
|
+
* do NOT await `record()`; they hand off the promise so the
|
|
13
|
+
* storefront response is not delayed (FR-015).
|
|
14
|
+
* 2. Threshold no-op. Phrases shorter than the channel's
|
|
15
|
+
* `search.popup.minimum_query_length` setting are silently
|
|
16
|
+
* skipped — the storefront's client-side guard is the primary
|
|
17
|
+
* surface; this is the server-side belt-and-braces.
|
|
18
|
+
* 3. Errors never propagate. Persistence failures (DB hiccup,
|
|
19
|
+
* RESTRICT FK violation, etc.) are warn-logged and swallowed.
|
|
20
|
+
* The customer's search response cannot fail because analytics
|
|
21
|
+
* ingest had a bad day.
|
|
22
|
+
*/
|
|
23
|
+
const numberSchema = z.number();
|
|
24
|
+
export class SearchPhraseRecorder {
|
|
25
|
+
emFactory;
|
|
26
|
+
settingsService;
|
|
27
|
+
onError;
|
|
28
|
+
constructor(emFactory, settingsService, onError = defaultLogger) {
|
|
29
|
+
this.emFactory = emFactory;
|
|
30
|
+
this.settingsService = settingsService;
|
|
31
|
+
this.onError = onError;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Returns a promise that resolves once the row has been queued for
|
|
35
|
+
* INSERT (or the threshold check has tripped). Callers must NOT
|
|
36
|
+
* await this from a request handler — fire and forget. The handler
|
|
37
|
+
* pattern is `void recorder.record(...)`.
|
|
38
|
+
*/
|
|
39
|
+
async record(input) {
|
|
40
|
+
// command-coverage-ignore: telemetry/analytics ingestion — high-volume event
|
|
41
|
+
// recording, not an audited domain-state mutation.
|
|
42
|
+
try {
|
|
43
|
+
const trimmed = input.phrase.trim();
|
|
44
|
+
const threshold = await this.resolveThreshold(input.salesChannelId);
|
|
45
|
+
if (trimmed.length < threshold) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const em = this.emFactory();
|
|
49
|
+
const channel = await em.findOne(SalesChannel, { id: input.salesChannelId });
|
|
50
|
+
if (!channel) {
|
|
51
|
+
// The resolver middleware should have refused already; if we get
|
|
52
|
+
// here, log and bail rather than write an FK-violating row.
|
|
53
|
+
this.onError(new Error(`SearchPhraseRecorder: unknown sales_channel_id "${input.salesChannelId}"`));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const record = em.create(SearchPhraseRecord, {
|
|
57
|
+
phrase: input.phrase,
|
|
58
|
+
phraseNormalized: trimmed.toLowerCase(),
|
|
59
|
+
salesChannel: channel,
|
|
60
|
+
resultCount: input.resultCount,
|
|
61
|
+
});
|
|
62
|
+
await em.persistAndFlush(record);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
this.onError(err);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async resolveThreshold(channelId) {
|
|
69
|
+
if (!this.settingsService)
|
|
70
|
+
return DEFAULT_POPUP_MINIMUM_QUERY_LENGTH;
|
|
71
|
+
try {
|
|
72
|
+
return await this.settingsService.get(SEARCH_SETTING_CODES.POPUP_MINIMUM_QUERY_LENGTH, channelId, numberSchema);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// SettingNotRegistered, OutOfScope, cache-layer hiccup — fall back
|
|
76
|
+
// to the manifest default. The recorder must not fail because
|
|
77
|
+
// settings has a bad day either.
|
|
78
|
+
return DEFAULT_POPUP_MINIMUM_QUERY_LENGTH;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function defaultLogger(err) {
|
|
83
|
+
console.warn(JSON.stringify({
|
|
84
|
+
level: 'warn',
|
|
85
|
+
msg: 'search phrase recorder failed',
|
|
86
|
+
error: err instanceof Error ? err.message : String(err),
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=search-phrase-recorder.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-phrase-recorder.service.js","sourceRoot":"","sources":["../../../src/backend/services/search-phrase-recorder.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAEhE,OAAO,EACL,oBAAoB,EACpB,kCAAkC,GACnC,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;AAWhC,MAAM,OAAO,oBAAoB;IAEZ;IACA;IACA;IAHnB,YACmB,SAA8B,EAC9B,eAAkC,EAClC,UAAkC,aAAa;QAF/C,cAAS,GAAT,SAAS,CAAqB;QAC9B,oBAAe,GAAf,eAAe,CAAmB;QAClC,YAAO,GAAP,OAAO,CAAwC;IAC/D,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,KAAwB;QACnC,6EAA6E;QAC7E,mDAAmD;QACnD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACpE,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC/B,OAAO;YACT,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,iEAAiE;gBACjE,4DAA4D;gBAC5D,IAAI,CAAC,OAAO,CACV,IAAI,KAAK,CACP,mDAAmD,KAAK,CAAC,cAAc,GAAG,CAC3E,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE;gBAC3C,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,gBAAgB,EAAE,OAAO,CAAC,WAAW,EAAE;gBACvC,YAAY,EAAE,OAAO;gBACrB,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,SAAiB;QAC9C,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO,kCAAkC,CAAC;QACrE,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CACnC,oBAAoB,CAAC,0BAA0B,EAC/C,SAAS,EACT,YAAY,CACb,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;YACnE,8DAA8D;YAC9D,iCAAiC;YACjC,OAAO,kCAAkC,CAAC;QAC5C,CAAC;IACH,CAAC;CACF;AAED,SAAS,aAAa,CAAC,GAAY;IAEjC,OAAO,CAAC,IAAI,CACV,IAAI,CAAC,SAAS,CAAC;QACb,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,+BAA+B;QACpC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;KACxD,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SearchListProductsParams, SearchListResult, SearchQueryContext, SearchQueryPort } from '@endora-commerce/contracts';
|
|
2
|
+
/**
|
|
3
|
+
* The `searchQueryPort` adapter — where the Meilisearch degrade lives
|
|
4
|
+
* (feature 075, issue #153).
|
|
5
|
+
*
|
|
6
|
+
* `SearchQueryService` throws {@link SearchBackendUnavailable} when the index
|
|
7
|
+
* refuses or times out, and that was fine while its one cross-module caller
|
|
8
|
+
* constructed the class: a `catch` around a plain object is a plain `catch`.
|
|
9
|
+
* It stops being fine the moment the caller resolves a **port**, because the
|
|
10
|
+
* same clause then also stands between the caller and `ModuleDisabledError` —
|
|
11
|
+
* `catch (err) { if (err instanceof SearchBackendUnavailable) … else throw }`
|
|
12
|
+
* is the conditional re-throw `check:port-catches` refuses, and it refuses it
|
|
13
|
+
* because a status test lets a switched-off module through by accident rather
|
|
14
|
+
* than by decision.
|
|
15
|
+
*
|
|
16
|
+
* So the conversion happens here, on the owner's side of the boundary, and the
|
|
17
|
+
* published `SearchQueryPort` states the two outcomes in its return type. This
|
|
18
|
+
* is the module's own error class caught inside the module that raises it —
|
|
19
|
+
* not a tolerance bolted onto a port call.
|
|
20
|
+
*
|
|
21
|
+
* Nothing else is caught. A 400 on an unfilterable attribute is `search`'s
|
|
22
|
+
* answer to a bad request and reaches the caller unchanged.
|
|
23
|
+
*/
|
|
24
|
+
/** The read side of `SearchQueryService`, as this adapter consumes it. */
|
|
25
|
+
export interface SearchQueryBackend {
|
|
26
|
+
listProducts(params: SearchListProductsParams, ctx: SearchQueryContext): Promise<SearchListResult>;
|
|
27
|
+
}
|
|
28
|
+
export declare function createSearchQueryPort(backend: SearchQueryBackend): SearchQueryPort;
|
|
29
|
+
//# sourceMappingURL=search-query-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-query-port.d.ts","sourceRoot":"","sources":["../../../src/backend/services/search-query-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EAChB,MAAM,4BAA4B,CAAC;AAGpC;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,YAAY,CACV,MAAM,EAAE,wBAAwB,EAChC,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,eAAe,CAmBlF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SearchBackendUnavailable } from './search-query.service.js';
|
|
2
|
+
export function createSearchQueryPort(backend) {
|
|
3
|
+
return {
|
|
4
|
+
async listProducts(params, ctx) {
|
|
5
|
+
try {
|
|
6
|
+
return { status: 'ok', result: await backend.listProducts(params, ctx) };
|
|
7
|
+
}
|
|
8
|
+
catch (err) {
|
|
9
|
+
// Narrow by construction: only this module's own unavailability
|
|
10
|
+
// signal is converted, and every other failure — including anything
|
|
11
|
+
// the container could raise — is re-thrown unconditionally.
|
|
12
|
+
if (err instanceof SearchBackendUnavailable) {
|
|
13
|
+
return { status: 'index-unavailable', reason: err.message };
|
|
14
|
+
}
|
|
15
|
+
throw err;
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=search-query-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-query-port.js","sourceRoot":"","sources":["../../../src/backend/services/search-query-port.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAiCrE,MAAM,UAAU,qBAAqB,CAAC,OAA2B;IAC/D,OAAO;QACL,KAAK,CAAC,YAAY,CAChB,MAAgC,EAChC,GAAuB;YAEvB,IAAI,CAAC;gBACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,gEAAgE;gBAChE,oEAAoE;gBACpE,4DAA4D;gBAC5D,IAAI,GAAG,YAAY,wBAAwB,EAAE,CAAC;oBAC5C,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC9D,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { type CatalogAttributeReadPort, type CatalogProductReadPort, type CatalogProductRecord, type ListingPrice, type ListingPricePort, type OrganizationDetailsPort, type ProductAudience, type ProductListSort, type ProductSummary } from '@endora-commerce/contracts';
|
|
2
|
+
import { type IndexedDocument, type SortableAttribute } from './search-indexer.js';
|
|
3
|
+
/**
|
|
4
|
+
* SearchQueryService (T068).
|
|
5
|
+
*
|
|
6
|
+
* Read-side bridge: translates the same query inputs `CatalogQueryService`
|
|
7
|
+
* understands (`q`, `filter[attr.X]`, `categorySlug`, `sort`, `cursor`,
|
|
8
|
+
* `limit`) into a Meilisearch query against the per-Sales-Channel index
|
|
9
|
+
* the indexer maintains. Returns the same `ListResult<ProductSummary>`
|
|
10
|
+
* shape so the route can call either backend interchangeably.
|
|
11
|
+
*
|
|
12
|
+
* Channel-scoped index choice is the read-side mirror of the indexer's
|
|
13
|
+
* write-side: each Sales Channel writes to its own `products_<channel_code>`
|
|
14
|
+
* index, so the channel filter is implicit in the index id.
|
|
15
|
+
*
|
|
16
|
+
* Pricing comes from Postgres at hydrate time so the Sales-Channel visibility
|
|
17
|
+
* rule from `catalog-query.service.ts` (R-18: hide price on non-public
|
|
18
|
+
* channels) is enforced without trusting whatever the indexer happened to
|
|
19
|
+
* snapshot.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* The request's resolved sales channel (feature 053 / FR-002), handed in by the
|
|
23
|
+
* route via `getResolvedChannel()`. The search service no longer re-resolves
|
|
24
|
+
* the channel from the raw header.
|
|
25
|
+
*/
|
|
26
|
+
export interface ResolvedSearchChannel {
|
|
27
|
+
id: string;
|
|
28
|
+
code: string;
|
|
29
|
+
isPublic: boolean;
|
|
30
|
+
defaultCurrency: string;
|
|
31
|
+
defaultLanguage: string;
|
|
32
|
+
}
|
|
33
|
+
export interface SearchQueryContext {
|
|
34
|
+
resolvedChannel: ResolvedSearchChannel;
|
|
35
|
+
/** Who is asking (issue #227) — see the published `SearchQueryContext`. */
|
|
36
|
+
audience: ProductAudience;
|
|
37
|
+
preferredLanguage?: string | undefined;
|
|
38
|
+
}
|
|
39
|
+
export interface SearchListProductsParams {
|
|
40
|
+
q?: string | undefined;
|
|
41
|
+
limit: number;
|
|
42
|
+
cursor?: string | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* The catalogue's own sort union, so this backend and the Postgres one keep
|
|
45
|
+
* sharing one input type — the published `SearchListProductsParams` names the
|
|
46
|
+
* same type and the two would otherwise disagree the moment the contract
|
|
47
|
+
* grew a member.
|
|
48
|
+
*
|
|
49
|
+
* Feature 086 added `price` / `-price`, and neither can reach this backend:
|
|
50
|
+
* `catalog/routes.public.ts` routes a price ordering to Postgres before it
|
|
51
|
+
* chooses Meilisearch, because the index has never carried a price and its
|
|
52
|
+
* `sort` is a tie-break sequence that cannot express the resolution chain's
|
|
53
|
+
* coalesce. {@link buildSort} answers `[]` for both — issue #287 made that
|
|
54
|
+
* answer safe rather than silent, since a field outside
|
|
55
|
+
* `SORTABLE_ATTRIBUTES` no longer compiles.
|
|
56
|
+
*/
|
|
57
|
+
sort?: ProductListSort | undefined;
|
|
58
|
+
categorySlug?: string | undefined;
|
|
59
|
+
attributeFilters?: Record<string, string[]> | undefined;
|
|
60
|
+
}
|
|
61
|
+
export interface SearchListResult {
|
|
62
|
+
data: ProductSummary[];
|
|
63
|
+
pagination: {
|
|
64
|
+
cursor: string | null;
|
|
65
|
+
hasMore: boolean;
|
|
66
|
+
limit: number;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
interface DocumentHit extends Pick<IndexedDocument, 'id' | 'sku' | 'name' | 'slug' | 'type' | 'categorySlugs'> {
|
|
70
|
+
primaryAssetUrl?: string | null;
|
|
71
|
+
}
|
|
72
|
+
export interface SearchQueryOptions {
|
|
73
|
+
meilisearchHost?: string;
|
|
74
|
+
meilisearchApiKey?: string;
|
|
75
|
+
}
|
|
76
|
+
export declare class SearchQueryService {
|
|
77
|
+
#private;
|
|
78
|
+
/**
|
|
79
|
+
* Issue #153 — `catalog`'s product rows, over the port, where an
|
|
80
|
+
* `EntityManager` and `em.find(Product, …)` used to be.
|
|
81
|
+
*
|
|
82
|
+
* The `EntityManager` could not leave while `catalog/plugin.ts` built this
|
|
83
|
+
* class itself: a second module's composition decided what this
|
|
84
|
+
* constructor took. It resolves `searchQueryPort` now, so the hydration
|
|
85
|
+
* below asks `catalog` for its rows and answers 503 `MODULE_DISABLED` when
|
|
86
|
+
* `catalog` is off — which is right, because `search`'s manifest declares
|
|
87
|
+
* `catalog` and an index over a catalogue that is gone has nothing to
|
|
88
|
+
* hydrate against.
|
|
89
|
+
*/
|
|
90
|
+
private readonly products;
|
|
91
|
+
/**
|
|
92
|
+
* Feature 061 — the catalog's composed attribute read model (Principle I:
|
|
93
|
+
* filterable validation reads the view, not the catalog entity). Feature
|
|
94
|
+
* 075, Phase C — typed as the published port; `catalog`'s own service
|
|
95
|
+
* satisfies it structurally, so its construction of this class is unchanged.
|
|
96
|
+
*/
|
|
97
|
+
private readonly attributeRead?;
|
|
98
|
+
/**
|
|
99
|
+
* Issue #132 — the pricing engine, through the `pricingService` port. The
|
|
100
|
+
* hydration below exists so that Postgres, not the index, decides what a
|
|
101
|
+
* hit shows; the price it hydrates now comes from the engine for the same
|
|
102
|
+
* reason.
|
|
103
|
+
*/
|
|
104
|
+
private readonly listingPrices?;
|
|
105
|
+
/**
|
|
106
|
+
* `organizations`' read model, for the customer group a group-targeted
|
|
107
|
+
* price list is selected by. The module already resolves this port for the
|
|
108
|
+
* typeahead popup, which has priced per buyer since feature 075 — the
|
|
109
|
+
* result feed under the popup did not, so one search box quoted two
|
|
110
|
+
* different figures for one product depending on whether the buyer stopped
|
|
111
|
+
* at the suggestions or pressed Enter.
|
|
112
|
+
*
|
|
113
|
+
* Optional only in the signature, and never reached by an anonymous query.
|
|
114
|
+
*/
|
|
115
|
+
private readonly organizations?;
|
|
116
|
+
private readonly client;
|
|
117
|
+
constructor(
|
|
118
|
+
/**
|
|
119
|
+
* Issue #153 — `catalog`'s product rows, over the port, where an
|
|
120
|
+
* `EntityManager` and `em.find(Product, …)` used to be.
|
|
121
|
+
*
|
|
122
|
+
* The `EntityManager` could not leave while `catalog/plugin.ts` built this
|
|
123
|
+
* class itself: a second module's composition decided what this
|
|
124
|
+
* constructor took. It resolves `searchQueryPort` now, so the hydration
|
|
125
|
+
* below asks `catalog` for its rows and answers 503 `MODULE_DISABLED` when
|
|
126
|
+
* `catalog` is off — which is right, because `search`'s manifest declares
|
|
127
|
+
* `catalog` and an index over a catalogue that is gone has nothing to
|
|
128
|
+
* hydrate against.
|
|
129
|
+
*/
|
|
130
|
+
products: CatalogProductReadPort,
|
|
131
|
+
/**
|
|
132
|
+
* Feature 061 — the catalog's composed attribute read model (Principle I:
|
|
133
|
+
* filterable validation reads the view, not the catalog entity). Feature
|
|
134
|
+
* 075, Phase C — typed as the published port; `catalog`'s own service
|
|
135
|
+
* satisfies it structurally, so its construction of this class is unchanged.
|
|
136
|
+
*/
|
|
137
|
+
attributeRead?: CatalogAttributeReadPort | undefined, options?: SearchQueryOptions,
|
|
138
|
+
/**
|
|
139
|
+
* Issue #132 — the pricing engine, through the `pricingService` port. The
|
|
140
|
+
* hydration below exists so that Postgres, not the index, decides what a
|
|
141
|
+
* hit shows; the price it hydrates now comes from the engine for the same
|
|
142
|
+
* reason.
|
|
143
|
+
*/
|
|
144
|
+
listingPrices?: ListingPricePort | undefined,
|
|
145
|
+
/**
|
|
146
|
+
* `organizations`' read model, for the customer group a group-targeted
|
|
147
|
+
* price list is selected by. The module already resolves this port for the
|
|
148
|
+
* typeahead popup, which has priced per buyer since feature 075 — the
|
|
149
|
+
* result feed under the popup did not, so one search box quoted two
|
|
150
|
+
* different figures for one product depending on whether the buyer stopped
|
|
151
|
+
* at the suggestions or pressed Enter.
|
|
152
|
+
*
|
|
153
|
+
* Optional only in the signature, and never reached by an anonymous query.
|
|
154
|
+
*/
|
|
155
|
+
organizations?: OrganizationDetailsPort | undefined);
|
|
156
|
+
listProducts(params: SearchListProductsParams, ctx: SearchQueryContext): Promise<SearchListResult>;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Why the index did not answer this query — issue #287.
|
|
160
|
+
*
|
|
161
|
+
* `unreachable` is the engine being down, unroutable or timing out: transient,
|
|
162
|
+
* nobody's mistake, and the Postgres fallback is the whole answer.
|
|
163
|
+
*
|
|
164
|
+
* `refused` is the engine answering, in milliseconds, that it will not run
|
|
165
|
+
* *this* query — an unsortable attribute, a missing index, a rejected API key.
|
|
166
|
+
* It is deterministic, it will not pass on its own, and it is a defect in this
|
|
167
|
+
* module's configuration of the index. Both still degrade to Postgres; only
|
|
168
|
+
* one of them is worth waking somebody for.
|
|
169
|
+
*/
|
|
170
|
+
export type SearchBackendFailureKind = 'unreachable' | 'refused';
|
|
171
|
+
export declare class SearchBackendUnavailable extends Error {
|
|
172
|
+
/** Which of the two facts this is. */
|
|
173
|
+
readonly kind: SearchBackendFailureKind;
|
|
174
|
+
/** Meilisearch's own error code for a refusal; `null` when unreachable. */
|
|
175
|
+
readonly code: string | null;
|
|
176
|
+
constructor(message: string,
|
|
177
|
+
/** Which of the two facts this is. */
|
|
178
|
+
kind?: SearchBackendFailureKind,
|
|
179
|
+
/** Meilisearch's own error code for a refusal; `null` when unreachable. */
|
|
180
|
+
code?: string | null);
|
|
181
|
+
}
|
|
182
|
+
export declare function buildFilterExpression(params: Pick<SearchListProductsParams, 'attributeFilters' | 'categorySlug'>): string[];
|
|
183
|
+
/**
|
|
184
|
+
* A Meilisearch sort expression this module is allowed to build — issue #287.
|
|
185
|
+
*
|
|
186
|
+
* The field half is {@link SortableAttribute}, so a sort naming something the
|
|
187
|
+
* indexer never declared sortable does not compile. That is the compile-time
|
|
188
|
+
* half of the guarantee; `SORTABLE_ATTRIBUTES` being the indexer's own input is
|
|
189
|
+
* the other half. Before the two were tied together, `buildSort` returned
|
|
190
|
+
* plain `string[]` and cheerfully asked five live indexes to sort on fields
|
|
191
|
+
* they had never been told about.
|
|
192
|
+
*/
|
|
193
|
+
export type SearchSortExpression = `${SortableAttribute}:${'asc' | 'desc'}`;
|
|
194
|
+
export declare function buildSort(sort: SearchListProductsParams['sort']): SearchSortExpression[];
|
|
195
|
+
/**
|
|
196
|
+
* Project one hydrated hit into a `ProductSummary` (issue #132).
|
|
197
|
+
*
|
|
198
|
+
* `resolvedPrice` is the chain's answer for this product, or `undefined` when
|
|
199
|
+
* the channel withheld the resolution — both render `null`, which is the one
|
|
200
|
+
* spelling `ProductSummary.price` has for "no price". Exported so the
|
|
201
|
+
* projection can be asserted without a Meilisearch round trip.
|
|
202
|
+
*/
|
|
203
|
+
export declare function searchHitSummary(product: CatalogProductRecord, hit: DocumentHit, channel: ResolvedSearchChannel, preferredLanguage: string | undefined, resolvedPrice: ListingPrice | undefined): ProductSummary;
|
|
204
|
+
export {};
|
|
205
|
+
//# sourceMappingURL=search-query.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-query.service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/search-query.service.ts"],"names":[],"mappings":"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"}
|