@rahul_vendure/ai-chat-plugin 0.1.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/README.md +214 -0
- package/dist/ai-assistant.plugin.d.ts +18 -0
- package/dist/ai-assistant.plugin.d.ts.map +1 -0
- package/dist/ai-assistant.plugin.js +86 -0
- package/dist/ai-assistant.plugin.js.map +1 -0
- package/dist/api/ai-assistant.resolver.d.ts +11 -0
- package/dist/api/ai-assistant.resolver.d.ts.map +1 -0
- package/dist/api/ai-assistant.resolver.js +43 -0
- package/dist/api/ai-assistant.resolver.js.map +1 -0
- package/dist/api/schema-extensions.d.ts +3 -0
- package/dist/api/schema-extensions.d.ts.map +1 -0
- package/dist/api/schema-extensions.js +15 -0
- package/dist/api/schema-extensions.js.map +1 -0
- package/dist/constants.d.ts +41 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +24 -0
- package/dist/constants.js.map +1 -0
- package/dist/controllers/admin-chat.controller.d.ts +21 -0
- package/dist/controllers/admin-chat.controller.d.ts.map +1 -0
- package/dist/controllers/admin-chat.controller.js +64 -0
- package/dist/controllers/admin-chat.controller.js.map +1 -0
- package/dist/controllers/ai-assistant.controller.d.ts +96 -0
- package/dist/controllers/ai-assistant.controller.d.ts.map +1 -0
- package/dist/controllers/ai-assistant.controller.js +272 -0
- package/dist/controllers/ai-assistant.controller.js.map +1 -0
- package/dist/entities/collection-embedding.entity.d.ts +13 -0
- package/dist/entities/collection-embedding.entity.d.ts.map +1 -0
- package/dist/entities/collection-embedding.entity.js +43 -0
- package/dist/entities/collection-embedding.entity.js.map +1 -0
- package/dist/entities/product-embedding.entity.d.ts +14 -0
- package/dist/entities/product-embedding.entity.d.ts.map +1 -0
- package/dist/entities/product-embedding.entity.js +44 -0
- package/dist/entities/product-embedding.entity.js.map +1 -0
- package/dist/entities/variant-embedding.entity.d.ts +13 -0
- package/dist/entities/variant-embedding.entity.d.ts.map +1 -0
- package/dist/entities/variant-embedding.entity.js +43 -0
- package/dist/entities/variant-embedding.entity.js.map +1 -0
- package/dist/handlers/collection-embedding-handler.d.ts +18 -0
- package/dist/handlers/collection-embedding-handler.d.ts.map +1 -0
- package/dist/handlers/collection-embedding-handler.js +90 -0
- package/dist/handlers/collection-embedding-handler.js.map +1 -0
- package/dist/handlers/product-embedding-handler.d.ts +20 -0
- package/dist/handlers/product-embedding-handler.d.ts.map +1 -0
- package/dist/handlers/product-embedding-handler.js +96 -0
- package/dist/handlers/product-embedding-handler.js.map +1 -0
- package/dist/handlers/variant-embedding-handler.d.ts +19 -0
- package/dist/handlers/variant-embedding-handler.d.ts.map +1 -0
- package/dist/handlers/variant-embedding-handler.js +101 -0
- package/dist/handlers/variant-embedding-handler.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/services/admin-ai-chat.service.d.ts +40 -0
- package/dist/services/admin-ai-chat.service.d.ts.map +1 -0
- package/dist/services/admin-ai-chat.service.js +201 -0
- package/dist/services/admin-ai-chat.service.js.map +1 -0
- package/dist/services/admin-system-prompt.d.ts +2 -0
- package/dist/services/admin-system-prompt.d.ts.map +1 -0
- package/dist/services/admin-system-prompt.js +44 -0
- package/dist/services/admin-system-prompt.js.map +1 -0
- package/dist/services/admin-tools/admin-collection-tools.d.ts +15 -0
- package/dist/services/admin-tools/admin-collection-tools.d.ts.map +1 -0
- package/dist/services/admin-tools/admin-collection-tools.js +48 -0
- package/dist/services/admin-tools/admin-collection-tools.js.map +1 -0
- package/dist/services/admin-tools/admin-customer-tools.d.ts +15 -0
- package/dist/services/admin-tools/admin-customer-tools.d.ts.map +1 -0
- package/dist/services/admin-tools/admin-customer-tools.js +56 -0
- package/dist/services/admin-tools/admin-customer-tools.js.map +1 -0
- package/dist/services/admin-tools/admin-order-tools.d.ts +16 -0
- package/dist/services/admin-tools/admin-order-tools.d.ts.map +1 -0
- package/dist/services/admin-tools/admin-order-tools.js +69 -0
- package/dist/services/admin-tools/admin-order-tools.js.map +1 -0
- package/dist/services/admin-tools/admin-product-tools.d.ts +29 -0
- package/dist/services/admin-tools/admin-product-tools.d.ts.map +1 -0
- package/dist/services/admin-tools/admin-product-tools.js +139 -0
- package/dist/services/admin-tools/admin-product-tools.js.map +1 -0
- package/dist/services/ai-chat.service.d.ts +42 -0
- package/dist/services/ai-chat.service.d.ts.map +1 -0
- package/dist/services/ai-chat.service.js +308 -0
- package/dist/services/ai-chat.service.js.map +1 -0
- package/dist/services/chat-result-mapper.d.ts +17 -0
- package/dist/services/chat-result-mapper.d.ts.map +1 -0
- package/dist/services/chat-result-mapper.js +176 -0
- package/dist/services/chat-result-mapper.js.map +1 -0
- package/dist/services/collection-embedding.service.d.ts +14 -0
- package/dist/services/collection-embedding.service.d.ts.map +1 -0
- package/dist/services/collection-embedding.service.js +67 -0
- package/dist/services/collection-embedding.service.js.map +1 -0
- package/dist/services/conversation-cache.service.d.ts +47 -0
- package/dist/services/conversation-cache.service.d.ts.map +1 -0
- package/dist/services/conversation-cache.service.js +87 -0
- package/dist/services/conversation-cache.service.js.map +1 -0
- package/dist/services/embed-all-job.service.d.ts +28 -0
- package/dist/services/embed-all-job.service.d.ts.map +1 -0
- package/dist/services/embed-all-job.service.js +151 -0
- package/dist/services/embed-all-job.service.js.map +1 -0
- package/dist/services/embedding.service.d.ts +21 -0
- package/dist/services/embedding.service.d.ts.map +1 -0
- package/dist/services/embedding.service.js +58 -0
- package/dist/services/embedding.service.js.map +1 -0
- package/dist/services/product-embedding.service.d.ts +19 -0
- package/dist/services/product-embedding.service.d.ts.map +1 -0
- package/dist/services/product-embedding.service.js +78 -0
- package/dist/services/product-embedding.service.js.map +1 -0
- package/dist/services/system-prompt.d.ts +2 -0
- package/dist/services/system-prompt.d.ts.map +1 -0
- package/dist/services/system-prompt.js +107 -0
- package/dist/services/system-prompt.js.map +1 -0
- package/dist/services/tools/cart-tools.d.ts +14 -0
- package/dist/services/tools/cart-tools.d.ts.map +1 -0
- package/dist/services/tools/cart-tools.js +168 -0
- package/dist/services/tools/cart-tools.js.map +1 -0
- package/dist/services/tools/checkout-tools.d.ts +37 -0
- package/dist/services/tools/checkout-tools.d.ts.map +1 -0
- package/dist/services/tools/checkout-tools.js +228 -0
- package/dist/services/tools/checkout-tools.js.map +1 -0
- package/dist/services/tools/order-tools.d.ts +15 -0
- package/dist/services/tools/order-tools.d.ts.map +1 -0
- package/dist/services/tools/order-tools.js +105 -0
- package/dist/services/tools/order-tools.js.map +1 -0
- package/dist/services/tools/search-tools.d.ts +21 -0
- package/dist/services/tools/search-tools.d.ts.map +1 -0
- package/dist/services/tools/search-tools.js +214 -0
- package/dist/services/tools/search-tools.js.map +1 -0
- package/dist/services/types.d.ts +118 -0
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/types.js +3 -0
- package/dist/services/types.js.map +1 -0
- package/dist/services/variant-embedding.service.d.ts +14 -0
- package/dist/services/variant-embedding.service.d.ts.map +1 -0
- package/dist/services/variant-embedding.service.js +59 -0
- package/dist/services/variant-embedding.service.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CheckoutTools = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const core_1 = require("@vendure/core");
|
|
6
|
+
const constants_1 = require("../../constants");
|
|
7
|
+
class CheckoutTools {
|
|
8
|
+
constructor(connection, orderService) {
|
|
9
|
+
this.connection = connection;
|
|
10
|
+
this.orderService = orderService;
|
|
11
|
+
this.logger = new common_1.Logger(CheckoutTools.name);
|
|
12
|
+
}
|
|
13
|
+
async getAvailableCountries(ctx) {
|
|
14
|
+
try {
|
|
15
|
+
const result = await this.connection.rawConnection.query(`SELECT r.id, r.code, t.name
|
|
16
|
+
FROM region r
|
|
17
|
+
JOIN region_translation t ON t."baseId" = r.id
|
|
18
|
+
WHERE r.type = 'country' AND r.enabled = true
|
|
19
|
+
ORDER BY t.name ASC`);
|
|
20
|
+
const countries = result.map(r => ({
|
|
21
|
+
id: String(r.id),
|
|
22
|
+
code: String(r.code),
|
|
23
|
+
name: String(r.name),
|
|
24
|
+
}));
|
|
25
|
+
return {
|
|
26
|
+
products: [],
|
|
27
|
+
collections: [],
|
|
28
|
+
summary: countries.length > 0
|
|
29
|
+
? `Available countries: ${countries.map(c => `${c.name} (${c.code})`).join(', ')}`
|
|
30
|
+
: 'No countries available.',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
this.logger.error(`Error fetching countries: ${e}`);
|
|
35
|
+
return { products: [], collections: [], summary: 'Error fetching available countries.' };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async getEligibleShippingMethods(ctx) {
|
|
39
|
+
if (!ctx.activeUserId) {
|
|
40
|
+
return { products: [], collections: [], summary: 'Error: You must be logged in to view shipping methods.' };
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const order = await this.orderService.getActiveOrderForUser(ctx, ctx.activeUserId);
|
|
44
|
+
if (!order) {
|
|
45
|
+
return { products: [], collections: [], summary: 'Error: No active order found. Add items to your cart first.' };
|
|
46
|
+
}
|
|
47
|
+
const methods = await this.orderService.getEligibleShippingMethods(ctx, order.id);
|
|
48
|
+
const mapped = methods.map((m) => {
|
|
49
|
+
var _a, _b, _c, _d, _e;
|
|
50
|
+
return ({
|
|
51
|
+
id: String(m.id),
|
|
52
|
+
name: String((_a = m.name) !== null && _a !== void 0 ? _a : ''),
|
|
53
|
+
code: String((_b = m.code) !== null && _b !== void 0 ? _b : ''),
|
|
54
|
+
description: String((_c = m.description) !== null && _c !== void 0 ? _c : ''),
|
|
55
|
+
priceWithTax: Number((_e = (_d = m.priceWithTax) !== null && _d !== void 0 ? _d : m.price) !== null && _e !== void 0 ? _e : 0),
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
products: [],
|
|
60
|
+
collections: [],
|
|
61
|
+
summary: mapped.length > 0
|
|
62
|
+
? `Available shipping methods: ${mapped.map(m => `"${m.name}" (id: ${m.id}, price: ${(0, constants_1.formatPrice)(m.priceWithTax)}, code: ${m.code})`).join(', ')}`
|
|
63
|
+
: 'No shipping methods available. Make sure a shipping address is set first.',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
this.logger.error(`Error fetching shipping methods: ${e}`);
|
|
68
|
+
return { products: [], collections: [], summary: 'Error fetching shipping methods. Make sure a shipping address has been set.' };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async getEligiblePaymentMethods(ctx) {
|
|
72
|
+
if (!ctx.activeUserId) {
|
|
73
|
+
return { products: [], collections: [], summary: 'Error: You must be logged in to view payment methods.' };
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const order = await this.orderService.getActiveOrderForUser(ctx, ctx.activeUserId);
|
|
77
|
+
if (!order) {
|
|
78
|
+
return { products: [], collections: [], summary: 'Error: No active order found. Add items to your cart first.' };
|
|
79
|
+
}
|
|
80
|
+
const methods = await this.orderService.getEligiblePaymentMethods(ctx, order.id);
|
|
81
|
+
const mapped = methods.map((m) => {
|
|
82
|
+
var _a, _b, _c;
|
|
83
|
+
return ({
|
|
84
|
+
id: String(m.id),
|
|
85
|
+
name: String((_a = m.name) !== null && _a !== void 0 ? _a : ''),
|
|
86
|
+
code: String((_b = m.code) !== null && _b !== void 0 ? _b : ''),
|
|
87
|
+
description: String((_c = m.description) !== null && _c !== void 0 ? _c : ''),
|
|
88
|
+
isEligible: Boolean(m.isEligible),
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
const eligible = mapped.filter(m => m.isEligible);
|
|
92
|
+
return {
|
|
93
|
+
products: [],
|
|
94
|
+
collections: [],
|
|
95
|
+
summary: eligible.length > 0
|
|
96
|
+
? `Available payment methods: ${eligible.map(m => `"${m.name}" (code: ${m.code}${m.description ? ', ' + m.description : ''})`).join(', ')}`
|
|
97
|
+
: 'No payment methods available for this order.',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
this.logger.error(`Error fetching payment methods: ${e}`);
|
|
102
|
+
return { products: [], collections: [], summary: 'Error fetching payment methods.' };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async setShippingAddress(ctx, params) {
|
|
106
|
+
var _a, _b, _c, _d;
|
|
107
|
+
if (!ctx.activeUserId) {
|
|
108
|
+
return { products: [], collections: [], summary: 'Error: You must be logged in to set a shipping address.' };
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const order = await this.orderService.getActiveOrderForUser(ctx, ctx.activeUserId);
|
|
112
|
+
if (!order) {
|
|
113
|
+
return { products: [], collections: [], summary: 'Error: No active order found. Add items to your cart first.' };
|
|
114
|
+
}
|
|
115
|
+
// Validate required fields
|
|
116
|
+
const required = ['fullName', 'streetLine1', 'city', 'province', 'postalCode', 'countryCode', 'phoneNumber'];
|
|
117
|
+
for (const field of required) {
|
|
118
|
+
if (!((_a = params[field]) === null || _a === void 0 ? void 0 : _a.trim())) {
|
|
119
|
+
return { products: [], collections: [], summary: `Error: Missing required field "${field}" for shipping address.` };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Set address via OrderService
|
|
123
|
+
const result = await this.orderService.setShippingAddress(ctx, order.id, {
|
|
124
|
+
fullName: params.fullName,
|
|
125
|
+
streetLine1: params.streetLine1,
|
|
126
|
+
streetLine2: (_b = params.streetLine2) !== null && _b !== void 0 ? _b : '',
|
|
127
|
+
city: params.city,
|
|
128
|
+
province: params.province,
|
|
129
|
+
postalCode: params.postalCode,
|
|
130
|
+
countryCode: params.countryCode,
|
|
131
|
+
phoneNumber: params.phoneNumber,
|
|
132
|
+
company: (_c = params.company) !== null && _c !== void 0 ? _c : '',
|
|
133
|
+
});
|
|
134
|
+
if ((0, core_1.isGraphQlErrorResult)(result)) {
|
|
135
|
+
const errorMsg = (_d = result.message) !== null && _d !== void 0 ? _d : 'Unknown error';
|
|
136
|
+
return { products: [], collections: [], summary: `Error setting shipping address: ${errorMsg}` };
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
products: [],
|
|
140
|
+
collections: [],
|
|
141
|
+
summary: `Shipping address set successfully for ${params.fullName}, ${params.streetLine1}, ${params.city}, ${params.province} ${params.postalCode}, ${params.countryCode}.`,
|
|
142
|
+
setShippingAddressAction: { ...params },
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (e) {
|
|
146
|
+
this.logger.error(`Error setting shipping address: ${e}`);
|
|
147
|
+
return { products: [], collections: [], summary: 'Error setting shipping address. Please try again.' };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async setBillingAddress(ctx, params) {
|
|
151
|
+
var _a, _b, _c, _d;
|
|
152
|
+
if (!ctx.activeUserId) {
|
|
153
|
+
return { products: [], collections: [], summary: 'Error: You must be logged in to set a billing address.' };
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const order = await this.orderService.getActiveOrderForUser(ctx, ctx.activeUserId);
|
|
157
|
+
if (!order) {
|
|
158
|
+
return { products: [], collections: [], summary: 'Error: No active order found. Add items to your cart first.' };
|
|
159
|
+
}
|
|
160
|
+
const required = ['fullName', 'streetLine1', 'city', 'province', 'postalCode', 'countryCode', 'phoneNumber'];
|
|
161
|
+
for (const field of required) {
|
|
162
|
+
if (!((_a = params[field]) === null || _a === void 0 ? void 0 : _a.trim())) {
|
|
163
|
+
return { products: [], collections: [], summary: `Error: Missing required field "${field}" for billing address.` };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const result = await this.orderService.setBillingAddress(ctx, order.id, {
|
|
167
|
+
fullName: params.fullName,
|
|
168
|
+
streetLine1: params.streetLine1,
|
|
169
|
+
streetLine2: (_b = params.streetLine2) !== null && _b !== void 0 ? _b : '',
|
|
170
|
+
city: params.city,
|
|
171
|
+
province: params.province,
|
|
172
|
+
postalCode: params.postalCode,
|
|
173
|
+
countryCode: params.countryCode,
|
|
174
|
+
phoneNumber: params.phoneNumber,
|
|
175
|
+
company: (_c = params.company) !== null && _c !== void 0 ? _c : '',
|
|
176
|
+
});
|
|
177
|
+
if ((0, core_1.isGraphQlErrorResult)(result)) {
|
|
178
|
+
const errorMsg = (_d = result.message) !== null && _d !== void 0 ? _d : 'Unknown error';
|
|
179
|
+
return { products: [], collections: [], summary: `Error setting billing address: ${errorMsg}` };
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
products: [],
|
|
183
|
+
collections: [],
|
|
184
|
+
summary: `Billing address set successfully for ${params.fullName}, ${params.streetLine1}, ${params.city}, ${params.province} ${params.postalCode}, ${params.countryCode}.`,
|
|
185
|
+
setBillingAddressAction: { ...params },
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
catch (e) {
|
|
189
|
+
this.logger.error(`Error setting billing address: ${e}`);
|
|
190
|
+
return { products: [], collections: [], summary: 'Error setting billing address. Please try again.' };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async setShippingMethod(ctx, params) {
|
|
194
|
+
var _a, _b, _c, _d;
|
|
195
|
+
if (!ctx.activeUserId) {
|
|
196
|
+
return { products: [], collections: [], summary: 'Error: You must be logged in to set a shipping method.' };
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
const order = await this.orderService.getActiveOrderForUser(ctx, ctx.activeUserId);
|
|
200
|
+
if (!order) {
|
|
201
|
+
return { products: [], collections: [], summary: 'Error: No active order found. Add items to your cart first.' };
|
|
202
|
+
}
|
|
203
|
+
if (!params.shippingMethodId || !/^\d+$/.test(params.shippingMethodId)) {
|
|
204
|
+
return { products: [], collections: [], summary: 'Error: Invalid shippingMethodId. Use getEligibleShippingMethods first to get valid IDs.' };
|
|
205
|
+
}
|
|
206
|
+
const result = await this.orderService.setShippingMethod(ctx, order.id, [params.shippingMethodId]);
|
|
207
|
+
if ((0, core_1.isGraphQlErrorResult)(result)) {
|
|
208
|
+
const errorMsg = (_a = result.message) !== null && _a !== void 0 ? _a : 'Unknown error';
|
|
209
|
+
return { products: [], collections: [], summary: `Error setting shipping method: ${errorMsg}` };
|
|
210
|
+
}
|
|
211
|
+
// Get the updated order to show shipping cost
|
|
212
|
+
const updatedOrder = result;
|
|
213
|
+
const shippingCost = (_c = (_b = updatedOrder.shippingWithTax) !== null && _b !== void 0 ? _b : updatedOrder.shipping) !== null && _c !== void 0 ? _c : 0;
|
|
214
|
+
return {
|
|
215
|
+
products: [],
|
|
216
|
+
collections: [],
|
|
217
|
+
summary: `Shipping method set successfully. Shipping cost: ${(0, constants_1.formatPrice)(shippingCost)}. Order total: ${(0, constants_1.formatPrice)((_d = updatedOrder.totalWithTax) !== null && _d !== void 0 ? _d : 0)}.`,
|
|
218
|
+
setShippingMethodAction: { shippingMethodId: params.shippingMethodId },
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
this.logger.error(`Error setting shipping method: ${e}`);
|
|
223
|
+
return { products: [], collections: [], summary: 'Error setting shipping method. Please try again.' };
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
exports.CheckoutTools = CheckoutTools;
|
|
228
|
+
//# sourceMappingURL=checkout-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkout-tools.js","sourceRoot":"","sources":["../../../src/services/tools/checkout-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { RequestContext, TransactionalConnection } from '@vendure/core';
|
|
2
|
+
import { ChatResultMapper } from '../chat-result-mapper';
|
|
3
|
+
import type { ToolResult } from '../types';
|
|
4
|
+
export declare class OrderTools {
|
|
5
|
+
private connection;
|
|
6
|
+
private mapper;
|
|
7
|
+
private readonly logger;
|
|
8
|
+
constructor(connection: TransactionalConnection, mapper: ChatResultMapper);
|
|
9
|
+
/**
|
|
10
|
+
* getOrderHistory: fetches the customer's past orders using raw query for reliable relation loading.
|
|
11
|
+
*/
|
|
12
|
+
getOrderHistory(ctx: RequestContext, args: Record<string, unknown>, customerId?: string | number): Promise<ToolResult>;
|
|
13
|
+
trackOrder(ctx: RequestContext, args: Record<string, unknown>, customerId?: string | number): Promise<ToolResult>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=order-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-tools.d.ts","sourceRoot":"","sources":["../../../src/services/tools/order-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAS,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,qBAAa,UAAU;IAIf,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IAJlB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;gBAG1C,UAAU,EAAE,uBAAuB,EACnC,MAAM,EAAE,gBAAgB;IAGpC;;OAEG;IACG,eAAe,CACjB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAC7B,OAAO,CAAC,UAAU,CAAC;IAyChB,UAAU,CACZ,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAC7B,OAAO,CAAC,UAAU,CAAC;CAwDzB"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OrderTools = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const core_1 = require("@vendure/core");
|
|
6
|
+
const constants_1 = require("../../constants");
|
|
7
|
+
class OrderTools {
|
|
8
|
+
constructor(connection, mapper) {
|
|
9
|
+
this.connection = connection;
|
|
10
|
+
this.mapper = mapper;
|
|
11
|
+
this.logger = new common_1.Logger(OrderTools.name);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* getOrderHistory: fetches the customer's past orders using raw query for reliable relation loading.
|
|
15
|
+
*/
|
|
16
|
+
async getOrderHistory(ctx, args, customerId) {
|
|
17
|
+
if (!customerId) {
|
|
18
|
+
return { products: [], collections: [], summary: 'Error: You must be logged in to view order history.', orders: [] };
|
|
19
|
+
}
|
|
20
|
+
const take = Math.min(Number(args.take) || 5, 10);
|
|
21
|
+
try {
|
|
22
|
+
const orderRepo = this.connection.rawConnection.getRepository(core_1.Order);
|
|
23
|
+
const orders = await orderRepo.createQueryBuilder('order')
|
|
24
|
+
.leftJoinAndSelect('order.lines', 'line')
|
|
25
|
+
.leftJoinAndSelect('line.featuredAsset', 'lineFeaturedAsset')
|
|
26
|
+
.leftJoinAndSelect('line.productVariant', 'variant')
|
|
27
|
+
.leftJoinAndSelect('variant.translations', 'variantTranslation')
|
|
28
|
+
.leftJoinAndSelect('variant.featuredAsset', 'variantFeaturedAsset')
|
|
29
|
+
.leftJoinAndSelect('variant.product', 'product')
|
|
30
|
+
.leftJoinAndSelect('product.featuredAsset', 'productFeaturedAsset')
|
|
31
|
+
.leftJoinAndSelect('product.translations', 'productTranslation')
|
|
32
|
+
.leftJoinAndSelect('order.fulfillments', 'fulfillment')
|
|
33
|
+
.where('order.customerId = :customerId', { customerId })
|
|
34
|
+
.andWhere('order.active = :active', { active: false })
|
|
35
|
+
.orderBy('order.orderPlacedAt', 'DESC')
|
|
36
|
+
.take(take)
|
|
37
|
+
.getMany();
|
|
38
|
+
const mapped = this.mapper.mapOrders(orders);
|
|
39
|
+
return {
|
|
40
|
+
products: [],
|
|
41
|
+
collections: [],
|
|
42
|
+
orders: mapped,
|
|
43
|
+
summary: mapped.length > 0
|
|
44
|
+
? `Found ${mapped.length} order(s). ${mapped.map(o => { var _a; return `Order ${o.code}: ${o.state}, total ${(0, constants_1.formatPrice)(o.total)}, placed ${(_a = o.orderPlacedAt) !== null && _a !== void 0 ? _a : 'N/A'}, items: ${o.lines.map(l => `${l.quantity}x ${l.productName}`).join(', ')}`; }).join(' | ')}`
|
|
45
|
+
: 'No past orders found.',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
this.logger.error(`Error fetching order history: ${e}`);
|
|
50
|
+
return { products: [], collections: [], summary: 'Error fetching order history. Please try again.', orders: [] };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async trackOrder(ctx, args, customerId) {
|
|
54
|
+
var _a;
|
|
55
|
+
if (!customerId) {
|
|
56
|
+
return { products: [], collections: [], summary: 'Error: You must be logged in to track orders.', orders: [] };
|
|
57
|
+
}
|
|
58
|
+
const orderId = args.orderId ? String(args.orderId).trim() : undefined;
|
|
59
|
+
const orderCode = args.orderCode ? String(args.orderCode).trim() : undefined;
|
|
60
|
+
if (!orderId && !orderCode) {
|
|
61
|
+
return { products: [], collections: [], summary: 'Error: Please provide an orderId or orderCode to track. You can use getOrderHistory first to find your orders.', orders: [] };
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const orderRepo = this.connection.rawConnection.getRepository(core_1.Order);
|
|
65
|
+
let qb = orderRepo.createQueryBuilder('order')
|
|
66
|
+
.leftJoinAndSelect('order.lines', 'line')
|
|
67
|
+
.leftJoinAndSelect('line.featuredAsset', 'lineFeaturedAsset')
|
|
68
|
+
.leftJoinAndSelect('line.productVariant', 'variant')
|
|
69
|
+
.leftJoinAndSelect('variant.translations', 'variantTranslation')
|
|
70
|
+
.leftJoinAndSelect('variant.featuredAsset', 'variantFeaturedAsset')
|
|
71
|
+
.leftJoinAndSelect('variant.product', 'product')
|
|
72
|
+
.leftJoinAndSelect('product.featuredAsset', 'productFeaturedAsset')
|
|
73
|
+
.leftJoinAndSelect('product.translations', 'productTranslation')
|
|
74
|
+
.leftJoinAndSelect('order.fulfillments', 'fulfillment')
|
|
75
|
+
.where('order.customerId = :customerId', { customerId });
|
|
76
|
+
if (orderId) {
|
|
77
|
+
qb = qb.andWhere('order.id = :orderId', { orderId });
|
|
78
|
+
}
|
|
79
|
+
else if (orderCode) {
|
|
80
|
+
qb = qb.andWhere('order.code = :orderCode', { orderCode });
|
|
81
|
+
}
|
|
82
|
+
const order = await qb.getOne();
|
|
83
|
+
if (!order) {
|
|
84
|
+
return { products: [], collections: [], summary: `No order found with ${orderId ? `ID ${orderId}` : `code "${orderCode}"`}.`, orders: [] };
|
|
85
|
+
}
|
|
86
|
+
const mapped = this.mapper.mapOrders([order]);
|
|
87
|
+
const o = mapped[0];
|
|
88
|
+
const fulfillmentInfo = o.fulfillments.length > 0
|
|
89
|
+
? o.fulfillments.map(f => `${f.state}${f.trackingCode ? ` (tracking: ${f.trackingCode})` : ''} via ${f.method}`).join(', ')
|
|
90
|
+
: 'No fulfillment yet';
|
|
91
|
+
return {
|
|
92
|
+
products: [],
|
|
93
|
+
collections: [],
|
|
94
|
+
orders: mapped,
|
|
95
|
+
summary: `Order ${o.code}: State: ${o.state}, Total: ${(0, constants_1.formatPrice)(o.total)}, Placed: ${(_a = o.orderPlacedAt) !== null && _a !== void 0 ? _a : 'N/A'}. Fulfillment: ${fulfillmentInfo}. Items: ${o.lines.map(l => `${l.quantity}x ${l.productName}`).join(', ')}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
this.logger.error(`Error tracking order: ${e}`);
|
|
100
|
+
return { products: [], collections: [], summary: 'Error tracking order. Please try again.', orders: [] };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.OrderTools = OrderTools;
|
|
105
|
+
//# sourceMappingURL=order-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-tools.js","sourceRoot":"","sources":["../../../src/services/tools/order-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RequestContext, TransactionalConnection } from '@vendure/core';
|
|
2
|
+
import { EmbeddingService } from '../embedding.service';
|
|
3
|
+
import { ProductEmbeddingService } from '../product-embedding.service';
|
|
4
|
+
import { CollectionEmbeddingService } from '../collection-embedding.service';
|
|
5
|
+
import { ChatResultMapper } from '../chat-result-mapper';
|
|
6
|
+
import type { ToolResult } from '../types';
|
|
7
|
+
export declare class SearchTools {
|
|
8
|
+
private connection;
|
|
9
|
+
private embeddingService;
|
|
10
|
+
private productEmbeddingService;
|
|
11
|
+
private collectionEmbeddingService;
|
|
12
|
+
private mapper;
|
|
13
|
+
private fulltextSearchService;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
constructor(connection: TransactionalConnection, embeddingService: EmbeddingService, productEmbeddingService: ProductEmbeddingService, collectionEmbeddingService: CollectionEmbeddingService, mapper: ChatResultMapper, fulltextSearchService: any);
|
|
16
|
+
searchProducts(ctx: RequestContext, args: Record<string, unknown>): Promise<ToolResult>;
|
|
17
|
+
vectorSearch(ctx: RequestContext, args: Record<string, unknown>): Promise<ToolResult>;
|
|
18
|
+
getCollections(ctx: RequestContext, args: Record<string, unknown>): Promise<ToolResult>;
|
|
19
|
+
filterByPrice(ctx: RequestContext, args: Record<string, unknown>): Promise<ToolResult>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=search-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-tools.d.ts","sourceRoot":"","sources":["../../../src/services/tools/search-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAuB,MAAM,eAAe,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAiB,UAAU,EAAE,MAAM,UAAU,CAAC;AAE1D,qBAAa,WAAW;IAIhB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,uBAAuB;IAC/B,OAAO,CAAC,0BAA0B;IAClC,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,qBAAqB;IARjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;gBAG3C,UAAU,EAAE,uBAAuB,EACnC,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,EAAE,uBAAuB,EAChD,0BAA0B,EAAE,0BAA0B,EACtD,MAAM,EAAE,gBAAgB,EACxB,qBAAqB,EAAE,GAAG;IAGhC,cAAc,CAChB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,UAAU,CAAC;IA8DhB,YAAY,CACd,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,UAAU,CAAC;IA4ChB,cAAc,CAChB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,UAAU,CAAC;IA0BhB,aAAa,CACf,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,UAAU,CAAC;CA6FzB"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SearchTools = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const core_1 = require("@vendure/core");
|
|
6
|
+
const constants_1 = require("../../constants");
|
|
7
|
+
class SearchTools {
|
|
8
|
+
constructor(connection, embeddingService, productEmbeddingService, collectionEmbeddingService, mapper, fulltextSearchService) {
|
|
9
|
+
this.connection = connection;
|
|
10
|
+
this.embeddingService = embeddingService;
|
|
11
|
+
this.productEmbeddingService = productEmbeddingService;
|
|
12
|
+
this.collectionEmbeddingService = collectionEmbeddingService;
|
|
13
|
+
this.mapper = mapper;
|
|
14
|
+
this.fulltextSearchService = fulltextSearchService;
|
|
15
|
+
this.logger = new common_1.Logger(SearchTools.name);
|
|
16
|
+
}
|
|
17
|
+
async searchProducts(ctx, args) {
|
|
18
|
+
var _a;
|
|
19
|
+
const query = String((_a = args.query) !== null && _a !== void 0 ? _a : '').trim();
|
|
20
|
+
const take = Math.min(Number(args.take) || 10, 20);
|
|
21
|
+
if (!query) {
|
|
22
|
+
return { products: [], collections: [], summary: 'No search query provided' };
|
|
23
|
+
}
|
|
24
|
+
let mapped;
|
|
25
|
+
if (this.fulltextSearchService) {
|
|
26
|
+
// Use Vendure's search index (same as storefront)
|
|
27
|
+
const result = await this.fulltextSearchService.search(ctx, {
|
|
28
|
+
term: query,
|
|
29
|
+
take,
|
|
30
|
+
skip: 0,
|
|
31
|
+
groupByProduct: true,
|
|
32
|
+
}, true);
|
|
33
|
+
this.logger.log(`FulltextSearch returned ${result.items.length} items for "${query}": ${result.items.map((i) => `${i.productName}(pid:${i.productId},vid:${i.productVariantId})`).join(', ')}`);
|
|
34
|
+
mapped = result.items.map((item) => {
|
|
35
|
+
var _a, _b, _c, _d;
|
|
36
|
+
const price = item.price && 'value' in item.price
|
|
37
|
+
? item.price.value
|
|
38
|
+
: item.price && 'min' in item.price
|
|
39
|
+
? item.price.min
|
|
40
|
+
: 0;
|
|
41
|
+
return {
|
|
42
|
+
id: String(item.productId),
|
|
43
|
+
name: String((_a = item.productName) !== null && _a !== void 0 ? _a : ''),
|
|
44
|
+
slug: String((_b = item.slug) !== null && _b !== void 0 ? _b : ''),
|
|
45
|
+
price: Number(price),
|
|
46
|
+
image: this.mapper.resolveAssetUrl((_d = (_c = item.productAsset) === null || _c === void 0 ? void 0 : _c.preview) !== null && _d !== void 0 ? _d : null),
|
|
47
|
+
variantId: String(item.productVariantId),
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Fallback: raw DB query
|
|
53
|
+
const repo = this.connection.rawConnection.getRepository(core_1.Product);
|
|
54
|
+
const products = await repo.createQueryBuilder('product')
|
|
55
|
+
.leftJoinAndSelect('product.translations', 'translation')
|
|
56
|
+
.leftJoinAndSelect('product.featuredAsset', 'featuredAsset')
|
|
57
|
+
.leftJoinAndSelect('product.variants', 'variant')
|
|
58
|
+
.leftJoinAndSelect('variant.productVariantPrices', 'price')
|
|
59
|
+
.where('product.deletedAt IS NULL')
|
|
60
|
+
.andWhere('product.enabled = :enabled', { enabled: true })
|
|
61
|
+
.andWhere('(LOWER(translation.name) LIKE :term OR LOWER(translation.description) LIKE :term)', { term: `%${query.toLowerCase()}%` })
|
|
62
|
+
.take(take)
|
|
63
|
+
.getMany();
|
|
64
|
+
mapped = this.mapper.mapProducts(products);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
products: mapped,
|
|
68
|
+
collections: [],
|
|
69
|
+
summary: mapped.length > 0
|
|
70
|
+
? `Found ${mapped.length} product(s) matching "${query}". The products with their variantIds are: ${mapped.map(p => `"${p.name}" (variantId: ${p.variantId}, price: ${(0, constants_1.formatPrice)(p.price)})`).join(', ')}. Products are displayed as cards in the UI — do not list them again in your text response.`
|
|
71
|
+
: `No products found matching "${query}".`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async vectorSearch(ctx, args) {
|
|
75
|
+
var _a, _b, _c, _d, _e;
|
|
76
|
+
const query = String((_a = args.query) !== null && _a !== void 0 ? _a : '').trim();
|
|
77
|
+
if (!query) {
|
|
78
|
+
return { products: [], collections: [], summary: 'No search query provided' };
|
|
79
|
+
}
|
|
80
|
+
const queryEmbedding = await this.embeddingService.embed(query);
|
|
81
|
+
let similar = await this.productEmbeddingService.findSimilar(ctx, queryEmbedding, constants_1.MAX_CHAT_PRODUCTS, constants_1.SIMILARITY_THRESHOLD);
|
|
82
|
+
if (similar.length === 0) {
|
|
83
|
+
const fallback = await this.productEmbeddingService.findSimilar(ctx, queryEmbedding, constants_1.MAX_CHAT_PRODUCTS);
|
|
84
|
+
if (fallback.length > 0 && ((_c = (_b = fallback[0]) === null || _b === void 0 ? void 0 : _b.score) !== null && _c !== void 0 ? _c : 0) >= constants_1.FALLBACK_MIN_SCORE) {
|
|
85
|
+
similar = fallback;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
let similarCollections = await this.collectionEmbeddingService.findSimilar(ctx, queryEmbedding, constants_1.MAX_CHAT_COLLECTIONS, constants_1.SIMILARITY_THRESHOLD);
|
|
89
|
+
if (similarCollections.length === 0) {
|
|
90
|
+
const fallbackColl = await this.collectionEmbeddingService.findSimilar(ctx, queryEmbedding, constants_1.MAX_CHAT_COLLECTIONS);
|
|
91
|
+
if (fallbackColl.length > 0 && ((_e = (_d = fallbackColl[0]) === null || _d === void 0 ? void 0 : _d.score) !== null && _e !== void 0 ? _e : 0) >= constants_1.FALLBACK_MIN_SCORE) {
|
|
92
|
+
similarCollections = fallbackColl;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const products = similar.length > 0 ? await this.mapper.loadProductsByIds(similar.map(s => s.productId)) : [];
|
|
96
|
+
const collections = similarCollections.length > 0 ? await this.mapper.loadCollectionsByIds(similarCollections.map(s => s.collectionId)) : [];
|
|
97
|
+
return {
|
|
98
|
+
products,
|
|
99
|
+
collections,
|
|
100
|
+
summary: products.length > 0
|
|
101
|
+
? `Found ${products.length} product(s) related to "${query}". The products with their variantIds are: ${products.map(p => `"${p.name}" (variantId: ${p.variantId}, price: ${(0, constants_1.formatPrice)(p.price)})`).join(', ')}. Products are displayed as cards in the UI — do not list them again in your text response.`
|
|
102
|
+
: `No products found related to "${query}".`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
async getCollections(ctx, args) {
|
|
106
|
+
var _a;
|
|
107
|
+
const query = String((_a = args.query) !== null && _a !== void 0 ? _a : '').trim();
|
|
108
|
+
const repo = this.connection.rawConnection.getRepository(core_1.Collection);
|
|
109
|
+
let qb = repo.createQueryBuilder('collection')
|
|
110
|
+
.leftJoinAndSelect('collection.translations', 'translation')
|
|
111
|
+
.where('collection.isPrivate = :isPrivate', { isPrivate: false })
|
|
112
|
+
.andWhere('collection.isRoot = :isRoot', { isRoot: false });
|
|
113
|
+
if (query) {
|
|
114
|
+
qb = qb.andWhere('LOWER(translation.name) LIKE :term', { term: `%${query.toLowerCase()}%` });
|
|
115
|
+
}
|
|
116
|
+
const collections = await qb.take(15).getMany();
|
|
117
|
+
const mapped = this.mapper.mapCollections(collections);
|
|
118
|
+
return {
|
|
119
|
+
products: [],
|
|
120
|
+
collections: mapped,
|
|
121
|
+
summary: mapped.length > 0
|
|
122
|
+
? `Found ${mapped.length} collection(s)${query ? ` matching "${query}"` : ''}: ${mapped.map(c => c.name).join(', ')}.`
|
|
123
|
+
: `No collections found${query ? ` matching "${query}"` : ''}.`,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
// todo: esma elastic search ko price range wala halne aaile hawa in memory sorting xa
|
|
127
|
+
async filterByPrice(ctx, args) {
|
|
128
|
+
var _a;
|
|
129
|
+
const minPrice = args.minPrice != null ? Number(args.minPrice) : undefined;
|
|
130
|
+
const maxPrice = args.maxPrice != null ? Number(args.maxPrice) : undefined;
|
|
131
|
+
const query = String((_a = args.query) !== null && _a !== void 0 ? _a : '').trim();
|
|
132
|
+
let mapped;
|
|
133
|
+
if (query && this.fulltextSearchService) {
|
|
134
|
+
const fetchSize = 50;
|
|
135
|
+
const result = await this.fulltextSearchService.search(ctx, {
|
|
136
|
+
term: query,
|
|
137
|
+
take: fetchSize,
|
|
138
|
+
skip: 0,
|
|
139
|
+
groupByProduct: true,
|
|
140
|
+
}, true);
|
|
141
|
+
this.logger.log(`filterByPrice: FulltextSearch returned ${result.items.length} items for "${query}"`);
|
|
142
|
+
// Map results and extract price
|
|
143
|
+
let candidates = result.items.map((item) => {
|
|
144
|
+
var _a, _b, _c, _d;
|
|
145
|
+
const price = item.price && 'value' in item.price
|
|
146
|
+
? item.price.value
|
|
147
|
+
: item.price && 'min' in item.price
|
|
148
|
+
? item.price.min
|
|
149
|
+
: 0;
|
|
150
|
+
return {
|
|
151
|
+
id: String(item.productId),
|
|
152
|
+
name: String((_a = item.productName) !== null && _a !== void 0 ? _a : ''),
|
|
153
|
+
slug: String((_b = item.slug) !== null && _b !== void 0 ? _b : ''),
|
|
154
|
+
price: Number(price),
|
|
155
|
+
image: this.mapper.resolveAssetUrl((_d = (_c = item.productAsset) === null || _c === void 0 ? void 0 : _c.preview) !== null && _d !== void 0 ? _d : null),
|
|
156
|
+
variantId: String(item.productVariantId),
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
// Apply price filter in memory
|
|
160
|
+
if (minPrice != null) {
|
|
161
|
+
candidates = candidates.filter((p) => p.price >= minPrice);
|
|
162
|
+
}
|
|
163
|
+
if (maxPrice != null) {
|
|
164
|
+
candidates = candidates.filter((p) => p.price <= maxPrice);
|
|
165
|
+
}
|
|
166
|
+
// Sort by price ascending and limit
|
|
167
|
+
candidates.sort((a, b) => a.price - b.price);
|
|
168
|
+
mapped = candidates.slice(0, constants_1.MAX_CHAT_PRODUCTS);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Fallback: raw DB query (no keyword, or FulltextSearchService unavailable)
|
|
172
|
+
const repo = this.connection.rawConnection.getRepository(core_1.Product);
|
|
173
|
+
let qb = repo.createQueryBuilder('product')
|
|
174
|
+
.leftJoinAndSelect('product.translations', 'translation')
|
|
175
|
+
.leftJoinAndSelect('product.featuredAsset', 'featuredAsset')
|
|
176
|
+
.leftJoinAndSelect('product.variants', 'variant')
|
|
177
|
+
.leftJoinAndSelect('variant.productVariantPrices', 'variantPrice')
|
|
178
|
+
.where('product.deletedAt IS NULL')
|
|
179
|
+
.andWhere('product.enabled = :enabled', { enabled: true });
|
|
180
|
+
if (query) {
|
|
181
|
+
// Also search collection names so terms like "electronics" match
|
|
182
|
+
// In Vendure, Collection ↔ ProductVariant is a many-to-many relation
|
|
183
|
+
qb = qb
|
|
184
|
+
.leftJoin('variant.collections', 'collection')
|
|
185
|
+
.leftJoin('collection.translations', 'collectionTranslation')
|
|
186
|
+
.andWhere('(LOWER(translation.name) LIKE :term OR LOWER(translation.description) LIKE :term OR LOWER(collectionTranslation.name) LIKE :term)', { term: `%${query.toLowerCase()}%` });
|
|
187
|
+
}
|
|
188
|
+
if (minPrice != null && maxPrice != null) {
|
|
189
|
+
qb = qb.andWhere('variantPrice.price BETWEEN :minPrice AND :maxPrice', { minPrice, maxPrice });
|
|
190
|
+
}
|
|
191
|
+
else if (minPrice != null) {
|
|
192
|
+
qb = qb.andWhere('variantPrice.price >= :minPrice', { minPrice });
|
|
193
|
+
}
|
|
194
|
+
else if (maxPrice != null) {
|
|
195
|
+
qb = qb.andWhere('variantPrice.price <= :maxPrice', { maxPrice });
|
|
196
|
+
}
|
|
197
|
+
qb = qb.orderBy('variantPrice.price', 'ASC').take(constants_1.MAX_CHAT_PRODUCTS);
|
|
198
|
+
const products = await qb.getMany();
|
|
199
|
+
mapped = this.mapper.mapProducts(products);
|
|
200
|
+
}
|
|
201
|
+
const priceDesc = minPrice != null && maxPrice != null
|
|
202
|
+
? `between ${(0, constants_1.formatPrice)(minPrice)} and ${(0, constants_1.formatPrice)(maxPrice)}`
|
|
203
|
+
: minPrice != null ? `above ${(0, constants_1.formatPrice)(minPrice)}` : maxPrice != null ? `under ${(0, constants_1.formatPrice)(maxPrice)}` : '';
|
|
204
|
+
return {
|
|
205
|
+
products: mapped,
|
|
206
|
+
collections: [],
|
|
207
|
+
summary: mapped.length > 0
|
|
208
|
+
? `Found ${mapped.length} product(s) ${priceDesc}${query ? ` matching "${query}"` : ''}. The products with their variantIds are: ${mapped.map(p => `"${p.name}" (variantId: ${p.variantId}, price: ${(0, constants_1.formatPrice)(p.price)})`).join(', ')}. Products are displayed as cards in the UI — do not list them again in your text response.`
|
|
209
|
+
: `No products found ${priceDesc}${query ? ` matching "${query}"` : ''}.`,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.SearchTools = SearchTools;
|
|
214
|
+
//# sourceMappingURL=search-tools.js.map
|