@unchainedshop/api 4.0.0-rc.10 → 4.0.0-rc.12
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 +114 -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/delivery/deliveryInterfaces.d.ts +2 -2
- package/lib/resolvers/queries/delivery/deliveryInterfaces.d.ts.map +1 -1
- package/lib/resolvers/queries/delivery/deliveryInterfaces.js +6 -4
- package/lib/resolvers/queries/delivery/deliveryInterfaces.js.map +1 -1
- package/lib/resolvers/queries/orders/orders.d.ts.map +1 -1
- package/lib/resolvers/queries/orders/orders.js +21 -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 +17 -1
- package/lib/resolvers/queries/orders/ordersCount.js.map +1 -1
- package/lib/resolvers/queries/payment/paymentInterfaces.d.ts.map +1 -1
- package/lib/resolvers/queries/payment/paymentInterfaces.js +5 -3
- package/lib/resolvers/queries/payment/paymentInterfaces.js.map +1 -1
- package/lib/resolvers/queries/warehousing/warehousingInterfaces.d.ts.map +1 -1
- package/lib/resolvers/queries/warehousing/warehousingInterfaces.js +5 -3
- package/lib/resolvers/queries/warehousing/warehousingInterfaces.js.map +1 -1
- package/lib/schema/query.d.ts.map +1 -1
- package/lib/schema/query.js +14 -4
- 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 +124 -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/delivery/deliveryInterfaces.ts +8 -4
- package/src/resolvers/queries/orders/orders.ts +25 -5
- package/src/resolvers/queries/orders/ordersCount.ts +21 -1
- package/src/resolvers/queries/payment/paymentInterfaces.ts +11 -7
- package/src/resolvers/queries/warehousing/warehousingInterfaces.ts +5 -3
- package/src/schema/query.ts +14 -4
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
import { log } from '@unchainedshop/logger';
|
|
4
|
+
import { getNormalizedProductDetails } from '../../utils/getNormalizedProductDetails.js';
|
|
5
|
+
import { OrderStatus } from '@unchainedshop/core-orders';
|
|
6
|
+
import { resolveDateRange } from '../../utils/orderFilters.js';
|
|
7
|
+
|
|
8
|
+
export const TopSellingProductsSchema = {
|
|
9
|
+
from: z.string().datetime().optional().describe('Start date (ISO format)'),
|
|
10
|
+
to: z.string().datetime().optional().describe('End date (ISO format)'),
|
|
11
|
+
limit: z.number().int().min(1).max(100).optional().default(10),
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export const TopSellingProductsZodSchema = z.object(TopSellingProductsSchema);
|
|
15
|
+
export type TopSellingProductsParams = z.infer<typeof TopSellingProductsZodSchema>;
|
|
16
|
+
|
|
17
|
+
export async function getTopSellingProductsHandler(context: Context, params: TopSellingProductsParams) {
|
|
18
|
+
const { modules, userId } = context;
|
|
19
|
+
const { from, to, limit } = params;
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
log('handler getTopSellingProductsHandler', { userId, params });
|
|
23
|
+
|
|
24
|
+
const match: any = {};
|
|
25
|
+
|
|
26
|
+
const { startDate, endDate } = resolveDateRange(from, to);
|
|
27
|
+
|
|
28
|
+
const orders = await modules.orders.findOrders(
|
|
29
|
+
{
|
|
30
|
+
status: [OrderStatus.CONFIRMED, OrderStatus.FULLFILLED],
|
|
31
|
+
dateRange: { start: startDate.toISOString(), end: endDate.toISOString() },
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
projection: {
|
|
35
|
+
_id: 1,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
);
|
|
39
|
+
const orderIds = orders.map(({ _id }) => _id);
|
|
40
|
+
|
|
41
|
+
if (startDate) match.created = { ...(match.created || {}), $gte: startDate };
|
|
42
|
+
if (endDate) match.created = { ...(match.created || {}), $lte: endDate };
|
|
43
|
+
if (orderIds?.length) match.orderId = { $in: orderIds };
|
|
44
|
+
|
|
45
|
+
const topProducts = await modules.orders.positions.aggregatePositions({
|
|
46
|
+
match,
|
|
47
|
+
project: {
|
|
48
|
+
productId: 1,
|
|
49
|
+
quantity: 1,
|
|
50
|
+
itemAmount: {
|
|
51
|
+
$let: {
|
|
52
|
+
vars: {
|
|
53
|
+
item: {
|
|
54
|
+
$first: {
|
|
55
|
+
$filter: {
|
|
56
|
+
input: '$calculation',
|
|
57
|
+
as: 'c',
|
|
58
|
+
cond: { $eq: ['$$c.category', 'ITEM'] },
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
in: '$$item.amount',
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
group: {
|
|
68
|
+
_id: '$productId',
|
|
69
|
+
totalSold: { $sum: '$quantity' },
|
|
70
|
+
totalRevenue: { $sum: '$itemAmount' },
|
|
71
|
+
},
|
|
72
|
+
sort: { totalSold: -1 },
|
|
73
|
+
limit,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const normalizedTopSellingProducts = await Promise.all(
|
|
77
|
+
topProducts.map(async (p) => {
|
|
78
|
+
const product = await getNormalizedProductDetails(p._id, context);
|
|
79
|
+
return {
|
|
80
|
+
productId: p._id?.toString?.() ?? null,
|
|
81
|
+
product,
|
|
82
|
+
totalSold: p.totalSold,
|
|
83
|
+
totalRevenue: p.totalRevenue,
|
|
84
|
+
};
|
|
85
|
+
}),
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
content: [
|
|
90
|
+
{
|
|
91
|
+
type: 'text' as const,
|
|
92
|
+
text: JSON.stringify({
|
|
93
|
+
products: normalizedTopSellingProducts,
|
|
94
|
+
dateRange: {
|
|
95
|
+
start: from ? new Date(from).toISOString() : null,
|
|
96
|
+
end: to ? new Date(to).toISOString() : null,
|
|
97
|
+
},
|
|
98
|
+
}),
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
};
|
|
102
|
+
} catch (error) {
|
|
103
|
+
return {
|
|
104
|
+
content: [
|
|
105
|
+
{
|
|
106
|
+
type: 'text' as const,
|
|
107
|
+
text: `Error fetching top-selling products: ${(error as Error).message}`,
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { Context } from '../../../context.js';
|
|
3
|
+
import { ordersListHandler, OrdersListSchema } from './ordersListHandler.js';
|
|
4
|
+
import { getSalesSummaryHandler, SalesSummarySchema } from './getSalesSummaryHandler.js';
|
|
5
|
+
import {
|
|
6
|
+
getMonthlySalesBreakdownHandler,
|
|
7
|
+
MonthlySalesBreakdownSchema,
|
|
8
|
+
} from './getMonthlySalesBreakdownHandler.js';
|
|
9
|
+
import { getTopCustomersHandler, GetTopCustomersSchema } from './getTopCustomersHandler.js';
|
|
10
|
+
import {
|
|
11
|
+
getTopSellingProductsHandler,
|
|
12
|
+
TopSellingProductsSchema,
|
|
13
|
+
} from './getTopSellingProductsHandler.js';
|
|
14
|
+
|
|
15
|
+
export const registerOrderTools = (server: McpServer, context: Context) => {
|
|
16
|
+
server.tool(
|
|
17
|
+
'orders_list',
|
|
18
|
+
'Get all orders, filtered and sorted. Supports pagination, status filters, provider types, and date range.',
|
|
19
|
+
OrdersListSchema,
|
|
20
|
+
async (params) => ordersListHandler(context, params),
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
server.tool(
|
|
24
|
+
'ordersSales_summary',
|
|
25
|
+
'Get aggregate sales analytics including total revenue, order count, average order value, and daily breakdown over a time range.',
|
|
26
|
+
SalesSummarySchema,
|
|
27
|
+
async (params) => getSalesSummaryHandler(context, params),
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
server.tool(
|
|
31
|
+
'ordersSales_monthlyBreakdown',
|
|
32
|
+
'Break down total sales by month. Supports filtering by status and provider IDs, with optional custom date range.',
|
|
33
|
+
MonthlySalesBreakdownSchema,
|
|
34
|
+
async (params) => getMonthlySalesBreakdownHandler(context, params),
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
server.tool(
|
|
38
|
+
'orders_topCustomers',
|
|
39
|
+
'Get top customers by total amount spent, with optional date and status filters.',
|
|
40
|
+
GetTopCustomersSchema,
|
|
41
|
+
async (params) => getTopCustomersHandler(context, params),
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
server.tool(
|
|
45
|
+
'topSelling_products',
|
|
46
|
+
'Get top-selling products by quantity and revenue within an optional date range.',
|
|
47
|
+
TopSellingProductsSchema,
|
|
48
|
+
(params) => getTopSellingProductsHandler(context, params),
|
|
49
|
+
);
|
|
50
|
+
};
|
|
@@ -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
|
+
}
|