@contractspec/example.marketplace 0.0.0-canary-20260113170453
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +141 -0
- package/dist/docs/index.d.ts +1 -0
- package/dist/docs/index.js +1 -0
- package/dist/docs/marketplace.docblock.d.ts +1 -0
- package/dist/docs/marketplace.docblock.js +115 -0
- package/dist/docs/marketplace.docblock.js.map +1 -0
- package/dist/entities/index.d.ts +309 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +46 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/order.d.ts +105 -0
- package/dist/entities/order.d.ts.map +1 -0
- package/dist/entities/order.js +173 -0
- package/dist/entities/order.js.map +1 -0
- package/dist/entities/payout.d.ts +92 -0
- package/dist/entities/payout.d.ts.map +1 -0
- package/dist/entities/payout.js +162 -0
- package/dist/entities/payout.js.map +1 -0
- package/dist/entities/product.d.ts +93 -0
- package/dist/entities/product.d.ts.map +1 -0
- package/dist/entities/product.js +161 -0
- package/dist/entities/product.js.map +1 -0
- package/dist/entities/review.d.ts +83 -0
- package/dist/entities/review.d.ts.map +1 -0
- package/dist/entities/review.js +152 -0
- package/dist/entities/review.js.map +1 -0
- package/dist/entities/store.d.ts +60 -0
- package/dist/entities/store.d.ts.map +1 -0
- package/dist/entities/store.js +110 -0
- package/dist/entities/store.js.map +1 -0
- package/dist/example.d.ts +7 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/example.js +58 -0
- package/dist/example.js.map +1 -0
- package/dist/handlers/index.d.ts +2 -0
- package/dist/handlers/index.js +3 -0
- package/dist/handlers/marketplace.handlers.d.ts +155 -0
- package/dist/handlers/marketplace.handlers.d.ts.map +1 -0
- package/dist/handlers/marketplace.handlers.js +329 -0
- package/dist/handlers/marketplace.handlers.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +32 -0
- package/dist/marketplace.capability.d.ts +9 -0
- package/dist/marketplace.capability.d.ts.map +1 -0
- package/dist/marketplace.capability.js +34 -0
- package/dist/marketplace.capability.js.map +1 -0
- package/dist/marketplace.feature.d.ts +12 -0
- package/dist/marketplace.feature.d.ts.map +1 -0
- package/dist/marketplace.feature.js +315 -0
- package/dist/marketplace.feature.js.map +1 -0
- package/dist/order/index.d.ts +5 -0
- package/dist/order/index.js +6 -0
- package/dist/order/order.enum.d.ts +10 -0
- package/dist/order/order.enum.d.ts.map +1 -0
- package/dist/order/order.enum.js +22 -0
- package/dist/order/order.enum.js.map +1 -0
- package/dist/order/order.event.d.ts +145 -0
- package/dist/order/order.event.d.ts.map +1 -0
- package/dist/order/order.event.js +216 -0
- package/dist/order/order.event.js.map +1 -0
- package/dist/order/order.operations.d.ts +368 -0
- package/dist/order/order.operations.d.ts.map +1 -0
- package/dist/order/order.operations.js +119 -0
- package/dist/order/order.operations.js.map +1 -0
- package/dist/order/order.presentation.d.ts +9 -0
- package/dist/order/order.presentation.d.ts.map +1 -0
- package/dist/order/order.presentation.js +86 -0
- package/dist/order/order.presentation.js.map +1 -0
- package/dist/order/order.schema.d.ts +165 -0
- package/dist/order/order.schema.d.ts.map +1 -0
- package/dist/order/order.schema.js +155 -0
- package/dist/order/order.schema.js.map +1 -0
- package/dist/payout/index.d.ts +5 -0
- package/dist/payout/index.js +6 -0
- package/dist/payout/payout.enum.d.ts +10 -0
- package/dist/payout/payout.enum.d.ts.map +1 -0
- package/dist/payout/payout.enum.js +17 -0
- package/dist/payout/payout.enum.js.map +1 -0
- package/dist/payout/payout.event.d.ts +63 -0
- package/dist/payout/payout.event.d.ts.map +1 -0
- package/dist/payout/payout.event.js +92 -0
- package/dist/payout/payout.event.js.map +1 -0
- package/dist/payout/payout.operations.d.ts +97 -0
- package/dist/payout/payout.operations.d.ts.map +1 -0
- package/dist/payout/payout.operations.js +53 -0
- package/dist/payout/payout.operations.js.map +1 -0
- package/dist/payout/payout.presentation.d.ts +8 -0
- package/dist/payout/payout.presentation.d.ts.map +1 -0
- package/dist/payout/payout.presentation.js +60 -0
- package/dist/payout/payout.presentation.js.map +1 -0
- package/dist/payout/payout.schema.d.ts +157 -0
- package/dist/payout/payout.schema.d.ts.map +1 -0
- package/dist/payout/payout.schema.js +116 -0
- package/dist/payout/payout.schema.js.map +1 -0
- package/dist/product/index.d.ts +5 -0
- package/dist/product/index.js +6 -0
- package/dist/product/product.enum.d.ts +10 -0
- package/dist/product/product.enum.d.ts.map +1 -0
- package/dist/product/product.enum.js +18 -0
- package/dist/product/product.enum.js.map +1 -0
- package/dist/product/product.event.d.ts +73 -0
- package/dist/product/product.event.d.ts.map +1 -0
- package/dist/product/product.event.js +120 -0
- package/dist/product/product.event.js.map +1 -0
- package/dist/product/product.operations.d.ts +273 -0
- package/dist/product/product.operations.d.ts.map +1 -0
- package/dist/product/product.operations.js +108 -0
- package/dist/product/product.operations.js.map +1 -0
- package/dist/product/product.presentation.d.ts +9 -0
- package/dist/product/product.presentation.d.ts.map +1 -0
- package/dist/product/product.presentation.js +86 -0
- package/dist/product/product.presentation.js.map +1 -0
- package/dist/product/product.schema.d.ts +218 -0
- package/dist/product/product.schema.d.ts.map +1 -0
- package/dist/product/product.schema.js +176 -0
- package/dist/product/product.schema.js.map +1 -0
- package/dist/review/index.d.ts +5 -0
- package/dist/review/index.js +6 -0
- package/dist/review/review.enum.d.ts +10 -0
- package/dist/review/review.enum.d.ts.map +1 -0
- package/dist/review/review.enum.js +16 -0
- package/dist/review/review.enum.js.map +1 -0
- package/dist/review/review.event.d.ts +55 -0
- package/dist/review/review.event.d.ts.map +1 -0
- package/dist/review/review.event.js +84 -0
- package/dist/review/review.event.js.map +1 -0
- package/dist/review/review.operations.d.ts +237 -0
- package/dist/review/review.operations.d.ts.map +1 -0
- package/dist/review/review.operations.js +106 -0
- package/dist/review/review.operations.js.map +1 -0
- package/dist/review/review.presentation.d.ts +8 -0
- package/dist/review/review.presentation.d.ts.map +1 -0
- package/dist/review/review.presentation.js +60 -0
- package/dist/review/review.presentation.js.map +1 -0
- package/dist/review/review.schema.d.ts +190 -0
- package/dist/review/review.schema.d.ts.map +1 -0
- package/dist/review/review.schema.js +156 -0
- package/dist/review/review.schema.js.map +1 -0
- package/dist/seeders/index.d.ts +10 -0
- package/dist/seeders/index.d.ts.map +1 -0
- package/dist/seeders/index.js +18 -0
- package/dist/seeders/index.js.map +1 -0
- package/dist/store/index.d.ts +5 -0
- package/dist/store/index.js +6 -0
- package/dist/store/store.enum.d.ts +10 -0
- package/dist/store/store.enum.d.ts.map +1 -0
- package/dist/store/store.enum.js +16 -0
- package/dist/store/store.enum.js.map +1 -0
- package/dist/store/store.event.d.ts +51 -0
- package/dist/store/store.event.d.ts.map +1 -0
- package/dist/store/store.event.js +80 -0
- package/dist/store/store.event.js.map +1 -0
- package/dist/store/store.operations.d.ts +131 -0
- package/dist/store/store.operations.d.ts.map +1 -0
- package/dist/store/store.operations.js +61 -0
- package/dist/store/store.operations.js.map +1 -0
- package/dist/store/store.presentation.d.ts +8 -0
- package/dist/store/store.presentation.d.ts.map +1 -0
- package/dist/store/store.presentation.js +60 -0
- package/dist/store/store.presentation.js.map +1 -0
- package/dist/store/store.schema.d.ts +84 -0
- package/dist/store/store.schema.d.ts.map +1 -0
- package/dist/store/store.schema.js +93 -0
- package/dist/store/store.schema.js.map +1 -0
- package/dist/tests/operations.test-spec.d.ts +11 -0
- package/dist/tests/operations.test-spec.d.ts.map +1 -0
- package/dist/tests/operations.test-spec.js +152 -0
- package/dist/tests/operations.test-spec.js.map +1 -0
- package/dist/ui/MarketplaceDashboard.d.ts +7 -0
- package/dist/ui/MarketplaceDashboard.d.ts.map +1 -0
- package/dist/ui/MarketplaceDashboard.js +319 -0
- package/dist/ui/MarketplaceDashboard.js.map +1 -0
- package/dist/ui/hooks/index.d.ts +2 -0
- package/dist/ui/hooks/index.js +5 -0
- package/dist/ui/hooks/useMarketplaceData.d.ts +23 -0
- package/dist/ui/hooks/useMarketplaceData.d.ts.map +1 -0
- package/dist/ui/hooks/useMarketplaceData.js +64 -0
- package/dist/ui/hooks/useMarketplaceData.js.map +1 -0
- package/dist/ui/index.d.ts +6 -0
- package/dist/ui/index.js +6 -0
- package/dist/ui/renderers/index.d.ts +2 -0
- package/dist/ui/renderers/index.js +3 -0
- package/dist/ui/renderers/marketplace.markdown.d.ts +28 -0
- package/dist/ui/renderers/marketplace.markdown.d.ts.map +1 -0
- package/dist/ui/renderers/marketplace.markdown.js +244 -0
- package/dist/ui/renderers/marketplace.markdown.js.map +1 -0
- package/package.json +149 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { web } from "@contractspec/lib.runtime-sandbox";
|
|
2
|
+
|
|
3
|
+
//#region src/handlers/marketplace.handlers.ts
|
|
4
|
+
const { generateId } = web;
|
|
5
|
+
function rowToStore(row) {
|
|
6
|
+
return {
|
|
7
|
+
id: row.id,
|
|
8
|
+
projectId: row.projectId,
|
|
9
|
+
organizationId: row.organizationId,
|
|
10
|
+
name: row.name,
|
|
11
|
+
description: row.description ?? void 0,
|
|
12
|
+
status: row.status,
|
|
13
|
+
rating: row.rating,
|
|
14
|
+
reviewCount: row.reviewCount,
|
|
15
|
+
createdAt: new Date(row.createdAt),
|
|
16
|
+
updatedAt: new Date(row.updatedAt)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function rowToProduct(row) {
|
|
20
|
+
return {
|
|
21
|
+
id: row.id,
|
|
22
|
+
storeId: row.storeId,
|
|
23
|
+
name: row.name,
|
|
24
|
+
description: row.description ?? void 0,
|
|
25
|
+
price: row.price,
|
|
26
|
+
currency: row.currency,
|
|
27
|
+
status: row.status,
|
|
28
|
+
stock: row.stock,
|
|
29
|
+
category: row.category ?? void 0,
|
|
30
|
+
imageUrl: row.imageUrl ?? void 0,
|
|
31
|
+
createdAt: new Date(row.createdAt),
|
|
32
|
+
updatedAt: new Date(row.updatedAt)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function rowToOrder(row) {
|
|
36
|
+
return {
|
|
37
|
+
id: row.id,
|
|
38
|
+
projectId: row.projectId,
|
|
39
|
+
storeId: row.storeId,
|
|
40
|
+
customerId: row.customerId,
|
|
41
|
+
status: row.status,
|
|
42
|
+
total: row.total,
|
|
43
|
+
currency: row.currency,
|
|
44
|
+
shippingAddress: row.shippingAddress ?? void 0,
|
|
45
|
+
createdAt: new Date(row.createdAt),
|
|
46
|
+
updatedAt: new Date(row.updatedAt)
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function rowToOrderItem(row) {
|
|
50
|
+
return {
|
|
51
|
+
id: row.id,
|
|
52
|
+
orderId: row.orderId,
|
|
53
|
+
productId: row.productId,
|
|
54
|
+
quantity: row.quantity,
|
|
55
|
+
price: row.price,
|
|
56
|
+
createdAt: new Date(row.createdAt)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function rowToPayout(row) {
|
|
60
|
+
return {
|
|
61
|
+
id: row.id,
|
|
62
|
+
storeId: row.storeId,
|
|
63
|
+
amount: row.amount,
|
|
64
|
+
currency: row.currency,
|
|
65
|
+
status: row.status,
|
|
66
|
+
processedAt: row.processedAt ? new Date(row.processedAt) : void 0,
|
|
67
|
+
createdAt: new Date(row.createdAt)
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function rowToReview(row) {
|
|
71
|
+
return {
|
|
72
|
+
id: row.id,
|
|
73
|
+
productId: row.productId,
|
|
74
|
+
customerId: row.customerId,
|
|
75
|
+
orderId: row.orderId ?? void 0,
|
|
76
|
+
rating: row.rating,
|
|
77
|
+
comment: row.comment ?? void 0,
|
|
78
|
+
createdAt: new Date(row.createdAt)
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function createMarketplaceHandlers(db) {
|
|
82
|
+
/**
|
|
83
|
+
* List stores
|
|
84
|
+
*/
|
|
85
|
+
async function listStores(input) {
|
|
86
|
+
const { projectId, status, search, limit = 20, offset = 0 } = input;
|
|
87
|
+
let whereClause = "WHERE projectId = ?";
|
|
88
|
+
const params = [projectId];
|
|
89
|
+
if (status && status !== "all") {
|
|
90
|
+
whereClause += " AND status = ?";
|
|
91
|
+
params.push(status);
|
|
92
|
+
}
|
|
93
|
+
if (search) {
|
|
94
|
+
whereClause += " AND name LIKE ?";
|
|
95
|
+
params.push(`%${search}%`);
|
|
96
|
+
}
|
|
97
|
+
const total = (await db.query(`SELECT COUNT(*) as count FROM marketplace_store ${whereClause}`, params)).rows[0]?.count ?? 0;
|
|
98
|
+
return {
|
|
99
|
+
stores: (await db.query(`SELECT * FROM marketplace_store ${whereClause} ORDER BY rating DESC LIMIT ? OFFSET ?`, [
|
|
100
|
+
...params,
|
|
101
|
+
limit,
|
|
102
|
+
offset
|
|
103
|
+
])).rows.map(rowToStore),
|
|
104
|
+
total
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Create a store
|
|
109
|
+
*/
|
|
110
|
+
async function createStore(input, context) {
|
|
111
|
+
const id = generateId("store");
|
|
112
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
113
|
+
await db.execute(`INSERT INTO marketplace_store (id, projectId, organizationId, name, description, status, rating, reviewCount, createdAt, updatedAt)
|
|
114
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
115
|
+
id,
|
|
116
|
+
context.projectId,
|
|
117
|
+
context.organizationId,
|
|
118
|
+
input.name,
|
|
119
|
+
input.description ?? null,
|
|
120
|
+
"PENDING",
|
|
121
|
+
0,
|
|
122
|
+
0,
|
|
123
|
+
now,
|
|
124
|
+
now
|
|
125
|
+
]);
|
|
126
|
+
const rows = (await db.query(`SELECT * FROM marketplace_store WHERE id = ?`, [id])).rows;
|
|
127
|
+
return rowToStore(rows[0]);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* List products
|
|
131
|
+
*/
|
|
132
|
+
async function listProducts(input) {
|
|
133
|
+
const { storeId, status, category, search, limit = 20, offset = 0 } = input;
|
|
134
|
+
let whereClause = "WHERE 1=1";
|
|
135
|
+
const params = [];
|
|
136
|
+
if (storeId) {
|
|
137
|
+
whereClause += " AND storeId = ?";
|
|
138
|
+
params.push(storeId);
|
|
139
|
+
}
|
|
140
|
+
if (status && status !== "all") {
|
|
141
|
+
whereClause += " AND status = ?";
|
|
142
|
+
params.push(status);
|
|
143
|
+
}
|
|
144
|
+
if (category) {
|
|
145
|
+
whereClause += " AND category = ?";
|
|
146
|
+
params.push(category);
|
|
147
|
+
}
|
|
148
|
+
if (search) {
|
|
149
|
+
whereClause += " AND name LIKE ?";
|
|
150
|
+
params.push(`%${search}%`);
|
|
151
|
+
}
|
|
152
|
+
const total = (await db.query(`SELECT COUNT(*) as count FROM marketplace_product ${whereClause}`, params)).rows[0]?.count ?? 0;
|
|
153
|
+
return {
|
|
154
|
+
products: (await db.query(`SELECT * FROM marketplace_product ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`, [
|
|
155
|
+
...params,
|
|
156
|
+
limit,
|
|
157
|
+
offset
|
|
158
|
+
])).rows.map(rowToProduct),
|
|
159
|
+
total
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Add a product
|
|
164
|
+
*/
|
|
165
|
+
async function addProduct(input) {
|
|
166
|
+
const id = generateId("prod");
|
|
167
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
168
|
+
await db.execute(`INSERT INTO marketplace_product (id, storeId, name, description, price, currency, status, stock, category, imageUrl, createdAt, updatedAt)
|
|
169
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
170
|
+
id,
|
|
171
|
+
input.storeId,
|
|
172
|
+
input.name,
|
|
173
|
+
input.description ?? null,
|
|
174
|
+
input.price,
|
|
175
|
+
input.currency ?? "USD",
|
|
176
|
+
"DRAFT",
|
|
177
|
+
input.stock ?? 0,
|
|
178
|
+
input.category ?? null,
|
|
179
|
+
input.imageUrl ?? null,
|
|
180
|
+
now,
|
|
181
|
+
now
|
|
182
|
+
]);
|
|
183
|
+
const rows = (await db.query(`SELECT * FROM marketplace_product WHERE id = ?`, [id])).rows;
|
|
184
|
+
return rowToProduct(rows[0]);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* List orders
|
|
188
|
+
*/
|
|
189
|
+
async function listOrders(input) {
|
|
190
|
+
const { projectId, storeId, customerId, status, limit = 20, offset = 0 } = input;
|
|
191
|
+
let whereClause = "WHERE projectId = ?";
|
|
192
|
+
const params = [projectId];
|
|
193
|
+
if (storeId) {
|
|
194
|
+
whereClause += " AND storeId = ?";
|
|
195
|
+
params.push(storeId);
|
|
196
|
+
}
|
|
197
|
+
if (customerId) {
|
|
198
|
+
whereClause += " AND customerId = ?";
|
|
199
|
+
params.push(customerId);
|
|
200
|
+
}
|
|
201
|
+
if (status && status !== "all") {
|
|
202
|
+
whereClause += " AND status = ?";
|
|
203
|
+
params.push(status);
|
|
204
|
+
}
|
|
205
|
+
const total = (await db.query(`SELECT COUNT(*) as count FROM marketplace_order ${whereClause}`, params)).rows[0]?.count ?? 0;
|
|
206
|
+
const totalRevenue = (await db.query(`SELECT COALESCE(SUM(total), 0) as revenue FROM marketplace_order ${whereClause}`, params)).rows[0]?.revenue ?? 0;
|
|
207
|
+
return {
|
|
208
|
+
orders: (await db.query(`SELECT * FROM marketplace_order ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`, [
|
|
209
|
+
...params,
|
|
210
|
+
limit,
|
|
211
|
+
offset
|
|
212
|
+
])).rows.map(rowToOrder),
|
|
213
|
+
total,
|
|
214
|
+
totalRevenue
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Place an order
|
|
219
|
+
*/
|
|
220
|
+
async function placeOrder(input, context) {
|
|
221
|
+
const orderId = generateId("order");
|
|
222
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
223
|
+
let total = 0;
|
|
224
|
+
const itemsToCreate = [];
|
|
225
|
+
for (const item of input.items) {
|
|
226
|
+
const products = (await db.query(`SELECT * FROM marketplace_product WHERE id = ?`, [item.productId])).rows;
|
|
227
|
+
if (!products[0]) throw new Error(`Product not found: ${item.productId}`);
|
|
228
|
+
const itemPrice = products[0].price * item.quantity;
|
|
229
|
+
total += itemPrice;
|
|
230
|
+
itemsToCreate.push({
|
|
231
|
+
productId: item.productId,
|
|
232
|
+
quantity: item.quantity,
|
|
233
|
+
price: products[0].price
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
await db.execute(`INSERT INTO marketplace_order (id, projectId, storeId, customerId, status, total, currency, shippingAddress, createdAt, updatedAt)
|
|
237
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
238
|
+
orderId,
|
|
239
|
+
context.projectId,
|
|
240
|
+
input.storeId,
|
|
241
|
+
context.customerId,
|
|
242
|
+
"PENDING",
|
|
243
|
+
total,
|
|
244
|
+
"USD",
|
|
245
|
+
input.shippingAddress ?? null,
|
|
246
|
+
now,
|
|
247
|
+
now
|
|
248
|
+
]);
|
|
249
|
+
for (const item of itemsToCreate) await db.execute(`INSERT INTO marketplace_order_item (id, orderId, productId, quantity, price, createdAt)
|
|
250
|
+
VALUES (?, ?, ?, ?, ?, ?)`, [
|
|
251
|
+
generateId("orditem"),
|
|
252
|
+
orderId,
|
|
253
|
+
item.productId,
|
|
254
|
+
item.quantity,
|
|
255
|
+
item.price,
|
|
256
|
+
now
|
|
257
|
+
]);
|
|
258
|
+
const rows = (await db.query(`SELECT * FROM marketplace_order WHERE id = ?`, [orderId])).rows;
|
|
259
|
+
return rowToOrder(rows[0]);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get order items
|
|
263
|
+
*/
|
|
264
|
+
async function getOrderItems(orderId) {
|
|
265
|
+
return (await db.query(`SELECT * FROM marketplace_order_item WHERE orderId = ?`, [orderId])).rows.map(rowToOrderItem);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Update order status
|
|
269
|
+
*/
|
|
270
|
+
async function updateOrderStatus(orderId, status) {
|
|
271
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
272
|
+
await db.execute(`UPDATE marketplace_order SET status = ?, updatedAt = ? WHERE id = ?`, [
|
|
273
|
+
status,
|
|
274
|
+
now,
|
|
275
|
+
orderId
|
|
276
|
+
]);
|
|
277
|
+
const rows = (await db.query(`SELECT * FROM marketplace_order WHERE id = ?`, [orderId])).rows;
|
|
278
|
+
return rowToOrder(rows[0]);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* List payouts
|
|
282
|
+
*/
|
|
283
|
+
async function listPayouts(storeId) {
|
|
284
|
+
return (await db.query(`SELECT * FROM marketplace_payout WHERE storeId = ? ORDER BY createdAt DESC`, [storeId])).rows.map(rowToPayout);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* List reviews for a product
|
|
288
|
+
*/
|
|
289
|
+
async function listReviews(productId) {
|
|
290
|
+
return (await db.query(`SELECT * FROM marketplace_review WHERE productId = ? ORDER BY createdAt DESC`, [productId])).rows.map(rowToReview);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Submit a review
|
|
294
|
+
*/
|
|
295
|
+
async function submitReview(input) {
|
|
296
|
+
const id = generateId("review");
|
|
297
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
298
|
+
await db.execute(`INSERT INTO marketplace_review (id, productId, customerId, orderId, rating, comment, createdAt)
|
|
299
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
|
300
|
+
id,
|
|
301
|
+
input.productId,
|
|
302
|
+
input.customerId,
|
|
303
|
+
input.orderId ?? null,
|
|
304
|
+
input.rating,
|
|
305
|
+
input.comment ?? null,
|
|
306
|
+
now,
|
|
307
|
+
now
|
|
308
|
+
]);
|
|
309
|
+
const rows = (await db.query(`SELECT * FROM marketplace_review WHERE id = ?`, [id])).rows;
|
|
310
|
+
return rowToReview(rows[0]);
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
listStores,
|
|
314
|
+
createStore,
|
|
315
|
+
listProducts,
|
|
316
|
+
addProduct,
|
|
317
|
+
listOrders,
|
|
318
|
+
placeOrder,
|
|
319
|
+
getOrderItems,
|
|
320
|
+
updateOrderStatus,
|
|
321
|
+
listPayouts,
|
|
322
|
+
listReviews,
|
|
323
|
+
submitReview
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
//#endregion
|
|
328
|
+
export { createMarketplaceHandlers };
|
|
329
|
+
//# sourceMappingURL=marketplace.handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.handlers.js","names":[],"sources":["../../src/handlers/marketplace.handlers.ts"],"sourcesContent":["/**\n * Runtime-local Marketplace handlers\n *\n * Database-backed handlers for the marketplace template.\n */\nimport type { DatabasePort, DbRow } from '@contractspec/lib.runtime-sandbox';\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { web } from '@contractspec/lib.runtime-sandbox';\nconst { generateId } = web;\n\n// ============ Types ============\n\nexport interface Store {\n id: string;\n projectId: string;\n organizationId: string;\n name: string;\n description?: string;\n status: 'PENDING' | 'ACTIVE' | 'SUSPENDED';\n rating: number;\n reviewCount: number;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Product {\n id: string;\n storeId: string;\n name: string;\n description?: string;\n price: number;\n currency: string;\n status: 'DRAFT' | 'ACTIVE' | 'OUT_OF_STOCK' | 'ARCHIVED';\n stock: number;\n category?: string;\n imageUrl?: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Order {\n id: string;\n projectId: string;\n storeId: string;\n customerId: string;\n status:\n | 'PENDING'\n | 'CONFIRMED'\n | 'PROCESSING'\n | 'SHIPPED'\n | 'DELIVERED'\n | 'CANCELLED';\n total: number;\n currency: string;\n shippingAddress?: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface OrderItem {\n id: string;\n orderId: string;\n productId: string;\n quantity: number;\n price: number;\n createdAt: Date;\n}\n\nexport interface Payout {\n id: string;\n storeId: string;\n amount: number;\n currency: string;\n status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED';\n processedAt?: Date;\n createdAt: Date;\n}\n\nexport interface Review {\n id: string;\n productId: string;\n customerId: string;\n orderId?: string;\n rating: number;\n comment?: string;\n createdAt: Date;\n}\n\nexport interface CreateStoreInput {\n name: string;\n description?: string;\n}\n\nexport interface AddProductInput {\n storeId: string;\n name: string;\n description?: string;\n price: number;\n currency?: string;\n stock?: number;\n category?: string;\n imageUrl?: string;\n}\n\nexport interface PlaceOrderInput {\n storeId: string;\n items: { productId: string; quantity: number }[];\n shippingAddress?: string;\n}\n\nexport interface ListStoresInput {\n projectId: string;\n status?: 'PENDING' | 'ACTIVE' | 'SUSPENDED' | 'all';\n search?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface ListStoresOutput {\n stores: Store[];\n total: number;\n}\n\nexport interface ListProductsInput {\n storeId?: string;\n status?: 'DRAFT' | 'ACTIVE' | 'OUT_OF_STOCK' | 'ARCHIVED' | 'all';\n category?: string;\n search?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface ListProductsOutput {\n products: Product[];\n total: number;\n}\n\nexport interface ListOrdersInput {\n projectId: string;\n storeId?: string;\n customerId?: string;\n status?:\n | 'PENDING'\n | 'CONFIRMED'\n | 'PROCESSING'\n | 'SHIPPED'\n | 'DELIVERED'\n | 'CANCELLED'\n | 'all';\n limit?: number;\n offset?: number;\n}\n\nexport interface ListOrdersOutput {\n orders: Order[];\n total: number;\n totalRevenue: number;\n}\n\n// ============ Row Types ============\n\ninterface StoreRow {\n id: string;\n projectId: string;\n organizationId: string;\n name: string;\n description: string | null;\n status: string;\n rating: number;\n reviewCount: number;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface ProductRow {\n id: string;\n storeId: string;\n name: string;\n description: string | null;\n price: number;\n currency: string;\n status: string;\n stock: number;\n category: string | null;\n imageUrl: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface OrderRow {\n id: string;\n projectId: string;\n storeId: string;\n customerId: string;\n status: string;\n total: number;\n currency: string;\n shippingAddress: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface OrderItemRow {\n id: string;\n orderId: string;\n productId: string;\n quantity: number;\n price: number;\n createdAt: string;\n}\n\ninterface PayoutRow {\n id: string;\n storeId: string;\n amount: number;\n currency: string;\n status: string;\n processedAt: string | null;\n createdAt: string;\n}\n\ninterface ReviewRow {\n id: string;\n productId: string;\n customerId: string;\n orderId: string | null;\n rating: number;\n comment: string | null;\n createdAt: string;\n}\n\nfunction rowToStore(row: StoreRow): Store {\n return {\n id: row.id,\n projectId: row.projectId,\n organizationId: row.organizationId,\n name: row.name,\n description: row.description ?? undefined,\n status: row.status as Store['status'],\n rating: row.rating,\n reviewCount: row.reviewCount,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n}\n\nfunction rowToProduct(row: ProductRow): Product {\n return {\n id: row.id,\n storeId: row.storeId,\n name: row.name,\n description: row.description ?? undefined,\n price: row.price,\n currency: row.currency,\n status: row.status as Product['status'],\n stock: row.stock,\n category: row.category ?? undefined,\n imageUrl: row.imageUrl ?? undefined,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n}\n\nfunction rowToOrder(row: OrderRow): Order {\n return {\n id: row.id,\n projectId: row.projectId,\n storeId: row.storeId,\n customerId: row.customerId,\n status: row.status as Order['status'],\n total: row.total,\n currency: row.currency,\n shippingAddress: row.shippingAddress ?? undefined,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n}\n\nfunction rowToOrderItem(row: OrderItemRow): OrderItem {\n return {\n id: row.id,\n orderId: row.orderId,\n productId: row.productId,\n quantity: row.quantity,\n price: row.price,\n createdAt: new Date(row.createdAt),\n };\n}\n\nfunction rowToPayout(row: PayoutRow): Payout {\n return {\n id: row.id,\n storeId: row.storeId,\n amount: row.amount,\n currency: row.currency,\n status: row.status as Payout['status'],\n processedAt: row.processedAt ? new Date(row.processedAt) : undefined,\n createdAt: new Date(row.createdAt),\n };\n}\n\nfunction rowToReview(row: ReviewRow): Review {\n return {\n id: row.id,\n productId: row.productId,\n customerId: row.customerId,\n orderId: row.orderId ?? undefined,\n rating: row.rating,\n comment: row.comment ?? undefined,\n createdAt: new Date(row.createdAt),\n };\n}\n\n// ============ Handler Factory ============\n\nexport function createMarketplaceHandlers(db: DatabasePort) {\n /**\n * List stores\n */\n async function listStores(input: ListStoresInput): Promise<ListStoresOutput> {\n const { projectId, status, search, limit = 20, offset = 0 } = input;\n\n let whereClause = 'WHERE projectId = ?';\n const params: (string | number)[] = [projectId];\n\n if (status && status !== 'all') {\n whereClause += ' AND status = ?';\n params.push(status);\n }\n\n if (search) {\n whereClause += ' AND name LIKE ?';\n params.push(`%${search}%`);\n }\n\n const countResult = (\n await db.query(\n `SELECT COUNT(*) as count FROM marketplace_store ${whereClause}`,\n params\n )\n ).rows as DbRow[];\n const total = (countResult[0]?.count as number) ?? 0;\n\n const rows = (\n await db.query(\n `SELECT * FROM marketplace_store ${whereClause} ORDER BY rating DESC LIMIT ? OFFSET ?`,\n [...params, limit, offset]\n )\n ).rows as unknown as StoreRow[];\n\n return {\n stores: rows.map(rowToStore),\n total,\n };\n }\n\n /**\n * Create a store\n */\n async function createStore(\n input: CreateStoreInput,\n context: { projectId: string; organizationId: string }\n ): Promise<Store> {\n const id = generateId('store');\n const now = new Date().toISOString();\n\n await db.execute(\n `INSERT INTO marketplace_store (id, projectId, organizationId, name, description, status, rating, reviewCount, createdAt, updatedAt)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n context.projectId,\n context.organizationId,\n input.name,\n input.description ?? null,\n 'PENDING',\n 0,\n 0,\n now,\n now,\n ]\n );\n\n const rows = (\n await db.query(`SELECT * FROM marketplace_store WHERE id = ?`, [id])\n ).rows as unknown as StoreRow[];\n\n return rowToStore(rows[0]!);\n }\n\n /**\n * List products\n */\n async function listProducts(\n input: ListProductsInput\n ): Promise<ListProductsOutput> {\n const { storeId, status, category, search, limit = 20, offset = 0 } = input;\n\n let whereClause = 'WHERE 1=1';\n const params: (string | number)[] = [];\n\n if (storeId) {\n whereClause += ' AND storeId = ?';\n params.push(storeId);\n }\n\n if (status && status !== 'all') {\n whereClause += ' AND status = ?';\n params.push(status);\n }\n\n if (category) {\n whereClause += ' AND category = ?';\n params.push(category);\n }\n\n if (search) {\n whereClause += ' AND name LIKE ?';\n params.push(`%${search}%`);\n }\n\n const countResult = (\n await db.query(\n `SELECT COUNT(*) as count FROM marketplace_product ${whereClause}`,\n params\n )\n ).rows as DbRow[];\n const total = (countResult[0]?.count as number) ?? 0;\n\n const rows = (\n await db.query(\n `SELECT * FROM marketplace_product ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n [...params, limit, offset]\n )\n ).rows as unknown as ProductRow[];\n\n return {\n products: rows.map(rowToProduct),\n total,\n };\n }\n\n /**\n * Add a product\n */\n async function addProduct(input: AddProductInput): Promise<Product> {\n const id = generateId('prod');\n const now = new Date().toISOString();\n\n await db.execute(\n `INSERT INTO marketplace_product (id, storeId, name, description, price, currency, status, stock, category, imageUrl, createdAt, updatedAt)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n input.storeId,\n input.name,\n input.description ?? null,\n input.price,\n input.currency ?? 'USD',\n 'DRAFT',\n input.stock ?? 0,\n input.category ?? null,\n input.imageUrl ?? null,\n now,\n now,\n ]\n );\n\n const rows = (\n await db.query(`SELECT * FROM marketplace_product WHERE id = ?`, [id])\n ).rows as unknown as ProductRow[];\n\n return rowToProduct(rows[0]!);\n }\n\n /**\n * List orders\n */\n async function listOrders(input: ListOrdersInput): Promise<ListOrdersOutput> {\n const {\n projectId,\n storeId,\n customerId,\n status,\n limit = 20,\n offset = 0,\n } = input;\n\n let whereClause = 'WHERE projectId = ?';\n const params: (string | number)[] = [projectId];\n\n if (storeId) {\n whereClause += ' AND storeId = ?';\n params.push(storeId);\n }\n\n if (customerId) {\n whereClause += ' AND customerId = ?';\n params.push(customerId);\n }\n\n if (status && status !== 'all') {\n whereClause += ' AND status = ?';\n params.push(status);\n }\n\n const countResult = (\n await db.query(\n `SELECT COUNT(*) as count FROM marketplace_order ${whereClause}`,\n params\n )\n ).rows as DbRow[];\n const total = (countResult[0]?.count as number) ?? 0;\n\n const revenueResult = (\n await db.query(\n `SELECT COALESCE(SUM(total), 0) as revenue FROM marketplace_order ${whereClause}`,\n params\n )\n ).rows as DbRow[];\n const totalRevenue = (revenueResult[0]?.revenue as number) ?? 0;\n\n const rows = (\n await db.query(\n `SELECT * FROM marketplace_order ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n [...params, limit, offset]\n )\n ).rows as unknown as OrderRow[];\n\n return {\n orders: rows.map(rowToOrder),\n total,\n totalRevenue,\n };\n }\n\n /**\n * Place an order\n */\n async function placeOrder(\n input: PlaceOrderInput,\n context: { projectId: string; customerId: string }\n ): Promise<Order> {\n const orderId = generateId('order');\n const now = new Date().toISOString();\n\n // Calculate total\n let total = 0;\n const itemsToCreate: {\n productId: string;\n quantity: number;\n price: number;\n }[] = [];\n\n for (const item of input.items) {\n const products = (\n await db.query(`SELECT * FROM marketplace_product WHERE id = ?`, [\n item.productId,\n ])\n ).rows as unknown as ProductRow[];\n\n if (!products[0]) {\n throw new Error(`Product not found: ${item.productId}`);\n }\n\n const itemPrice = products[0].price * item.quantity;\n total += itemPrice;\n itemsToCreate.push({\n productId: item.productId,\n quantity: item.quantity,\n price: products[0].price,\n });\n }\n\n // Create order\n await db.execute(\n `INSERT INTO marketplace_order (id, projectId, storeId, customerId, status, total, currency, shippingAddress, createdAt, updatedAt)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n orderId,\n context.projectId,\n input.storeId,\n context.customerId,\n 'PENDING',\n total,\n 'USD',\n input.shippingAddress ?? null,\n now,\n now,\n ]\n );\n\n // Create order items\n for (const item of itemsToCreate) {\n await db.execute(\n `INSERT INTO marketplace_order_item (id, orderId, productId, quantity, price, createdAt)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [\n generateId('orditem'),\n orderId,\n item.productId,\n item.quantity,\n item.price,\n now,\n ]\n );\n }\n\n const rows = (\n await db.query(`SELECT * FROM marketplace_order WHERE id = ?`, [orderId])\n ).rows as unknown as OrderRow[];\n\n return rowToOrder(rows[0]!);\n }\n\n /**\n * Get order items\n */\n async function getOrderItems(orderId: string): Promise<OrderItem[]> {\n const rows = (\n await db.query(`SELECT * FROM marketplace_order_item WHERE orderId = ?`, [\n orderId,\n ])\n ).rows as unknown as OrderItemRow[];\n\n return rows.map(rowToOrderItem);\n }\n\n /**\n * Update order status\n */\n async function updateOrderStatus(\n orderId: string,\n status: Order['status']\n ): Promise<Order> {\n const now = new Date().toISOString();\n\n await db.execute(\n `UPDATE marketplace_order SET status = ?, updatedAt = ? WHERE id = ?`,\n [status, now, orderId]\n );\n\n const rows = (\n await db.query(`SELECT * FROM marketplace_order WHERE id = ?`, [orderId])\n ).rows as unknown as OrderRow[];\n\n return rowToOrder(rows[0]!);\n }\n\n /**\n * List payouts\n */\n async function listPayouts(storeId: string): Promise<Payout[]> {\n const rows = (\n await db.query(\n `SELECT * FROM marketplace_payout WHERE storeId = ? ORDER BY createdAt DESC`,\n [storeId]\n )\n ).rows as unknown as PayoutRow[];\n\n return rows.map(rowToPayout);\n }\n\n /**\n * List reviews for a product\n */\n async function listReviews(productId: string): Promise<Review[]> {\n const rows = (\n await db.query(\n `SELECT * FROM marketplace_review WHERE productId = ? ORDER BY createdAt DESC`,\n [productId]\n )\n ).rows as unknown as ReviewRow[];\n\n return rows.map(rowToReview);\n }\n\n /**\n * Submit a review\n */\n async function submitReview(input: {\n productId: string;\n customerId: string;\n orderId?: string;\n rating: number;\n comment?: string;\n }): Promise<Review> {\n const id = generateId('review');\n const now = new Date().toISOString();\n\n await db.execute(\n `INSERT INTO marketplace_review (id, productId, customerId, orderId, rating, comment, createdAt)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n input.productId,\n input.customerId,\n input.orderId ?? null,\n input.rating,\n input.comment ?? null,\n now,\n now,\n ]\n );\n\n const rows = (\n await db.query(`SELECT * FROM marketplace_review WHERE id = ?`, [id])\n ).rows as unknown as ReviewRow[];\n\n return rowToReview(rows[0]!);\n }\n\n return {\n listStores,\n createStore,\n listProducts,\n addProduct,\n listOrders,\n placeOrder,\n getOrderItems,\n updateOrderStatus,\n listPayouts,\n listReviews,\n submitReview,\n };\n}\n\nexport type MarketplaceHandlers = ReturnType<typeof createMarketplaceHandlers>;\n"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { AddProductInput, CreateStoreInput, ListOrdersInput, ListOrdersOutput, ListProductsInput, ListProductsOutput, ListStoresInput, ListStoresOutput, MarketplaceHandlers, Order, OrderItem, Payout, PlaceOrderInput, Product, Review, Store, createMarketplaceHandlers } from "./handlers/marketplace.handlers.js";
|
|
2
|
+
import { StoreStatusEnum } from "./store/store.enum.js";
|
|
3
|
+
import { CreateStoreInputModel, StoreModel } from "./store/store.schema.js";
|
|
4
|
+
import { CreateStoreContract } from "./store/store.operations.js";
|
|
5
|
+
import { StoreCreatedEvent, StoreStatusChangedEvent } from "./store/store.event.js";
|
|
6
|
+
import "./store/index.js";
|
|
7
|
+
import { ProductStatusEnum } from "./product/product.enum.js";
|
|
8
|
+
import { CreateProductInputModel, ListProductsInputModel, ListProductsOutputModel, ProductModel } from "./product/product.schema.js";
|
|
9
|
+
import { CreateProductContract, ListProductsContract } from "./product/product.operations.js";
|
|
10
|
+
import { InventoryUpdatedEvent, ProductCreatedEvent, ProductPublishedEvent } from "./product/product.event.js";
|
|
11
|
+
import "./product/index.js";
|
|
12
|
+
import { OrderStatusEnum } from "./order/order.enum.js";
|
|
13
|
+
import { CreateOrderInputModel, OrderItemModel, OrderModel, UpdateOrderStatusInputModel } from "./order/order.schema.js";
|
|
14
|
+
import { CreateOrderContract, UpdateOrderStatusContract } from "./order/order.operations.js";
|
|
15
|
+
import { OrderCompletedEvent, OrderCreatedEvent, OrderPaidEvent, OrderShippedEvent, OrderStatusUpdatedEvent } from "./order/order.event.js";
|
|
16
|
+
import "./order/index.js";
|
|
17
|
+
import { PayoutStatusEnum } from "./payout/payout.enum.js";
|
|
18
|
+
import { ListPayoutsInputModel, ListPayoutsOutputModel, PayoutModel } from "./payout/payout.schema.js";
|
|
19
|
+
import { ListPayoutsContract } from "./payout/payout.operations.js";
|
|
20
|
+
import { PayoutCreatedEvent, PayoutPaidEvent } from "./payout/payout.event.js";
|
|
21
|
+
import "./payout/index.js";
|
|
22
|
+
import { ReviewStatusEnum } from "./review/review.enum.js";
|
|
23
|
+
import { CreateReviewInputModel, ListReviewsInputModel, ListReviewsOutputModel, ReviewModel } from "./review/review.schema.js";
|
|
24
|
+
import { CreateReviewContract, ListReviewsContract } from "./review/review.operations.js";
|
|
25
|
+
import { ReviewCreatedEvent, ReviewRespondedEvent } from "./review/review.event.js";
|
|
26
|
+
import "./review/index.js";
|
|
27
|
+
import { marketplaceDashboardMarkdownRenderer, orderListMarkdownRenderer, productCatalogMarkdownRenderer } from "./ui/renderers/marketplace.markdown.js";
|
|
28
|
+
import { MarketplaceDashboard } from "./ui/MarketplaceDashboard.js";
|
|
29
|
+
import { MarketplaceStats, useMarketplaceData } from "./ui/hooks/useMarketplaceData.js";
|
|
30
|
+
import "./ui/index.js";
|
|
31
|
+
export { AddProductInput, CreateOrderContract, CreateOrderInputModel, CreateProductContract, CreateProductInputModel, CreateReviewContract, CreateReviewInputModel, CreateStoreContract, CreateStoreInput, CreateStoreInputModel, InventoryUpdatedEvent, ListOrdersInput, ListOrdersOutput, ListPayoutsContract, ListPayoutsInputModel, ListPayoutsOutputModel, ListProductsContract, ListProductsInput, ListProductsInputModel, ListProductsOutput, ListProductsOutputModel, ListReviewsContract, ListReviewsInputModel, ListReviewsOutputModel, ListStoresInput, ListStoresOutput, MarketplaceDashboard, MarketplaceHandlers, MarketplaceStats, Order, OrderCompletedEvent, OrderCreatedEvent, OrderItem, OrderItemModel, OrderModel, OrderPaidEvent, OrderShippedEvent, OrderStatusEnum, OrderStatusUpdatedEvent, Payout, PayoutCreatedEvent, PayoutModel, PayoutPaidEvent, PayoutStatusEnum, PlaceOrderInput, Product, ProductCreatedEvent, ProductModel, ProductPublishedEvent, ProductStatusEnum, Review, ReviewCreatedEvent, ReviewModel, ReviewRespondedEvent, ReviewStatusEnum, Store, StoreCreatedEvent, StoreModel, StoreStatusChangedEvent, StoreStatusEnum, UpdateOrderStatusContract, UpdateOrderStatusInputModel, createMarketplaceHandlers, marketplaceDashboardMarkdownRenderer, orderListMarkdownRenderer, productCatalogMarkdownRenderer, useMarketplaceData };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { StoreStatusEnum } from "./store/store.enum.js";
|
|
2
|
+
import { CreateStoreInputModel, StoreModel } from "./store/store.schema.js";
|
|
3
|
+
import { CreateStoreContract } from "./store/store.operations.js";
|
|
4
|
+
import { StoreCreatedEvent, StoreStatusChangedEvent } from "./store/store.event.js";
|
|
5
|
+
import "./store/index.js";
|
|
6
|
+
import { ProductStatusEnum } from "./product/product.enum.js";
|
|
7
|
+
import { CreateProductInputModel, ListProductsInputModel, ListProductsOutputModel, ProductModel } from "./product/product.schema.js";
|
|
8
|
+
import { CreateProductContract, ListProductsContract } from "./product/product.operations.js";
|
|
9
|
+
import { InventoryUpdatedEvent, ProductCreatedEvent, ProductPublishedEvent } from "./product/product.event.js";
|
|
10
|
+
import "./product/index.js";
|
|
11
|
+
import { OrderStatusEnum } from "./order/order.enum.js";
|
|
12
|
+
import { CreateOrderInputModel, OrderItemModel, OrderModel, UpdateOrderStatusInputModel } from "./order/order.schema.js";
|
|
13
|
+
import { CreateOrderContract, UpdateOrderStatusContract } from "./order/order.operations.js";
|
|
14
|
+
import { OrderCompletedEvent, OrderCreatedEvent, OrderPaidEvent, OrderShippedEvent, OrderStatusUpdatedEvent } from "./order/order.event.js";
|
|
15
|
+
import "./order/index.js";
|
|
16
|
+
import { PayoutStatusEnum } from "./payout/payout.enum.js";
|
|
17
|
+
import { ListPayoutsInputModel, ListPayoutsOutputModel, PayoutModel } from "./payout/payout.schema.js";
|
|
18
|
+
import { ListPayoutsContract } from "./payout/payout.operations.js";
|
|
19
|
+
import { PayoutCreatedEvent, PayoutPaidEvent } from "./payout/payout.event.js";
|
|
20
|
+
import "./payout/index.js";
|
|
21
|
+
import { ReviewStatusEnum } from "./review/review.enum.js";
|
|
22
|
+
import { CreateReviewInputModel, ListReviewsInputModel, ListReviewsOutputModel, ReviewModel } from "./review/review.schema.js";
|
|
23
|
+
import { CreateReviewContract, ListReviewsContract } from "./review/review.operations.js";
|
|
24
|
+
import { ReviewCreatedEvent, ReviewRespondedEvent } from "./review/review.event.js";
|
|
25
|
+
import "./review/index.js";
|
|
26
|
+
import { createMarketplaceHandlers } from "./handlers/marketplace.handlers.js";
|
|
27
|
+
import { marketplaceDashboardMarkdownRenderer, orderListMarkdownRenderer, productCatalogMarkdownRenderer } from "./ui/renderers/marketplace.markdown.js";
|
|
28
|
+
import { useMarketplaceData } from "./ui/hooks/useMarketplaceData.js";
|
|
29
|
+
import { MarketplaceDashboard } from "./ui/MarketplaceDashboard.js";
|
|
30
|
+
import "./ui/index.js";
|
|
31
|
+
|
|
32
|
+
export { CreateOrderContract, CreateOrderInputModel, CreateProductContract, CreateProductInputModel, CreateReviewContract, CreateReviewInputModel, CreateStoreContract, CreateStoreInputModel, InventoryUpdatedEvent, ListPayoutsContract, ListPayoutsInputModel, ListPayoutsOutputModel, ListProductsContract, ListProductsInputModel, ListProductsOutputModel, ListReviewsContract, ListReviewsInputModel, ListReviewsOutputModel, MarketplaceDashboard, OrderCompletedEvent, OrderCreatedEvent, OrderItemModel, OrderModel, OrderPaidEvent, OrderShippedEvent, OrderStatusEnum, OrderStatusUpdatedEvent, PayoutCreatedEvent, PayoutModel, PayoutPaidEvent, PayoutStatusEnum, ProductCreatedEvent, ProductModel, ProductPublishedEvent, ProductStatusEnum, ReviewCreatedEvent, ReviewModel, ReviewRespondedEvent, ReviewStatusEnum, StoreCreatedEvent, StoreModel, StoreStatusChangedEvent, StoreStatusEnum, UpdateOrderStatusContract, UpdateOrderStatusInputModel, createMarketplaceHandlers, marketplaceDashboardMarkdownRenderer, orderListMarkdownRenderer, productCatalogMarkdownRenderer, useMarketplaceData };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as _contractspec_lib_contracts0 from "@contractspec/lib.contracts";
|
|
2
|
+
|
|
3
|
+
//#region src/marketplace.capability.d.ts
|
|
4
|
+
declare const MarketplaceCapability: _contractspec_lib_contracts0.CapabilitySpec;
|
|
5
|
+
declare const EcommerceCapability: _contractspec_lib_contracts0.CapabilitySpec;
|
|
6
|
+
declare const PaymentsCapability: _contractspec_lib_contracts0.CapabilitySpec;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { EcommerceCapability, MarketplaceCapability, PaymentsCapability };
|
|
9
|
+
//# sourceMappingURL=marketplace.capability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.capability.d.ts","names":[],"sources":["../src/marketplace.capability.ts"],"sourcesContent":[],"mappings":";;;cAEa,uBAUX,4BAAA,CAVgC;cAYrB,qBAUX,4BAAA,CAV8B;cAYnB,oBAUX,4BAAA,CAV6B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { StabilityEnum, defineCapability } from "@contractspec/lib.contracts";
|
|
2
|
+
|
|
3
|
+
//#region src/marketplace.capability.ts
|
|
4
|
+
const MarketplaceCapability = defineCapability({ meta: {
|
|
5
|
+
key: "marketplace",
|
|
6
|
+
version: "1.0.0",
|
|
7
|
+
kind: "ui",
|
|
8
|
+
stability: StabilityEnum.Experimental,
|
|
9
|
+
description: "Multi-vendor marketplace platform",
|
|
10
|
+
owners: ["platform.marketplace"],
|
|
11
|
+
tags: ["marketplace", "ecommerce"]
|
|
12
|
+
} });
|
|
13
|
+
const EcommerceCapability = defineCapability({ meta: {
|
|
14
|
+
key: "ecommerce",
|
|
15
|
+
version: "1.0.0",
|
|
16
|
+
kind: "api",
|
|
17
|
+
stability: StabilityEnum.Experimental,
|
|
18
|
+
description: "E-commerce operations and product catalog",
|
|
19
|
+
owners: ["platform.marketplace"],
|
|
20
|
+
tags: ["ecommerce", "products"]
|
|
21
|
+
} });
|
|
22
|
+
const PaymentsCapability = defineCapability({ meta: {
|
|
23
|
+
key: "payments",
|
|
24
|
+
version: "1.0.0",
|
|
25
|
+
kind: "integration",
|
|
26
|
+
stability: StabilityEnum.Experimental,
|
|
27
|
+
description: "Payment processing and payouts",
|
|
28
|
+
owners: ["platform.finance"],
|
|
29
|
+
tags: ["payments", "finance"]
|
|
30
|
+
} });
|
|
31
|
+
|
|
32
|
+
//#endregion
|
|
33
|
+
export { EcommerceCapability, MarketplaceCapability, PaymentsCapability };
|
|
34
|
+
//# sourceMappingURL=marketplace.capability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.capability.js","names":[],"sources":["../src/marketplace.capability.ts"],"sourcesContent":["import { defineCapability, StabilityEnum } from '@contractspec/lib.contracts';\n\nexport const MarketplaceCapability = defineCapability({\n meta: {\n key: 'marketplace',\n version: '1.0.0',\n kind: 'ui',\n stability: StabilityEnum.Experimental,\n description: 'Multi-vendor marketplace platform',\n owners: ['platform.marketplace'],\n tags: ['marketplace', 'ecommerce'],\n },\n});\n\nexport const EcommerceCapability = defineCapability({\n meta: {\n key: 'ecommerce',\n version: '1.0.0',\n kind: 'api',\n stability: StabilityEnum.Experimental,\n description: 'E-commerce operations and product catalog',\n owners: ['platform.marketplace'],\n tags: ['ecommerce', 'products'],\n },\n});\n\nexport const PaymentsCapability = defineCapability({\n meta: {\n key: 'payments',\n version: '1.0.0',\n kind: 'integration',\n stability: StabilityEnum.Experimental,\n description: 'Payment processing and payouts',\n owners: ['platform.finance'],\n tags: ['payments', 'finance'],\n },\n});\n"],"mappings":";;;AAEA,MAAa,wBAAwB,iBAAiB,EACpD,MAAM;CACJ,KAAK;CACL,SAAS;CACT,MAAM;CACN,WAAW,cAAc;CACzB,aAAa;CACb,QAAQ,CAAC,uBAAuB;CAChC,MAAM,CAAC,eAAe,YAAY;CACnC,EACF,CAAC;AAEF,MAAa,sBAAsB,iBAAiB,EAClD,MAAM;CACJ,KAAK;CACL,SAAS;CACT,MAAM;CACN,WAAW,cAAc;CACzB,aAAa;CACb,QAAQ,CAAC,uBAAuB;CAChC,MAAM,CAAC,aAAa,WAAW;CAChC,EACF,CAAC;AAEF,MAAa,qBAAqB,iBAAiB,EACjD,MAAM;CACJ,KAAK;CACL,SAAS;CACT,MAAM;CACN,WAAW,cAAc;CACzB,aAAa;CACb,QAAQ,CAAC,mBAAmB;CAC5B,MAAM,CAAC,YAAY,UAAU;CAC9B,EACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as _contractspec_lib_contracts40 from "@contractspec/lib.contracts";
|
|
2
|
+
|
|
3
|
+
//#region src/marketplace.feature.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Marketplace feature module that bundles multi-vendor marketplace
|
|
7
|
+
* capabilities including stores, products, orders, payouts, and reviews.
|
|
8
|
+
*/
|
|
9
|
+
declare const MarketplaceFeature: _contractspec_lib_contracts40.FeatureModuleSpec;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { MarketplaceFeature };
|
|
12
|
+
//# sourceMappingURL=marketplace.feature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.feature.d.ts","names":[],"sources":["../src/marketplace.feature.ts"],"sourcesContent":[],"mappings":";;;;;;;AASA;cAAa,oBAqKX,6BAAA,CArK6B"}
|