@unchainedshop/api 4.0.0-rc.10 → 4.0.0-rc.11
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/lib/mcp/index.d.ts.map +1 -1
- package/lib/mcp/index.js +6 -0
- package/lib/mcp/index.js.map +1 -1
- package/lib/mcp/tools/delivery/createDeliveryProviderHandler.d.ts +44 -0
- package/lib/mcp/tools/delivery/createDeliveryProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/createDeliveryProviderHandler.js +50 -0
- package/lib/mcp/tools/delivery/createDeliveryProviderHandler.js.map +1 -0
- package/lib/mcp/tools/delivery/deliveryInterfacesHandler.d.ts +20 -0
- package/lib/mcp/tools/delivery/deliveryInterfacesHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/deliveryInterfacesHandler.js +45 -0
- package/lib/mcp/tools/delivery/deliveryInterfacesHandler.js.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvider.d.ts +20 -0
- package/lib/mcp/tools/delivery/deliveryProvider.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvider.js +43 -0
- package/lib/mcp/tools/delivery/deliveryProvider.js.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.d.ts +20 -0
- package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.js +36 -0
- package/lib/mcp/tools/delivery/deliveryProvidersCountHandler.js.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvidersListHandler.d.ts +24 -0
- package/lib/mcp/tools/delivery/deliveryProvidersListHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/deliveryProvidersListHandler.js +44 -0
- package/lib/mcp/tools/delivery/deliveryProvidersListHandler.js.map +1 -0
- package/lib/mcp/tools/delivery/index.d.ts +4 -0
- package/lib/mcp/tools/delivery/index.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/index.js +17 -0
- package/lib/mcp/tools/delivery/index.js.map +1 -0
- package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.d.ts +20 -0
- package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.js +37 -0
- package/lib/mcp/tools/delivery/removeDeliveryProviderHandler.js.map +1 -0
- package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.d.ts +96 -0
- package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.js +54 -0
- package/lib/mcp/tools/delivery/updateDeliveryProviderHandler.js.map +1 -0
- package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.d.ts +36 -0
- package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.d.ts.map +1 -0
- package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.js +89 -0
- package/lib/mcp/tools/order/getMonthlySalesBreakdownHandler.js.map +1 -0
- package/lib/mcp/tools/order/getSalesSummaryHandler.d.ts +40 -0
- package/lib/mcp/tools/order/getSalesSummaryHandler.d.ts.map +1 -0
- package/lib/mcp/tools/order/getSalesSummaryHandler.js +90 -0
- package/lib/mcp/tools/order/getSalesSummaryHandler.js.map +1 -0
- package/lib/mcp/tools/order/getTopCustomersHandler.d.ts +52 -0
- package/lib/mcp/tools/order/getTopCustomersHandler.d.ts.map +1 -0
- package/lib/mcp/tools/order/getTopCustomersHandler.js +111 -0
- package/lib/mcp/tools/order/getTopCustomersHandler.js.map +1 -0
- package/lib/mcp/tools/order/getTopSellingProductsHandler.d.ts +28 -0
- package/lib/mcp/tools/order/getTopSellingProductsHandler.d.ts.map +1 -0
- package/lib/mcp/tools/order/getTopSellingProductsHandler.js +99 -0
- package/lib/mcp/tools/order/getTopSellingProductsHandler.js.map +1 -0
- package/lib/mcp/tools/order/index.d.ts +4 -0
- package/lib/mcp/tools/order/index.d.ts.map +1 -0
- package/lib/mcp/tools/order/index.js +13 -0
- package/lib/mcp/tools/order/index.js.map +1 -0
- package/lib/mcp/tools/order/ordersListHandler.d.ts +108 -0
- package/lib/mcp/tools/order/ordersListHandler.d.ts.map +1 -0
- package/lib/mcp/tools/order/ordersListHandler.js +91 -0
- package/lib/mcp/tools/order/ordersListHandler.js.map +1 -0
- package/lib/mcp/tools/payment/createPaymentProviderHandler.d.ts.map +1 -1
- package/lib/mcp/tools/payment/createPaymentProviderHandler.js +5 -2
- package/lib/mcp/tools/payment/createPaymentProviderHandler.js.map +1 -1
- package/lib/mcp/tools/payment/index.js +1 -1
- package/lib/mcp/tools/payment/index.js.map +1 -1
- package/lib/mcp/tools/payment/paymentInterfacesHandler.d.ts +2 -2
- package/lib/mcp/tools/payment/paymentInterfacesHandler.d.ts.map +1 -1
- package/lib/mcp/tools/payment/paymentInterfacesHandler.js +7 -5
- package/lib/mcp/tools/payment/paymentInterfacesHandler.js.map +1 -1
- package/lib/mcp/tools/payment/paymentProviderByIdHandler.js +1 -1
- package/lib/mcp/tools/payment/paymentProviderByIdHandler.js.map +1 -1
- package/lib/mcp/tools/payment/paymentProvidersListHandler.d.ts +4 -0
- package/lib/mcp/tools/payment/paymentProvidersListHandler.d.ts.map +1 -1
- package/lib/mcp/tools/payment/paymentProvidersListHandler.js +12 -3
- package/lib/mcp/tools/payment/paymentProvidersListHandler.js.map +1 -1
- package/lib/mcp/tools/payment/removePaymentProviderHandler.d.ts.map +1 -1
- package/lib/mcp/tools/payment/removePaymentProviderHandler.js +5 -4
- package/lib/mcp/tools/payment/removePaymentProviderHandler.js.map +1 -1
- package/lib/mcp/tools/payment/updatePaymentProviderHandler.d.ts +66 -10
- package/lib/mcp/tools/payment/updatePaymentProviderHandler.d.ts.map +1 -1
- package/lib/mcp/tools/payment/updatePaymentProviderHandler.js +18 -3
- package/lib/mcp/tools/payment/updatePaymentProviderHandler.js.map +1 -1
- package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.d.ts +44 -0
- package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.js +48 -0
- package/lib/mcp/tools/warehousing/createWarehousingProviderHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/index.d.ts +4 -0
- package/lib/mcp/tools/warehousing/index.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/index.js +17 -0
- package/lib/mcp/tools/warehousing/index.js.map +1 -0
- package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.d.ts +20 -0
- package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.js +39 -0
- package/lib/mcp/tools/warehousing/removeWarehousingProviderHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.d.ts +96 -0
- package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.js +58 -0
- package/lib/mcp/tools/warehousing/updateWarehousingProviderHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.d.ts +20 -0
- package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.js +45 -0
- package/lib/mcp/tools/warehousing/warehousingInterfacesHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProviderHandler.d.ts +20 -0
- package/lib/mcp/tools/warehousing/warehousingProviderHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProviderHandler.js +45 -0
- package/lib/mcp/tools/warehousing/warehousingProviderHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.d.ts +20 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.js +36 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersCountHandler.js.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.d.ts +24 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.d.ts.map +1 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.js +44 -0
- package/lib/mcp/tools/warehousing/warehousingProvidersListHandler.js.map +1 -0
- package/lib/mcp/utils/orderFilters.d.ts +22 -0
- package/lib/mcp/utils/orderFilters.d.ts.map +1 -0
- package/lib/mcp/utils/orderFilters.js +34 -0
- package/lib/mcp/utils/orderFilters.js.map +1 -0
- package/lib/mcp/utils/sharedSchemas.d.ts +11 -0
- package/lib/mcp/utils/sharedSchemas.d.ts.map +1 -0
- package/lib/mcp/utils/sharedSchemas.js +11 -0
- package/lib/mcp/utils/sharedSchemas.js.map +1 -0
- package/lib/resolvers/queries/orders/orders.d.ts.map +1 -1
- package/lib/resolvers/queries/orders/orders.js +33 -4
- package/lib/resolvers/queries/orders/orders.js.map +1 -1
- package/lib/resolvers/queries/orders/ordersCount.d.ts.map +1 -1
- package/lib/resolvers/queries/orders/ordersCount.js +29 -1
- package/lib/resolvers/queries/orders/ordersCount.js.map +1 -1
- package/lib/schema/query.d.ts.map +1 -1
- package/lib/schema/query.js +11 -1
- package/lib/schema/query.js.map +1 -1
- package/package.json +1 -1
- package/src/mcp/index.ts +6 -1
- package/src/mcp/tools/delivery/createDeliveryProviderHandler.ts +62 -0
- package/src/mcp/tools/delivery/deliveryInterfacesHandler.ts +56 -0
- package/src/mcp/tools/delivery/deliveryProvider.ts +51 -0
- package/src/mcp/tools/delivery/deliveryProvidersCountHandler.ts +46 -0
- package/src/mcp/tools/delivery/deliveryProvidersListHandler.ts +54 -0
- package/src/mcp/tools/delivery/index.ts +74 -0
- package/src/mcp/tools/delivery/removeDeliveryProviderHandler.ts +45 -0
- package/src/mcp/tools/delivery/updateDeliveryProviderHandler.ts +68 -0
- package/src/mcp/tools/order/getMonthlySalesBreakdownHandler.ts +106 -0
- package/src/mcp/tools/order/getSalesSummaryHandler.ts +103 -0
- package/src/mcp/tools/order/getTopCustomersHandler.ts +123 -0
- package/src/mcp/tools/order/getTopSellingProductsHandler.ts +112 -0
- package/src/mcp/tools/order/index.ts +50 -0
- package/src/mcp/tools/order/ordersListHandler.ts +119 -0
- package/src/mcp/tools/payment/createPaymentProviderHandler.ts +7 -2
- package/src/mcp/tools/payment/index.ts +1 -1
- package/src/mcp/tools/payment/paymentInterfacesHandler.ts +13 -10
- package/src/mcp/tools/payment/paymentProviderByIdHandler.ts +1 -1
- package/src/mcp/tools/payment/paymentProvidersListHandler.ts +14 -4
- package/src/mcp/tools/payment/removePaymentProviderHandler.ts +6 -8
- package/src/mcp/tools/payment/updatePaymentProviderHandler.ts +23 -4
- package/src/mcp/tools/warehousing/createWarehousingProviderHandler.ts +61 -0
- package/src/mcp/tools/warehousing/index.ts +81 -0
- package/src/mcp/tools/warehousing/removeWarehousingProviderHandler.ts +46 -0
- package/src/mcp/tools/warehousing/updateWarehousingProviderHandler.ts +72 -0
- package/src/mcp/tools/warehousing/warehousingInterfacesHandler.ts +58 -0
- package/src/mcp/tools/warehousing/warehousingProviderHandler.ts +55 -0
- package/src/mcp/tools/warehousing/warehousingProvidersCountHandler.ts +46 -0
- package/src/mcp/tools/warehousing/warehousingProvidersListHandler.ts +55 -0
- package/src/mcp/utils/orderFilters.ts +52 -0
- package/src/mcp/utils/sharedSchemas.ts +12 -0
- package/src/resolvers/queries/orders/orders.ts +46 -5
- package/src/resolvers/queries/orders/ordersCount.ts +42 -1
- package/src/schema/query.ts +11 -1
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
import { log } from '@unchainedshop/logger';
|
|
4
|
+
import { PaymentProviderType } from '@unchainedshop/core-payment';
|
|
5
|
+
import { DeliveryProviderType } from '@unchainedshop/core-delivery';
|
|
6
|
+
import { resolveOrderFilters } from '../../utils/orderFilters.js';
|
|
7
|
+
|
|
8
|
+
const OrderStatusEnum = z.enum(['PENDING', 'CONFIRMED', 'SHIPPED', 'DELIVERED', 'CANCELLED']);
|
|
9
|
+
const PaymentProviderTypeEnum = z.enum(['CARD', 'INVOICE', 'GENERIC']);
|
|
10
|
+
const DeliveryProviderTypeEnum = z.enum(['PICKUP', 'SHIPPING', 'LOCAL']);
|
|
11
|
+
const SortDirectionEnum = z.enum(['ASC', 'DESC']);
|
|
12
|
+
|
|
13
|
+
const SortOptionInput = z.object({
|
|
14
|
+
key: z.string().min(1).describe('Field to sort by'),
|
|
15
|
+
value: SortDirectionEnum.describe('Sort direction'),
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const DateFilterInput = z.object({
|
|
19
|
+
from: z.string().datetime().optional().describe('Start date (ISO format)'),
|
|
20
|
+
to: z.string().datetime().optional().describe('End date (ISO format)'),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export const OrdersListSchema = {
|
|
24
|
+
limit: z.number().int().min(1).max(100).default(10),
|
|
25
|
+
offset: z.number().int().min(0).default(0),
|
|
26
|
+
includeCarts: z.boolean().default(false),
|
|
27
|
+
queryString: z.string().optional(),
|
|
28
|
+
status: z.array(OrderStatusEnum).optional(),
|
|
29
|
+
sort: z.array(SortOptionInput).optional(),
|
|
30
|
+
paymentProviderTypes: z.array(PaymentProviderTypeEnum).optional(),
|
|
31
|
+
deliveryProviderTypes: z.array(DeliveryProviderTypeEnum).optional(),
|
|
32
|
+
paymentProviderIds: z.array(z.string().min(1)).optional(),
|
|
33
|
+
deliveryProviderIds: z.array(z.string().min(1)).optional(),
|
|
34
|
+
dateRange: DateFilterInput.optional(),
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const OrdersListZodSchema = z.object(OrdersListSchema);
|
|
38
|
+
export type OrdersListParams = z.infer<typeof OrdersListZodSchema>;
|
|
39
|
+
|
|
40
|
+
export async function ordersListHandler(context: Context, params: OrdersListParams) {
|
|
41
|
+
const { modules, userId } = context;
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
log('handler ordersListHandler', { userId, params });
|
|
45
|
+
|
|
46
|
+
const {
|
|
47
|
+
paymentProviderTypes,
|
|
48
|
+
deliveryProviderTypes,
|
|
49
|
+
paymentProviderIds = [],
|
|
50
|
+
deliveryProviderIds = [],
|
|
51
|
+
...restParams
|
|
52
|
+
} = params;
|
|
53
|
+
|
|
54
|
+
const resolvedPaymentProviderIds = new Set(paymentProviderIds);
|
|
55
|
+
const resolvedDeliveryProviderIds = new Set(deliveryProviderIds);
|
|
56
|
+
|
|
57
|
+
const lookups: Promise<void>[] = [];
|
|
58
|
+
|
|
59
|
+
if (paymentProviderTypes?.length) {
|
|
60
|
+
lookups.push(
|
|
61
|
+
modules.payment.paymentProviders
|
|
62
|
+
.findProviders({ type: { $in: paymentProviderTypes as PaymentProviderType[] } })
|
|
63
|
+
.then((providers) => {
|
|
64
|
+
providers.forEach((p) => resolvedPaymentProviderIds.add(p._id));
|
|
65
|
+
}),
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (deliveryProviderTypes?.length) {
|
|
70
|
+
lookups.push(
|
|
71
|
+
modules.delivery
|
|
72
|
+
.findProviders({ type: { $in: deliveryProviderTypes as DeliveryProviderType[] } })
|
|
73
|
+
.then((providers) => {
|
|
74
|
+
providers.forEach((p) => resolvedDeliveryProviderIds.add(p._id));
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
await Promise.all(lookups);
|
|
80
|
+
|
|
81
|
+
const filters = await resolveOrderFilters(modules, {
|
|
82
|
+
paymentProviderIds: [...resolvedPaymentProviderIds],
|
|
83
|
+
deliveryProviderIds: [...resolvedDeliveryProviderIds],
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
if (!filters) {
|
|
87
|
+
return {
|
|
88
|
+
content: [
|
|
89
|
+
{
|
|
90
|
+
type: 'text' as const,
|
|
91
|
+
text: JSON.stringify({ orders: [] }),
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const orders = await modules.orders.findOrders({
|
|
97
|
+
...restParams,
|
|
98
|
+
...filters,
|
|
99
|
+
} as any);
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
content: [
|
|
103
|
+
{
|
|
104
|
+
type: 'text' as const,
|
|
105
|
+
text: JSON.stringify({ orders }),
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
};
|
|
109
|
+
} catch (error) {
|
|
110
|
+
return {
|
|
111
|
+
content: [
|
|
112
|
+
{
|
|
113
|
+
type: 'text' as const,
|
|
114
|
+
text: `Error fetching orders: ${(error as Error).message}`,
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -9,7 +9,12 @@ const PaymentProviderTypeEnum = z.enum(['CARD', 'INVOICE', 'GENERIC']);
|
|
|
9
9
|
export const CreatePaymentProviderSchema = {
|
|
10
10
|
paymentProvider: z.object({
|
|
11
11
|
type: PaymentProviderTypeEnum.describe('Type of payment provider'),
|
|
12
|
-
adapterKey: z
|
|
12
|
+
adapterKey: z
|
|
13
|
+
.string()
|
|
14
|
+
.min(1)
|
|
15
|
+
.describe(
|
|
16
|
+
'Adapter key for the payment provider, this value should be a valid adapter key found in payment provider interfaces',
|
|
17
|
+
),
|
|
13
18
|
}),
|
|
14
19
|
};
|
|
15
20
|
|
|
@@ -38,7 +43,7 @@ export async function createPaymentProviderHandler(
|
|
|
38
43
|
content: [
|
|
39
44
|
{
|
|
40
45
|
type: 'text' as const,
|
|
41
|
-
text: JSON.stringify({
|
|
46
|
+
text: JSON.stringify({ provider: created }),
|
|
42
47
|
},
|
|
43
48
|
],
|
|
44
49
|
};
|
|
@@ -51,7 +51,7 @@ export const registerPaymentProviderTools = (server: McpServer, context: Context
|
|
|
51
51
|
async (params) => paymentInterfacesHandler(context, params),
|
|
52
52
|
);
|
|
53
53
|
server.tool(
|
|
54
|
-
'
|
|
54
|
+
'paymentProvider_add',
|
|
55
55
|
'Adds new payment provider.',
|
|
56
56
|
CreatePaymentProviderSchema,
|
|
57
57
|
async (params) => createPaymentProviderHandler(context, params),
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
|
|
3
2
|
import { Context } from '../../../context.js';
|
|
4
3
|
import { log } from '@unchainedshop/logger';
|
|
5
4
|
import { PaymentDirector } from '@unchainedshop/core';
|
|
@@ -8,7 +7,7 @@ import { PaymentProviderType } from '@unchainedshop/core-payment';
|
|
|
8
7
|
const PaymentProviderTypeEnum = z.enum(['CARD', 'INVOICE', 'GENERIC']);
|
|
9
8
|
|
|
10
9
|
export const PaymentInterfacesSchema = {
|
|
11
|
-
type: PaymentProviderTypeEnum.describe('
|
|
10
|
+
type: PaymentProviderTypeEnum.optional().describe('Optional filter by payment provider type'),
|
|
12
11
|
};
|
|
13
12
|
|
|
14
13
|
export const PaymentInterfacesZodSchema = z.object(PaymentInterfacesSchema);
|
|
@@ -21,19 +20,23 @@ export async function paymentInterfacesHandler(context: Context, params: Payment
|
|
|
21
20
|
try {
|
|
22
21
|
log('handler paymentInterfacesHandler', { userId, type });
|
|
23
22
|
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
const allAdapters = await PaymentDirector.getAdapters();
|
|
24
|
+
|
|
25
|
+
const filteredAdapters = type
|
|
26
|
+
? allAdapters.filter((Adapter) => Adapter.typeSupported(type as PaymentProviderType))
|
|
27
|
+
: allAdapters;
|
|
28
|
+
|
|
29
|
+
const interfaces = filteredAdapters.map((Adapter) => ({
|
|
30
|
+
_id: Adapter.key,
|
|
31
|
+
label: Adapter.label,
|
|
32
|
+
version: Adapter.version,
|
|
33
|
+
}));
|
|
31
34
|
|
|
32
35
|
return {
|
|
33
36
|
content: [
|
|
34
37
|
{
|
|
35
38
|
type: 'text' as const,
|
|
36
|
-
text: JSON.stringify({
|
|
39
|
+
text: JSON.stringify({ interfaces }),
|
|
37
40
|
},
|
|
38
41
|
],
|
|
39
42
|
};
|
|
@@ -5,25 +5,35 @@ import { log } from '@unchainedshop/logger';
|
|
|
5
5
|
const PaymentProviderTypeEnum = z.enum(['CARD', 'INVOICE', 'GENERIC']);
|
|
6
6
|
|
|
7
7
|
export const PaymentProvidersListSchema = {
|
|
8
|
-
type: PaymentProviderTypeEnum.optional().describe('
|
|
8
|
+
type: PaymentProviderTypeEnum.optional().describe('Optional filter by payment provider type'),
|
|
9
|
+
queryString: z.string().min(1).optional().describe('Optional full-text search string'),
|
|
9
10
|
};
|
|
10
11
|
|
|
11
12
|
export const PaymentProvidersListZodSchema = z.object(PaymentProvidersListSchema);
|
|
12
13
|
export type PaymentProvidersListParams = z.infer<typeof PaymentProvidersListZodSchema>;
|
|
13
|
-
|
|
14
14
|
export async function paymentProvidersListHandler(context: Context, params: PaymentProvidersListParams) {
|
|
15
15
|
const { modules, userId } = context;
|
|
16
16
|
|
|
17
17
|
try {
|
|
18
18
|
log('handler paymentProvidersListHandler', { userId, params });
|
|
19
19
|
|
|
20
|
-
const
|
|
20
|
+
const { type, queryString } = params;
|
|
21
|
+
|
|
22
|
+
const selector: Record<string, any> = {};
|
|
23
|
+
if (type) selector.type = type;
|
|
24
|
+
|
|
25
|
+
if (queryString) {
|
|
26
|
+
const regex = new RegExp(queryString, 'i');
|
|
27
|
+
selector.$or = [{ _id: regex }, { adapterKey: regex }];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const providers = await modules.payment.paymentProviders.findProviders(selector);
|
|
21
31
|
|
|
22
32
|
return {
|
|
23
33
|
content: [
|
|
24
34
|
{
|
|
25
35
|
type: 'text' as const,
|
|
26
|
-
text: JSON.stringify({
|
|
36
|
+
text: JSON.stringify({ providers }),
|
|
27
37
|
},
|
|
28
38
|
],
|
|
29
39
|
};
|
|
@@ -20,20 +20,18 @@ export async function removePaymentProviderHandler(
|
|
|
20
20
|
try {
|
|
21
21
|
log('handler removePaymentProviderHandler', { userId, paymentProviderId });
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
)
|
|
28
|
-
throw new PaymentProviderNotFoundError({ paymentProviderId });
|
|
23
|
+
const provider = await modules.payment.paymentProviders.findProvider({
|
|
24
|
+
paymentProviderId,
|
|
25
|
+
});
|
|
26
|
+
if (!provider) throw new PaymentProviderNotFoundError({ paymentProviderId });
|
|
29
27
|
|
|
30
|
-
|
|
28
|
+
await modules.payment.paymentProviders.delete(paymentProviderId);
|
|
31
29
|
|
|
32
30
|
return {
|
|
33
31
|
content: [
|
|
34
32
|
{
|
|
35
33
|
type: 'text' as const,
|
|
36
|
-
text: JSON.stringify({
|
|
34
|
+
text: JSON.stringify({ provider }),
|
|
37
35
|
},
|
|
38
36
|
],
|
|
39
37
|
};
|
|
@@ -3,11 +3,30 @@ import { Context } from '../../../context.js';
|
|
|
3
3
|
import { log } from '@unchainedshop/logger';
|
|
4
4
|
import { PaymentProviderNotFoundError } from '../../../errors.js';
|
|
5
5
|
|
|
6
|
+
const ConfigurationEntry = z.object({
|
|
7
|
+
key: z.string().min(1).describe('Configuration key'),
|
|
8
|
+
value: z.any().describe('Configuration value'),
|
|
9
|
+
});
|
|
10
|
+
|
|
6
11
|
export const UpdatePaymentProviderSchema = {
|
|
7
12
|
paymentProviderId: z.string().min(1).describe('ID of the payment provider to update'),
|
|
8
|
-
paymentProvider: z
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
paymentProvider: z
|
|
14
|
+
.object({
|
|
15
|
+
configuration: z
|
|
16
|
+
.array(ConfigurationEntry)
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('List of key-value configuration entries'),
|
|
19
|
+
})
|
|
20
|
+
.refine(
|
|
21
|
+
(data) => {
|
|
22
|
+
const keys = data.configuration?.map((entry) => entry.key) || [];
|
|
23
|
+
return new Set(keys).size === keys.length;
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
message: 'Duplicate keys are not allowed in configuration.',
|
|
27
|
+
path: ['configuration'],
|
|
28
|
+
},
|
|
29
|
+
),
|
|
11
30
|
};
|
|
12
31
|
|
|
13
32
|
export const UpdatePaymentProviderZodSchema = z.object(UpdatePaymentProviderSchema);
|
|
@@ -39,7 +58,7 @@ export async function updatePaymentProviderHandler(
|
|
|
39
58
|
content: [
|
|
40
59
|
{
|
|
41
60
|
type: 'text' as const,
|
|
42
|
-
text: JSON.stringify({
|
|
61
|
+
text: JSON.stringify({ provider: updated }),
|
|
43
62
|
},
|
|
44
63
|
],
|
|
45
64
|
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
import { log } from '@unchainedshop/logger';
|
|
4
|
+
import { WarehousingDirector } from '@unchainedshop/core';
|
|
5
|
+
import { ProviderConfigurationInvalid } from '../../../errors.js';
|
|
6
|
+
|
|
7
|
+
const WarehousingProviderTypeEnum = z.enum(['PHYSICAL', 'VIRTUAL']);
|
|
8
|
+
|
|
9
|
+
export const CreateWarehousingProviderSchema = {
|
|
10
|
+
warehousingProvider: z.object({
|
|
11
|
+
type: WarehousingProviderTypeEnum.describe('Type of the warehousing provider'),
|
|
12
|
+
adapterKey: z
|
|
13
|
+
.string()
|
|
14
|
+
.min(1)
|
|
15
|
+
.describe(
|
|
16
|
+
'Adapter key for the warehousing provider, it should be a valid interface key found in warehousing interfaces',
|
|
17
|
+
),
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const CreateWarehousingProviderZodSchema = z.object(CreateWarehousingProviderSchema);
|
|
22
|
+
export type CreateWarehousingProviderParams = z.infer<typeof CreateWarehousingProviderZodSchema>;
|
|
23
|
+
|
|
24
|
+
export async function createWarehousingProviderHandler(
|
|
25
|
+
context: Context,
|
|
26
|
+
params: CreateWarehousingProviderParams,
|
|
27
|
+
) {
|
|
28
|
+
const { modules, userId } = context;
|
|
29
|
+
const { warehousingProvider } = params;
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
log('handler createWarehousingProviderHandler', { userId, warehousingProvider });
|
|
33
|
+
|
|
34
|
+
const Adapter = WarehousingDirector.getAdapter(warehousingProvider.adapterKey);
|
|
35
|
+
|
|
36
|
+
const provider = await modules.warehousing.create({
|
|
37
|
+
configuration: Adapter.initialConfiguration,
|
|
38
|
+
...warehousingProvider,
|
|
39
|
+
} as any);
|
|
40
|
+
|
|
41
|
+
if (!provider) throw new ProviderConfigurationInvalid(warehousingProvider);
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
content: [
|
|
45
|
+
{
|
|
46
|
+
type: 'text' as const,
|
|
47
|
+
text: JSON.stringify({ provider }),
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
} catch (error) {
|
|
52
|
+
return {
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: 'text' as const,
|
|
56
|
+
text: `Error creating warehousing provider: ${(error as Error).message}`,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
import {
|
|
4
|
+
warehousingProvidersListHandler,
|
|
5
|
+
WarehousingProvidersListSchema,
|
|
6
|
+
} from './warehousingProvidersListHandler.js';
|
|
7
|
+
import {
|
|
8
|
+
warehousingProvidersCountHandler,
|
|
9
|
+
WarehousingProvidersCountSchema,
|
|
10
|
+
} from './warehousingProvidersCountHandler.js';
|
|
11
|
+
import {
|
|
12
|
+
WarehousingProviderByIdSchema,
|
|
13
|
+
warehousingProviderHandler,
|
|
14
|
+
} from './warehousingProviderHandler.js';
|
|
15
|
+
import {
|
|
16
|
+
warehousingInterfacesHandler,
|
|
17
|
+
WarehousingInterfacesSchema,
|
|
18
|
+
} from './warehousingInterfacesHandler.js';
|
|
19
|
+
import {
|
|
20
|
+
createWarehousingProviderHandler,
|
|
21
|
+
CreateWarehousingProviderSchema,
|
|
22
|
+
} from './createWarehousingProviderHandler.js';
|
|
23
|
+
import {
|
|
24
|
+
updateWarehousingProviderHandler,
|
|
25
|
+
UpdateWarehousingProviderSchema,
|
|
26
|
+
} from './updateWarehousingProviderHandler.js';
|
|
27
|
+
import {
|
|
28
|
+
removeWarehousingProviderHandler,
|
|
29
|
+
RemoveWarehousingProviderSchema,
|
|
30
|
+
} from './removeWarehousingProviderHandler.js';
|
|
31
|
+
|
|
32
|
+
export const registerWarehousingProviderTools = (server: McpServer, context: Context) => {
|
|
33
|
+
server.tool(
|
|
34
|
+
'warehousingProviders_list',
|
|
35
|
+
'Get all warehousing providers, optionally filtered by type.',
|
|
36
|
+
WarehousingProvidersListSchema,
|
|
37
|
+
async (params) => warehousingProvidersListHandler(context, params),
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
server.tool(
|
|
41
|
+
'warehousingProviders_count',
|
|
42
|
+
'Returns total number of warehousing providers, optionally filtered by type.',
|
|
43
|
+
WarehousingProvidersCountSchema,
|
|
44
|
+
async (params) => warehousingProvidersCountHandler(context, params),
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
server.tool(
|
|
48
|
+
'warehousingProvider_get',
|
|
49
|
+
'Get a specific warehousing provider by ID.',
|
|
50
|
+
WarehousingProviderByIdSchema,
|
|
51
|
+
async (params) => warehousingProviderHandler(context, params),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
server.tool(
|
|
55
|
+
'warehousingInterfaces_list',
|
|
56
|
+
'Get all warehousing interfaces filtered by type.',
|
|
57
|
+
WarehousingInterfacesSchema,
|
|
58
|
+
async (params) => warehousingInterfacesHandler(context, params),
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
server.tool(
|
|
62
|
+
'warehousingProvider_add',
|
|
63
|
+
'Creates new warehousing provider.',
|
|
64
|
+
CreateWarehousingProviderSchema,
|
|
65
|
+
async (params) => createWarehousingProviderHandler(context, params),
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
server.tool(
|
|
69
|
+
'warehousingProvider_update',
|
|
70
|
+
'Updates warehousing provider information with the provided ID.',
|
|
71
|
+
UpdateWarehousingProviderSchema,
|
|
72
|
+
async (params) => updateWarehousingProviderHandler(context, params),
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
server.tool(
|
|
76
|
+
'warehousingProvider_remove',
|
|
77
|
+
'Soft deletes a warehousing provider by setting its deleted timestamp.',
|
|
78
|
+
RemoveWarehousingProviderSchema,
|
|
79
|
+
async (params) => removeWarehousingProviderHandler(context, params),
|
|
80
|
+
);
|
|
81
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
import { log } from '@unchainedshop/logger';
|
|
4
|
+
import { WarehousingProviderNotFoundError } from '../../../errors.js';
|
|
5
|
+
|
|
6
|
+
export const RemoveWarehousingProviderSchema = {
|
|
7
|
+
warehousingProviderId: z.string().min(1).describe('ID of the warehousing provider to soft delete'),
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const RemoveWarehousingProviderZodSchema = z.object(RemoveWarehousingProviderSchema);
|
|
11
|
+
export type RemoveWarehousingProviderParams = z.infer<typeof RemoveWarehousingProviderZodSchema>;
|
|
12
|
+
export async function removeWarehousingProviderHandler(
|
|
13
|
+
context: Context,
|
|
14
|
+
params: RemoveWarehousingProviderParams,
|
|
15
|
+
) {
|
|
16
|
+
const { modules, userId } = context;
|
|
17
|
+
const { warehousingProviderId } = params;
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
log('handler removeWarehousingProviderHandler', { userId, warehousingProviderId });
|
|
21
|
+
const provider = await modules.warehousing.findProvider({
|
|
22
|
+
warehousingProviderId,
|
|
23
|
+
});
|
|
24
|
+
if (!provider) throw new WarehousingProviderNotFoundError({ warehousingProviderId });
|
|
25
|
+
|
|
26
|
+
await modules.warehousing.delete(warehousingProviderId);
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
content: [
|
|
30
|
+
{
|
|
31
|
+
type: 'text' as const,
|
|
32
|
+
text: JSON.stringify({ provider }),
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
} catch (error) {
|
|
37
|
+
return {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text' as const,
|
|
41
|
+
text: `Error removing warehousing provider: ${(error as Error).message}`,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
import { log } from '@unchainedshop/logger';
|
|
4
|
+
import { WarehousingProviderNotFoundError } from '../../../errors.js';
|
|
5
|
+
|
|
6
|
+
const ConfigurationEntry = z.object({
|
|
7
|
+
key: z.string().min(1).describe('Configuration key'),
|
|
8
|
+
value: z.any().describe('Configuration value'),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export const UpdateWarehousingProviderSchema = {
|
|
12
|
+
warehousingProviderId: z.string().min(1).describe('ID of the warehousing provider to update'),
|
|
13
|
+
warehousingProvider: z
|
|
14
|
+
.object({
|
|
15
|
+
configuration: z
|
|
16
|
+
.array(ConfigurationEntry)
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('List of key-value configuration entries'),
|
|
19
|
+
})
|
|
20
|
+
.refine(
|
|
21
|
+
(data) => {
|
|
22
|
+
const keys = data.configuration?.map((entry) => entry.key) || [];
|
|
23
|
+
return new Set(keys).size === keys.length;
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
message: 'Duplicate keys are not allowed in configuration.',
|
|
27
|
+
path: ['configuration'],
|
|
28
|
+
},
|
|
29
|
+
),
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const UpdateWarehousingProviderZodSchema = z.object(UpdateWarehousingProviderSchema);
|
|
33
|
+
export type UpdateWarehousingProviderParams = z.infer<typeof UpdateWarehousingProviderZodSchema>;
|
|
34
|
+
|
|
35
|
+
export async function updateWarehousingProviderHandler(
|
|
36
|
+
context: Context,
|
|
37
|
+
params: UpdateWarehousingProviderParams,
|
|
38
|
+
) {
|
|
39
|
+
const { modules, userId } = context;
|
|
40
|
+
const { warehousingProviderId, warehousingProvider } = params;
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
log('handler updateWarehousingProviderHandler', {
|
|
44
|
+
userId,
|
|
45
|
+
warehousingProviderId,
|
|
46
|
+
warehousingProvider,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
if (!(await modules.warehousing.providerExists({ warehousingProviderId })))
|
|
50
|
+
throw new WarehousingProviderNotFoundError({ warehousingProviderId });
|
|
51
|
+
|
|
52
|
+
const provider = await modules.warehousing.update(warehousingProviderId, warehousingProvider as any);
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
content: [
|
|
56
|
+
{
|
|
57
|
+
type: 'text' as const,
|
|
58
|
+
text: JSON.stringify({ provider }),
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
} catch (error) {
|
|
63
|
+
return {
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: 'text' as const,
|
|
67
|
+
text: `Error updating warehousing provider: ${(error as Error).message}`,
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
import { log } from '@unchainedshop/logger';
|
|
4
|
+
import { WarehousingDirector } from '@unchainedshop/core';
|
|
5
|
+
import { WarehousingProviderType } from '@unchainedshop/core-warehousing';
|
|
6
|
+
|
|
7
|
+
const WarehousingProviderTypeEnum = z
|
|
8
|
+
.enum(['PHYSICAL', 'VIRTUAL'])
|
|
9
|
+
.describe('Warehousing provider type');
|
|
10
|
+
|
|
11
|
+
export const WarehousingInterfacesSchema = {
|
|
12
|
+
type: WarehousingProviderTypeEnum.optional().describe('Optional filter by warehousing provider type'),
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const WarehousingInterfacesZodSchema = z.object(WarehousingInterfacesSchema);
|
|
16
|
+
export type WarehousingInterfacesParams = z.infer<typeof WarehousingInterfacesZodSchema>;
|
|
17
|
+
|
|
18
|
+
export async function warehousingInterfacesHandler(
|
|
19
|
+
context: Context,
|
|
20
|
+
params: WarehousingInterfacesParams,
|
|
21
|
+
) {
|
|
22
|
+
const { userId } = context;
|
|
23
|
+
const { type } = params;
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
log('handler warehousingInterfacesHandler', { userId, type });
|
|
27
|
+
|
|
28
|
+
const allAdapters = await WarehousingDirector.getAdapters();
|
|
29
|
+
|
|
30
|
+
const filteredAdapters = type
|
|
31
|
+
? allAdapters.filter((Adapter) => Adapter.typeSupported(type as WarehousingProviderType))
|
|
32
|
+
: allAdapters;
|
|
33
|
+
|
|
34
|
+
const interfaces = filteredAdapters.map((Adapter) => ({
|
|
35
|
+
_id: Adapter.key,
|
|
36
|
+
label: Adapter.label,
|
|
37
|
+
version: Adapter.version,
|
|
38
|
+
}));
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
content: [
|
|
42
|
+
{
|
|
43
|
+
type: 'text' as const,
|
|
44
|
+
text: JSON.stringify({ interfaces }),
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
} catch (error) {
|
|
49
|
+
return {
|
|
50
|
+
content: [
|
|
51
|
+
{
|
|
52
|
+
type: 'text' as const,
|
|
53
|
+
text: `Error fetching warehousing interfaces: ${(error as Error).message}`,
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|