@cogenta/commerce 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/LICENSE +373 -0
  2. package/dist/admin/permissions.d.ts +57 -0
  3. package/dist/admin/permissions.d.ts.map +1 -0
  4. package/dist/admin/permissions.js +87 -0
  5. package/dist/admin/permissions.js.map +1 -0
  6. package/dist/admin/router.d.ts +53 -0
  7. package/dist/admin/router.d.ts.map +1 -0
  8. package/dist/admin/router.js +476 -0
  9. package/dist/admin/router.js.map +1 -0
  10. package/dist/cart/store.d.ts +91 -0
  11. package/dist/cart/store.d.ts.map +1 -0
  12. package/dist/cart/store.js +342 -0
  13. package/dist/cart/store.js.map +1 -0
  14. package/dist/cart/totals.d.ts +73 -0
  15. package/dist/cart/totals.d.ts.map +1 -0
  16. package/dist/cart/totals.js +65 -0
  17. package/dist/cart/totals.js.map +1 -0
  18. package/dist/catalog/store.d.ts +53 -0
  19. package/dist/catalog/store.d.ts.map +1 -0
  20. package/dist/catalog/store.js +358 -0
  21. package/dist/catalog/store.js.map +1 -0
  22. package/dist/catalog/types.d.ts +95 -0
  23. package/dist/catalog/types.d.ts.map +1 -0
  24. package/dist/catalog/types.js +5 -0
  25. package/dist/catalog/types.js.map +1 -0
  26. package/dist/coupon/store.d.ts +103 -0
  27. package/dist/coupon/store.d.ts.map +1 -0
  28. package/dist/coupon/store.js +181 -0
  29. package/dist/coupon/store.js.map +1 -0
  30. package/dist/customer/store.d.ts +41 -0
  31. package/dist/customer/store.d.ts.map +1 -0
  32. package/dist/customer/store.js +103 -0
  33. package/dist/customer/store.js.map +1 -0
  34. package/dist/index.d.ts +42 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +23 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/invoice/pdf.d.ts +67 -0
  39. package/dist/invoice/pdf.d.ts.map +1 -0
  40. package/dist/invoice/pdf.js +449 -0
  41. package/dist/invoice/pdf.js.map +1 -0
  42. package/dist/invoice/store.d.ts +96 -0
  43. package/dist/invoice/store.d.ts.map +1 -0
  44. package/dist/invoice/store.js +221 -0
  45. package/dist/invoice/store.js.map +1 -0
  46. package/dist/money.d.ts +55 -0
  47. package/dist/money.d.ts.map +1 -0
  48. package/dist/money.js +146 -0
  49. package/dist/money.js.map +1 -0
  50. package/dist/order/store.d.ts +75 -0
  51. package/dist/order/store.d.ts.map +1 -0
  52. package/dist/order/store.js +301 -0
  53. package/dist/order/store.js.map +1 -0
  54. package/dist/order/types.d.ts +67 -0
  55. package/dist/order/types.d.ts.map +1 -0
  56. package/dist/order/types.js +71 -0
  57. package/dist/order/types.js.map +1 -0
  58. package/dist/payment/manual.d.ts +27 -0
  59. package/dist/payment/manual.d.ts.map +1 -0
  60. package/dist/payment/manual.js +105 -0
  61. package/dist/payment/manual.js.map +1 -0
  62. package/dist/payment/registry.d.ts +23 -0
  63. package/dist/payment/registry.d.ts.map +1 -0
  64. package/dist/payment/registry.js +30 -0
  65. package/dist/payment/registry.js.map +1 -0
  66. package/dist/payment/store.d.ts +38 -0
  67. package/dist/payment/store.d.ts.map +1 -0
  68. package/dist/payment/store.js +253 -0
  69. package/dist/payment/store.js.map +1 -0
  70. package/dist/payment/stripe.d.ts +10 -0
  71. package/dist/payment/stripe.d.ts.map +1 -0
  72. package/dist/payment/stripe.js +419 -0
  73. package/dist/payment/stripe.js.map +1 -0
  74. package/dist/payment/types.d.ts +124 -0
  75. package/dist/payment/types.d.ts.map +1 -0
  76. package/dist/payment/types.js +18 -0
  77. package/dist/payment/types.js.map +1 -0
  78. package/dist/rows.d.ts +26 -0
  79. package/dist/rows.d.ts.map +1 -0
  80. package/dist/rows.js +87 -0
  81. package/dist/rows.js.map +1 -0
  82. package/dist/shipping/store.d.ts +88 -0
  83. package/dist/shipping/store.d.ts.map +1 -0
  84. package/dist/shipping/store.js +165 -0
  85. package/dist/shipping/store.js.map +1 -0
  86. package/dist/subscription/store.d.ts +106 -0
  87. package/dist/subscription/store.d.ts.map +1 -0
  88. package/dist/subscription/store.js +310 -0
  89. package/dist/subscription/store.js.map +1 -0
  90. package/dist/tables.d.ts +41 -0
  91. package/dist/tables.d.ts.map +1 -0
  92. package/dist/tables.js +383 -0
  93. package/dist/tables.js.map +1 -0
  94. package/dist/tax/store.d.ts +68 -0
  95. package/dist/tax/store.d.ts.map +1 -0
  96. package/dist/tax/store.js +126 -0
  97. package/dist/tax/store.js.map +1 -0
  98. package/package.json +42 -0
@@ -0,0 +1,476 @@
1
+ import { CogentaError, isCogentaError } from '@cogenta/core';
2
+ import { COUPON_KINDS } from '../coupon/store.js';
3
+ import { ORDER_STATUSES } from '../order/types.js';
4
+ import { COMMERCE_ANONYMOUS } from './permissions.js';
5
+ const STATUS_BY_CODE = {
6
+ UNAUTHENTICATED: 401,
7
+ FORBIDDEN: 403,
8
+ COMMERCE_PRODUCT_NOT_FOUND: 404,
9
+ COMMERCE_VARIANT_NOT_FOUND: 404,
10
+ COMMERCE_ORDER_NOT_FOUND: 404,
11
+ COMMERCE_CART_NOT_FOUND: 404,
12
+ COMMERCE_PAYMENT_NOT_FOUND: 404,
13
+ COMMERCE_COUPON_NOT_FOUND: 404,
14
+ COMMERCE_INVOICE_NOT_FOUND: 404,
15
+ COMMERCE_SUBSCRIPTION_NOT_FOUND: 404,
16
+ COMMERCE_SHIPPING_METHOD_UNKNOWN: 404,
17
+ COMMERCE_PRODUCT_INVALID: 400,
18
+ COMMERCE_SKU_TAKEN: 409,
19
+ COMMERCE_INVOICE_ALREADY_ISSUED: 409,
20
+ COMMERCE_CART_CLOSED: 409,
21
+ COMMERCE_ORDER_TRANSITION_INVALID: 409,
22
+ COMMERCE_INVOICE_SEQUENCE_CONFLICT: 409,
23
+ COMMERCE_AMOUNT_INVALID: 400,
24
+ COMMERCE_CURRENCY_INVALID: 400,
25
+ COMMERCE_CURRENCY_MISMATCH: 400,
26
+ COMMERCE_QUANTITY_INVALID: 400,
27
+ COMMERCE_COUPON_INVALID: 400,
28
+ COMMERCE_COUPON_EXHAUSTED: 409,
29
+ COMMERCE_TAX_RULE_INVALID: 400,
30
+ COMMERCE_SHIPPING_UNAVAILABLE: 400,
31
+ COMMERCE_SUBSCRIPTION_INVALID: 400,
32
+ COMMERCE_REFUND_EXCEEDS_PAYMENT: 400,
33
+ COMMERCE_PAYMENT_UNSUPPORTED: 400,
34
+ COMMERCE_PAYMENT_SIGNATURE_INVALID: 403,
35
+ };
36
+ function errorResponse(error) {
37
+ if (isCogentaError(error)) {
38
+ return {
39
+ status: STATUS_BY_CODE[error.code] ?? 500,
40
+ body: {
41
+ error: error.hint === undefined
42
+ ? { code: error.code, message: error.message }
43
+ : { code: error.code, message: error.message, hint: error.hint },
44
+ },
45
+ };
46
+ }
47
+ // `details` is never serialised and an unexpected error is reduced to a
48
+ // fixed sentence: an unplanned message can contain anything at all,
49
+ // including a connection string.
50
+ return {
51
+ status: 500,
52
+ body: { error: { code: 'INTERNAL', message: 'Something went wrong in the shop.' } },
53
+ };
54
+ }
55
+ function readObject(body) {
56
+ if (typeof body !== 'object' || body === null || Array.isArray(body)) {
57
+ throw new CogentaError({
58
+ code: 'COMMERCE_AMOUNT_INVALID',
59
+ message: 'This request needs a JSON object as its body.',
60
+ hint: 'Send an object, not an array or a bare value.',
61
+ });
62
+ }
63
+ return body;
64
+ }
65
+ function readString(body, key) {
66
+ const value = body[key];
67
+ if (typeof value !== 'string' || value.trim() === '') {
68
+ throw new CogentaError({
69
+ code: 'COMMERCE_AMOUNT_INVALID',
70
+ message: `"${key}" is required and must be a non-empty string.`,
71
+ hint: `Add "${key}" to the request body.`,
72
+ });
73
+ }
74
+ return value;
75
+ }
76
+ function readInt(body, key) {
77
+ const value = body[key];
78
+ if (typeof value !== 'number' || !Number.isInteger(value)) {
79
+ throw new CogentaError({
80
+ code: 'COMMERCE_AMOUNT_INVALID',
81
+ message: `"${key}" is required and must be a whole number.`,
82
+ hint: 'Money is sent in minor units — 19.99 euros is 1999.',
83
+ });
84
+ }
85
+ return value;
86
+ }
87
+ export function createCommerceAdminRouter(options) {
88
+ const basePath = (options.basePath ?? '/api/commerce').replace(/\/+$/u, '');
89
+ const { permissions } = options;
90
+ return {
91
+ handle: async (request, actor = COMMERCE_ANONYMOUS) => {
92
+ try {
93
+ if (!request.path.startsWith(basePath)) {
94
+ return { status: 404, body: { error: { code: 'COMMERCE_ORDER_NOT_FOUND' } } };
95
+ }
96
+ const segments = request.path
97
+ .slice(basePath.length)
98
+ .split('/')
99
+ .filter((segment) => segment !== '');
100
+ const method = request.method.toUpperCase();
101
+ // ---- products -----------------------------------------------------
102
+ if (segments[0] === 'products' && segments.length === 1) {
103
+ if (method === 'GET') {
104
+ permissions.assert('commerce.read', actor);
105
+ const query = request.query ?? {};
106
+ return {
107
+ status: 200,
108
+ body: {
109
+ products: await options.catalog.listProducts({
110
+ ...(query.status === 'active' || query.status === 'archived'
111
+ ? { status: query.status }
112
+ : {}),
113
+ ...(query.q === undefined ? {} : { search: query.q }),
114
+ }),
115
+ },
116
+ };
117
+ }
118
+ if (method === 'POST') {
119
+ permissions.assert('commerce.catalog.write', actor);
120
+ const body = readObject(request.body);
121
+ return {
122
+ status: 201,
123
+ body: await options.catalog.createProduct({
124
+ handle: readString(body, 'handle'),
125
+ title: readString(body, 'title'),
126
+ }),
127
+ };
128
+ }
129
+ }
130
+ if (segments[0] === 'products' && segments.length === 2) {
131
+ const id = segments[1] ?? '';
132
+ if (method === 'GET') {
133
+ permissions.assert('commerce.read', actor);
134
+ const product = await options.catalog.readProduct(id);
135
+ if (product === null)
136
+ return notFound('product');
137
+ return {
138
+ status: 200,
139
+ body: { product, variants: await options.catalog.listVariants(id) },
140
+ };
141
+ }
142
+ if (method === 'PATCH') {
143
+ permissions.assert('commerce.catalog.write', actor);
144
+ const body = readObject(request.body);
145
+ return {
146
+ status: 200,
147
+ body: await options.catalog.updateProduct(id, {
148
+ ...(typeof body.handle === 'string' ? { handle: body.handle } : {}),
149
+ ...(typeof body.title === 'string' ? { title: body.title } : {}),
150
+ ...(body.status === 'active' || body.status === 'archived'
151
+ ? { status: body.status }
152
+ : {}),
153
+ }),
154
+ };
155
+ }
156
+ if (method === 'DELETE') {
157
+ permissions.assert('commerce.catalog.write', actor);
158
+ await options.catalog.archiveProduct(id);
159
+ return { status: 204, body: null };
160
+ }
161
+ }
162
+ // ---- variants -----------------------------------------------------
163
+ if (segments[0] === 'products' && segments[2] === 'variants' && segments.length === 3) {
164
+ if (method === 'POST') {
165
+ permissions.assert('commerce.catalog.write', actor);
166
+ const body = readObject(request.body);
167
+ return {
168
+ status: 201,
169
+ body: await options.catalog.createVariant({
170
+ productId: segments[1] ?? '',
171
+ sku: readString(body, 'sku'),
172
+ title: readString(body, 'title'),
173
+ priceMinor: readInt(body, 'priceMinor'),
174
+ currency: readString(body, 'currency'),
175
+ ...(typeof body.onHand === 'number' ? { onHand: body.onHand } : {}),
176
+ }),
177
+ };
178
+ }
179
+ }
180
+ if (segments[0] === 'variants' && segments.length === 2) {
181
+ const id = segments[1] ?? '';
182
+ if (method === 'PATCH') {
183
+ permissions.assert('commerce.catalog.write', actor);
184
+ const body = readObject(request.body);
185
+ return {
186
+ status: 200,
187
+ body: await options.catalog.updateVariant(id, {
188
+ ...(typeof body.sku === 'string' ? { sku: body.sku } : {}),
189
+ ...(typeof body.title === 'string' ? { title: body.title } : {}),
190
+ ...(typeof body.priceMinor === 'number' ? { priceMinor: body.priceMinor } : {}),
191
+ ...(typeof body.allowBackorder === 'boolean'
192
+ ? { allowBackorder: body.allowBackorder }
193
+ : {}),
194
+ }),
195
+ };
196
+ }
197
+ if (method === 'DELETE') {
198
+ permissions.assert('commerce.catalog.write', actor);
199
+ await options.catalog.deleteVariant(id);
200
+ return { status: 204, body: null };
201
+ }
202
+ }
203
+ // Stock is its own route, never a field on the variant PATCH. A form
204
+ // rendered a minute ago must not be able to overwrite a sale that
205
+ // happened since.
206
+ if (segments[0] === 'variants' && segments[2] === 'stock' && segments.length === 3) {
207
+ if (method === 'PUT') {
208
+ permissions.assert('commerce.catalog.write', actor);
209
+ const body = readObject(request.body);
210
+ return {
211
+ status: 200,
212
+ body: await options.catalog.setStock(segments[1] ?? '', readInt(body, 'onHand')),
213
+ };
214
+ }
215
+ }
216
+ // ---- orders -------------------------------------------------------
217
+ if (segments[0] === 'orders' && segments.length === 1 && method === 'GET') {
218
+ permissions.assert('commerce.read', actor);
219
+ const status = request.query?.status;
220
+ return {
221
+ status: 200,
222
+ body: {
223
+ orders: await options.orders.list(ORDER_STATUSES.includes(status ?? '')
224
+ ? { status: status }
225
+ : {}),
226
+ },
227
+ };
228
+ }
229
+ if (segments[0] === 'orders' && segments.length === 2 && method === 'GET') {
230
+ permissions.assert('commerce.read', actor);
231
+ const order = await options.orders.read(segments[1] ?? '');
232
+ if (order === null)
233
+ return notFound('order');
234
+ return {
235
+ status: 200,
236
+ body: {
237
+ order,
238
+ history: await options.orders.history(order.id),
239
+ payments: await options.payments.listForOrder(order.id),
240
+ },
241
+ };
242
+ }
243
+ if (segments[0] === 'orders' && segments[2] === 'status' && segments.length === 3) {
244
+ if (method === 'PUT') {
245
+ permissions.assert('commerce.order.write', actor);
246
+ const body = readObject(request.body);
247
+ const to = readString(body, 'status');
248
+ if (!ORDER_STATUSES.includes(to)) {
249
+ throw new CogentaError({
250
+ code: 'COMMERCE_ORDER_TRANSITION_INVALID',
251
+ message: `"${to}" is not an order status.`,
252
+ hint: `Use one of: ${ORDER_STATUSES.join(', ')}.`,
253
+ });
254
+ }
255
+ return {
256
+ status: 200,
257
+ body: await options.orders.transition(segments[1] ?? '', to, {
258
+ actorId: actor.id,
259
+ ...(typeof body.note === 'string' ? { note: body.note } : {}),
260
+ }),
261
+ };
262
+ }
263
+ }
264
+ // ---- payments -----------------------------------------------------
265
+ if (segments[0] === 'payments' && segments[2] === 'settle' && segments.length === 3) {
266
+ if (method === 'POST') {
267
+ // Money in. Held apart from moving an order along, because "mark
268
+ // this bank transfer received" is the one action a packer should
269
+ // not be able to take on their own say-so.
270
+ permissions.assert('commerce.payment.settle', actor);
271
+ const body = request.body === undefined ? {} : readObject(request.body);
272
+ return {
273
+ status: 200,
274
+ body: await options.payments.settle(segments[1] ?? '', {
275
+ actorId: actor.id,
276
+ ...(typeof body.note === 'string' ? { note: body.note } : {}),
277
+ }),
278
+ };
279
+ }
280
+ }
281
+ if (segments[0] === 'payments' && segments[2] === 'refund' && segments.length === 3) {
282
+ if (method === 'POST') {
283
+ permissions.assert('commerce.order.refund', actor);
284
+ const body = readObject(request.body);
285
+ return {
286
+ status: 200,
287
+ body: await options.payments.refund(segments[1] ?? '', readInt(body, 'amountMinor'), {
288
+ actorId: actor.id,
289
+ ...(typeof body.reason === 'string' ? { reason: body.reason } : {}),
290
+ }),
291
+ };
292
+ }
293
+ }
294
+ // ---- customers ----------------------------------------------------
295
+ if (segments[0] === 'customers' && segments.length === 1 && method === 'GET') {
296
+ permissions.assert('commerce.read', actor);
297
+ return {
298
+ status: 200,
299
+ body: {
300
+ customers: await options.customers.list({
301
+ ...(request.query?.q === undefined ? {} : { search: request.query.q }),
302
+ }),
303
+ },
304
+ };
305
+ }
306
+ // ---- invoices -----------------------------------------------------
307
+ // The PDF, checked before the metadata route below since both start
308
+ // with the same three segments. Its body is the raw bytes, not JSON —
309
+ // the one response in this router that is not: the Node adapter
310
+ // (`cogenta serve`) writes it with `application/pdf` when it sees a
311
+ // `Uint8Array` body instead of serialising it.
312
+ if (segments[0] === 'orders' &&
313
+ segments[2] === 'invoice' &&
314
+ segments[3] === 'pdf' &&
315
+ segments.length === 4) {
316
+ if (method === 'GET') {
317
+ permissions.assert('commerce.read', actor);
318
+ if (options.invoices === undefined)
319
+ return notFound('invoice');
320
+ const invoice = await options.invoices.readByOrder(segments[1] ?? '');
321
+ if (invoice === null)
322
+ return notFound('invoice');
323
+ return { status: 200, body: await options.invoices.pdf(invoice.id) };
324
+ }
325
+ }
326
+ if (segments[0] === 'orders' && segments[2] === 'invoice' && segments.length === 3) {
327
+ if (method === 'GET') {
328
+ permissions.assert('commerce.read', actor);
329
+ if (options.invoices === undefined)
330
+ return notFound('invoice');
331
+ const invoice = await options.invoices.readByOrder(segments[1] ?? '');
332
+ if (invoice === null)
333
+ return notFound('invoice');
334
+ return { status: 200, body: invoice };
335
+ }
336
+ if (method === 'POST') {
337
+ permissions.assert('commerce.invoice.issue', actor);
338
+ if (options.invoices === undefined) {
339
+ throw new CogentaError({
340
+ code: 'COMMERCE_INVOICE_NOT_FOUND',
341
+ message: 'Invoicing is not configured on this site.',
342
+ hint: 'Provide seller details to createInvoiceStore and pass it to the router.',
343
+ });
344
+ }
345
+ const body = request.body === undefined ? {} : readObject(request.body);
346
+ return {
347
+ status: 201,
348
+ body: await options.invoices.issue({
349
+ orderId: segments[1] ?? '',
350
+ actorId: actor.id,
351
+ ...(typeof body.series === 'string' ? { series: body.series } : {}),
352
+ }),
353
+ };
354
+ }
355
+ }
356
+ // ---- coupons --------------------------------------------------------
357
+ if (segments[0] === 'coupons' && segments.length === 1) {
358
+ if (method === 'GET') {
359
+ permissions.assert('commerce.read', actor);
360
+ return { status: 200, body: { coupons: await options.coupons.list() } };
361
+ }
362
+ if (method === 'POST') {
363
+ permissions.assert('commerce.catalog.write', actor);
364
+ const body = readObject(request.body);
365
+ const kind = readString(body, 'kind');
366
+ if (!COUPON_KINDS.includes(kind)) {
367
+ throw new CogentaError({
368
+ code: 'COMMERCE_COUPON_INVALID',
369
+ message: `"${kind}" is not a coupon kind.`,
370
+ hint: `Use one of: ${COUPON_KINDS.join(', ')}.`,
371
+ });
372
+ }
373
+ return {
374
+ status: 201,
375
+ body: await options.coupons.create({
376
+ code: readString(body, 'code'),
377
+ kind: kind,
378
+ ...(typeof body.value === 'number' ? { value: body.value } : {}),
379
+ ...(typeof body.currency === 'string' ? { currency: body.currency } : {}),
380
+ ...(typeof body.minSubtotalMinor === 'number'
381
+ ? { minSubtotalMinor: body.minSubtotalMinor }
382
+ : {}),
383
+ ...(typeof body.startsAt === 'string' ? { startsAt: body.startsAt } : {}),
384
+ ...(typeof body.endsAt === 'string' ? { endsAt: body.endsAt } : {}),
385
+ ...(typeof body.maxRedemptions === 'number'
386
+ ? { maxRedemptions: body.maxRedemptions }
387
+ : {}),
388
+ }),
389
+ };
390
+ }
391
+ }
392
+ if (segments[0] === 'coupons' && segments[2] === 'deactivate' && segments.length === 3) {
393
+ if (method === 'POST') {
394
+ permissions.assert('commerce.catalog.write', actor);
395
+ await options.coupons.deactivate(segments[1] ?? '');
396
+ return { status: 204, body: null };
397
+ }
398
+ }
399
+ // ---- subscriptions --------------------------------------------------
400
+ if (segments[0] === 'subscriptions' && segments.length === 1) {
401
+ if (options.subscriptions === undefined) {
402
+ return {
403
+ status: 404,
404
+ body: {
405
+ error: {
406
+ code: 'COMMERCE_SUBSCRIPTION_NOT_FOUND',
407
+ message: 'Subscriptions are not configured on this site.',
408
+ },
409
+ },
410
+ };
411
+ }
412
+ if (method === 'GET') {
413
+ permissions.assert('commerce.read', actor);
414
+ const status = request.query?.status;
415
+ return {
416
+ status: 200,
417
+ body: {
418
+ subscriptions: await options.subscriptions.list(status === 'active' || status === 'paused' || status === 'cancelled'
419
+ ? { status }
420
+ : {}),
421
+ },
422
+ };
423
+ }
424
+ }
425
+ if (segments[0] === 'subscriptions' &&
426
+ segments.length === 3 &&
427
+ (segments[2] === 'pause' || segments[2] === 'resume' || segments[2] === 'cancel')) {
428
+ if (options.subscriptions === undefined) {
429
+ return {
430
+ status: 404,
431
+ body: {
432
+ error: {
433
+ code: 'COMMERCE_SUBSCRIPTION_NOT_FOUND',
434
+ message: 'Subscriptions are not configured on this site.',
435
+ },
436
+ },
437
+ };
438
+ }
439
+ if (method === 'POST') {
440
+ permissions.assert('commerce.order.write', actor);
441
+ const id = segments[1] ?? '';
442
+ const subscriptions = options.subscriptions;
443
+ const action = segments[2];
444
+ const updated = action === 'pause'
445
+ ? await subscriptions.pause(id)
446
+ : action === 'resume'
447
+ ? await subscriptions.resume(id)
448
+ : await subscriptions.cancel(id);
449
+ return { status: 200, body: updated };
450
+ }
451
+ }
452
+ return { status: 405, body: { error: { code: 'INTERNAL', message: 'No such route.' } } };
453
+ }
454
+ catch (error) {
455
+ return errorResponse(error);
456
+ }
457
+ },
458
+ };
459
+ }
460
+ const NOT_FOUND_CODES = {
461
+ product: 'COMMERCE_PRODUCT_NOT_FOUND',
462
+ order: 'COMMERCE_ORDER_NOT_FOUND',
463
+ invoice: 'COMMERCE_INVOICE_NOT_FOUND',
464
+ };
465
+ function notFound(what) {
466
+ return {
467
+ status: 404,
468
+ body: {
469
+ error: {
470
+ code: NOT_FOUND_CODES[what] ?? 'COMMERCE_ORDER_NOT_FOUND',
471
+ message: `This ${what} does not exist.`,
472
+ },
473
+ },
474
+ };
475
+ }
476
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/admin/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { CogentaError, type DatabaseHandle } from '@cogenta/core';
2
+ import type { CatalogStore } from '../catalog/store.js';
3
+ import type { CouponStore } from '../coupon/store.js';
4
+ import type { ShippingStore } from '../shipping/store.js';
5
+ import type { TaxStore, TaxZone } from '../tax/store.js';
6
+ import type { Totals } from './totals.js';
7
+ export declare const CART_STATUSES: readonly ['open', 'ordered', 'abandoned'];
8
+ export type CartStatus = (typeof CART_STATUSES)[number];
9
+ export interface CartLine {
10
+ readonly id: string;
11
+ readonly variantId: string;
12
+ readonly quantity: number;
13
+ /** The price when the line was added, so a shopper is shown what they were told. */
14
+ readonly unitPriceMinor: number;
15
+ }
16
+ export interface Cart {
17
+ readonly id: string;
18
+ readonly customerId: string | null;
19
+ readonly sessionKey: string | null;
20
+ readonly currency: string;
21
+ readonly couponCode: string | null;
22
+ readonly shippingCountry: string | null;
23
+ readonly shippingRegion: string | null;
24
+ readonly shippingMethodId: string | null;
25
+ readonly status: CartStatus;
26
+ readonly orderId: string | null;
27
+ readonly lines: readonly CartLine[];
28
+ readonly createdAt: string;
29
+ readonly updatedAt: string;
30
+ readonly expiresAt: string;
31
+ }
32
+ export interface OpenCartInput {
33
+ readonly currency: string;
34
+ readonly customerId?: string | null;
35
+ readonly sessionKey?: string | null;
36
+ readonly ttlMs?: number;
37
+ }
38
+ /**
39
+ * A priced cart: the cart plus what it currently costs.
40
+ *
41
+ * `priceChanges` is not decoration. A cart is persistent and can be days old,
42
+ * so the catalogue price may have moved since a line was added. Silently
43
+ * charging the new price is how a shop gets a chargeback; silently charging
44
+ * the old one is how it loses money. Naming the difference lets the checkout
45
+ * say "the price of X changed" before anyone pays.
46
+ */
47
+ export interface PricedCart {
48
+ readonly cart: Cart;
49
+ readonly totals: Totals;
50
+ readonly priceChanges: readonly {
51
+ readonly variantId: string;
52
+ readonly wasMinor: number;
53
+ readonly nowMinor: number;
54
+ }[];
55
+ /** Lines whose variant no longer exists. Removed from the totals. */
56
+ readonly missingVariantIds: readonly string[];
57
+ }
58
+ export interface CartStoreDependencies {
59
+ readonly catalog: CatalogStore;
60
+ readonly tax: TaxStore;
61
+ readonly shipping: ShippingStore;
62
+ readonly coupons: CouponStore;
63
+ }
64
+ export interface CartStore {
65
+ open(input: OpenCartInput): Promise<Cart>;
66
+ read(id: string): Promise<Cart | null>;
67
+ /** The open cart for a session or a customer, or null. */
68
+ find(owner: {
69
+ sessionKey?: string;
70
+ customerId?: string;
71
+ }): Promise<Cart | null>;
72
+ addLine(cartId: string, variantId: string, quantity: number): Promise<Cart>;
73
+ setLineQuantity(cartId: string, variantId: string, quantity: number): Promise<Cart>;
74
+ removeLine(cartId: string, variantId: string): Promise<Cart>;
75
+ setAddress(cartId: string, zone: TaxZone | null): Promise<Cart>;
76
+ setShippingMethod(cartId: string, methodId: string | null): Promise<Cart>;
77
+ applyCoupon(cartId: string, code: string | null): Promise<Cart>;
78
+ /** Attaches an anonymous cart to a customer at sign-in. */
79
+ claim(cartId: string, customerId: string): Promise<Cart>;
80
+ price(cartId: string): Promise<PricedCart>;
81
+ abandon(cartId: string): Promise<void>;
82
+ }
83
+ /** Thirty days. Long enough to be a real "saved basket", short enough that the
84
+ * table does not become a graveyard nobody ever prunes. */
85
+ export declare const CART_TTL_MS: number;
86
+ export declare function createCartStore(db: DatabaseHandle, dependencies: CartStoreDependencies, now?: () => number): CartStore;
87
+ /** Turns a coupon check into the message a shopper should actually read. */
88
+ export declare function couponRefusal(check: Exclude<Awaited<ReturnType<CouponStore['check']>>, {
89
+ kind: 'ok';
90
+ }>): CogentaError;
91
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cart/store.ts"],"names":[],"mappings":"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"}