cabloy 5.1.115 → 5.1.116

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 (31) hide show
  1. package/.cabloy-version +1 -1
  2. package/.github/workflows/vona-test-mysql.yml +6 -10
  3. package/.github/workflows/vona-test-pg.yml +6 -10
  4. package/CHANGELOG.md +14 -0
  5. package/cabloy-docs/backend/orm-mutation-guide.md +36 -10
  6. package/cabloy-docs/backend/orm-select-guide.md +15 -10
  7. package/package.json +1 -1
  8. package/vona/packages-vona/vona/package.json +1 -1
  9. package/vona/pnpm-lock.yaml +8 -124
  10. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/sku.test.ts +1 -1
  11. package/vona/src/suite/a-commerce/modules/commerce-member/test/addressOwnership.test.ts +4 -1
  12. package/vona/src/suite/a-commerce/modules/commerce-promotion/src/dto/couponIssue.tsx +1 -1
  13. package/vona/src/suite/a-commerce/modules/commerce-promotion/src/service/coupon.ts +4 -1
  14. package/vona/src/suite/a-commerce/modules/commerce-promotion/test/couponReservation.test.ts +85 -2
  15. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/cart.ts +14 -0
  16. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/order.ts +42 -2
  17. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockBalance.ts +4 -3
  18. package/vona/src/suite/a-commerce/modules/commerce-trade/test/cartOwnership.test.ts +160 -80
  19. package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutReservation.test.ts +255 -1
  20. package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutTransaction.test.ts +208 -0
  21. package/vona/src/suite/a-commerce/modules/commerce-trade/test/orderSnapshot.test.ts +28 -4
  22. package/vona/src/suite/a-commerce/modules/commerce-trade/test/reservationExpiry.test.ts +90 -8
  23. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockBalance.test.ts +15 -1
  24. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockReservation.test.ts +20 -2
  25. package/vona/src/suite/a-commerce/modules/commerce-trade/test/testLock.ts +11 -0
  26. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  27. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_crud_inner.ts +3 -0
  28. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_utils.ts +1 -1
  29. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  30. package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/schemas.ts +40 -32
  31. package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/types.ts +638 -633
@@ -1,31 +1,36 @@
1
1
  import assert from 'node:assert';
2
2
  import { randomUUID } from 'node:crypto';
3
- import { describe, it } from 'node:test';
3
+ import { after, before, describe, it } from 'node:test';
4
4
  import { app } from 'vona-mock';
5
5
 
6
+ import { acquireTestLock } from './testLock.ts';
7
+
6
8
  interface IFixture {
7
9
  categoryId?: number;
8
10
  productId?: number;
9
11
  skuId?: number;
10
12
  balanceId?: number;
13
+ userId?: number;
14
+ couponTemplateId?: number;
15
+ couponGrantId?: number;
11
16
  cartId?: number;
12
17
  addressId?: number;
13
18
  orderId?: number;
14
19
  orderLineId?: number;
15
20
  reservationId?: number;
16
21
  paymentAttemptId?: number;
17
- orderAuditIds?: number[];
18
22
  }
19
23
 
20
24
  async function cleanup(fixture: IFixture) {
21
25
  const trade = app.scope('commerce-trade');
22
26
  const payment = app.scope('commerce-payment');
27
+ const promotion = app.scope('commerce-promotion');
23
28
  const member = app.scope('commerce-member');
24
29
  const catalog = app.scope('commerce-catalog');
25
- if (fixture.paymentAttemptId !== undefined)
26
- await payment.model.paymentAttempt.delete({ id: fixture.paymentAttemptId });
27
30
  if (fixture.orderId !== undefined)
28
31
  await trade.model.orderAudit.delete({ orderId: fixture.orderId });
32
+ if (fixture.paymentAttemptId !== undefined)
33
+ await payment.model.paymentAttempt.delete({ id: fixture.paymentAttemptId });
29
34
  if (fixture.skuId !== undefined) await trade.model.stockAudit.delete({ skuId: fixture.skuId });
30
35
  if (fixture.reservationId !== undefined)
31
36
  await trade.model.stockReservation.delete({ id: fixture.reservationId });
@@ -36,6 +41,17 @@ async function cleanup(fixture: IFixture) {
36
41
  await trade.model.cartItem.delete({ cartId: fixture.cartId });
37
42
  await trade.model.cart.delete({ id: fixture.cartId });
38
43
  }
44
+ if (fixture.addressId !== undefined) await member.model.address.delete({ id: fixture.addressId });
45
+ if (fixture.couponGrantId !== undefined) {
46
+ await promotion.model.couponAudit.delete({ couponGrantId: fixture.couponGrantId });
47
+ await promotion.model.couponGrant.delete({ id: fixture.couponGrantId });
48
+ }
49
+ if (fixture.couponTemplateId !== undefined)
50
+ await promotion.model.couponTemplate.delete({ id: fixture.couponTemplateId });
51
+ if (fixture.userId !== undefined) {
52
+ await app.scope('home-user').model.roleUser.delete({ userId: fixture.userId });
53
+ await app.bean.user.removeById(fixture.userId);
54
+ }
39
55
  if (fixture.balanceId !== undefined)
40
56
  await trade.model.stockBalance.delete({ id: fixture.balanceId });
41
57
  if (fixture.skuId !== undefined) await catalog.model.sku.delete({ id: fixture.skuId });
@@ -43,16 +59,28 @@ async function cleanup(fixture: IFixture) {
43
59
  await catalog.model.product.delete({ id: fixture.productId });
44
60
  if (fixture.categoryId !== undefined)
45
61
  await catalog.model.category.delete({ id: fixture.categoryId });
46
- if (fixture.addressId !== undefined) await member.model.address.delete({ id: fixture.addressId });
47
62
  }
48
63
 
49
- describe('reservationExpiry.test.ts', { concurrency: false }, () => {
64
+ describe('reservationExpiry.test.ts', { concurrency: false, sequential: true }, () => {
65
+ let releaseTestLock: (() => void) | undefined;
66
+
67
+ before(async () => {
68
+ releaseTestLock = await acquireTestLock();
69
+ });
70
+
71
+ after(() => {
72
+ releaseTestLock?.();
73
+ });
74
+
50
75
  it('expires an unpaid order and releases its reservation exactly once', async () => {
51
76
  await app.bean.executor.mockCtx(async () => {
52
77
  const fixture: IFixture = {};
53
78
  const suffix = randomUUID().slice(0, 12);
54
79
  try {
55
- await app.bean.passport.signinMock();
80
+ const customerName = `expiry-customer-${suffix}`;
81
+ const customer = await app.bean.user.register({ name: customerName }, true);
82
+ fixture.userId = customer.id as number;
83
+ await app.bean.passport.signinMock(customerName as any);
56
84
  const userId = app.bean.passport.currentUser!.id;
57
85
  fixture.categoryId = await app.bean.executor.performAction(
58
86
  'post',
@@ -88,6 +116,27 @@ describe('reservationExpiry.test.ts', { concurrency: false }, () => {
88
116
  correlationId: `expiry-stock-${suffix}`,
89
117
  });
90
118
  fixture.balanceId = balance.id as number;
119
+ fixture.couponTemplateId = (
120
+ await app.scope('commerce-promotion').model.couponTemplate.insert({
121
+ name: `expiry-coupon-${suffix}`,
122
+ state: 'active',
123
+ currency: 'USD',
124
+ discountCents: 500,
125
+ minSpendCents: 800,
126
+ validFrom: new Date(Date.now() - 1_000),
127
+ validUntil: new Date(Date.now() + 60_000),
128
+ issuedCount: 0,
129
+ redeemedCount: 0,
130
+ })
131
+ ).id as number;
132
+ fixture.couponGrantId = (
133
+ await app.scope('commerce-promotion').service.coupon.issue({
134
+ templateId: fixture.couponTemplateId,
135
+ userId,
136
+ correlationId: `expiry-coupon-${suffix}`,
137
+ reason: 'expiry fixture',
138
+ })
139
+ ).id as number;
91
140
  fixture.addressId = await app.bean.executor.performAction(
92
141
  'post',
93
142
  '/commerce/member/address',
@@ -112,6 +161,7 @@ describe('reservationExpiry.test.ts', { concurrency: false }, () => {
112
161
  });
113
162
  const created = await app.scope('commerce-trade').service.order.checkout({
114
163
  addressId: fixture.addressId,
164
+ couponGrantId: fixture.couponGrantId,
115
165
  correlationId: `expiry-${suffix}`,
116
166
  });
117
167
  fixture.orderId = created.orderId as number;
@@ -125,7 +175,7 @@ describe('reservationExpiry.test.ts', { concurrency: false }, () => {
125
175
  .model.stockReservation.get({ orderLineId: line?.id });
126
176
  fixture.reservationId = reservation?.id as number;
127
177
  await app.scope('commerce-trade').model.order.updateById(created.orderId, {
128
- reservationExpiresAt: new Date(Date.now() - 1),
178
+ reservationExpiresAt: new Date(Date.now() - 1_000),
129
179
  });
130
180
 
131
181
  assert.equal(
@@ -138,10 +188,42 @@ describe('reservationExpiry.test.ts', { concurrency: false }, () => {
138
188
  );
139
189
  const order = await app.scope('commerce-trade').model.order.getById(created.orderId);
140
190
  assert.equal(order?.state, 'expired');
191
+ const grant = await app
192
+ .scope('commerce-promotion')
193
+ .model.couponGrant.getById(fixture.couponGrantId!);
194
+ assert.equal(grant?.state, 'available');
195
+ assert.equal(grant?.reservationOrderId, undefined);
196
+ assert.equal(grant?.reservationCorrelationId, undefined);
197
+ assert.equal(grant?.reservedAt, undefined);
198
+ const couponAudits = await app.scope('commerce-promotion').model.couponAudit.select({
199
+ where: { couponGrantId: fixture.couponGrantId },
200
+ orders: [['id', 'asc']],
201
+ });
202
+ assert.deepEqual(
203
+ couponAudits.map(item => item.operation),
204
+ ['issue', 'reserve', 'release'],
205
+ );
206
+ assert.equal(couponAudits.filter(item => item.operation === 'release').length, 1);
141
207
  const released = await app
142
208
  .scope('commerce-trade')
143
209
  .model.stockReservation.getById(reservation!.id);
144
210
  assert.equal(released?.state, 'released');
211
+ const releasedBalance = await app
212
+ .scope('commerce-trade')
213
+ .model.stockBalance.getById(fixture.balanceId!);
214
+ assert.deepEqual(
215
+ [releasedBalance?.onHand, releasedBalance?.reserved, releasedBalance?.available],
216
+ [1, 0, 1],
217
+ );
218
+ const stockAudits = await app.scope('commerce-trade').model.stockAudit.select({
219
+ where: { skuId: fixture.skuId },
220
+ orders: [['id', 'asc']],
221
+ });
222
+ assert.deepEqual(
223
+ stockAudits.map(item => item.operation),
224
+ ['adjust', 'reserve', 'release'],
225
+ );
226
+ assert.equal(stockAudits.filter(item => item.operation === 'release').length, 1);
145
227
  const attempt = await app
146
228
  .scope('commerce-payment')
147
229
  .model.paymentAttempt.getById(created.paymentAttemptId);
@@ -3,9 +3,11 @@ import type { DtoStockAdjust, EntityStockBalance } from 'vona-module-commerce-tr
3
3
  import { catchError } from '@cabloy/utils';
4
4
  import assert from 'node:assert';
5
5
  import { randomUUID } from 'node:crypto';
6
- import { describe, it } from 'node:test';
6
+ import { after, before, describe, it } from 'node:test';
7
7
  import { app } from 'vona-mock';
8
8
 
9
+ import { acquireTestLock } from './testLock.ts';
10
+
9
11
  const actionPath = '/commerce/trade/stockBalance/adjustStock';
10
12
 
11
13
  interface IStockFixture {
@@ -80,6 +82,16 @@ async function adjustStock(stockAdjust: DtoStockAdjust): Promise<EntityStockBala
80
82
  }
81
83
 
82
84
  describe('stockBalance.test.ts', { concurrency: false }, () => {
85
+ let releaseTestLock: (() => void) | undefined;
86
+
87
+ before(async () => {
88
+ releaseTestLock = await acquireTestLock();
89
+ });
90
+
91
+ after(() => {
92
+ releaseTestLock?.();
93
+ });
94
+
83
95
  it('action:stockBalance:adjustStock appends an audit with server-scoped balance', async () => {
84
96
  await app.bean.executor.mockCtx(async () => {
85
97
  let fixture: IStockFixture | undefined;
@@ -103,6 +115,7 @@ describe('stockBalance.test.ts', { concurrency: false }, () => {
103
115
 
104
116
  const audits = await app.scope('commerce-trade').model.stockAudit.select({
105
117
  where: { skuId: fixture.skuId },
118
+ orders: [['id', 'asc']],
106
119
  });
107
120
  assert.equal(audits.length, 2);
108
121
  assert.deepEqual(
@@ -141,6 +154,7 @@ describe('stockBalance.test.ts', { concurrency: false }, () => {
141
154
  const [_, err] = await catchError(() =>
142
155
  adjustStock(stockAdjust(fixture.skuId, -3, `${fixture.skuId}-reject`)),
143
156
  );
157
+ assert.equal(err?.code, 409);
144
158
  assert.match(err?.message ?? '', /negative/);
145
159
 
146
160
  const unchanged = await app.scope('commerce-trade').model.stockBalance.getById(balance.id);
@@ -3,9 +3,11 @@ import type { EntityStockReservation } from 'vona-module-commerce-trade';
3
3
  import { catchError } from '@cabloy/utils';
4
4
  import assert from 'node:assert';
5
5
  import { randomUUID } from 'node:crypto';
6
- import { describe, it } from 'node:test';
6
+ import { after, before, describe, it } from 'node:test';
7
7
  import { app } from 'vona-mock';
8
8
 
9
+ import { acquireTestLock } from './testLock.ts';
10
+
9
11
  interface IStockFixture {
10
12
  categoryId: number;
11
13
  productId: number;
@@ -95,7 +97,10 @@ async function assertReservationRejected(skuId: number, suffix: string, expected
95
97
  const balance = await app.scope('commerce-trade').model.stockBalance.get({ skuId });
96
98
  assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [3, 0, 3]);
97
99
  assert.equal(await app.scope('commerce-trade').model.stockReservation.get({ skuId }), undefined);
98
- const audits = await app.scope('commerce-trade').model.stockAudit.select({ where: { skuId } });
100
+ const audits = await app.scope('commerce-trade').model.stockAudit.select({
101
+ where: { skuId },
102
+ orders: [['id', 'asc']],
103
+ });
99
104
  assert.deepEqual(
100
105
  audits.map(audit => audit.operation),
101
106
  ['adjust'],
@@ -103,6 +108,16 @@ async function assertReservationRejected(skuId: number, suffix: string, expected
103
108
  }
104
109
 
105
110
  describe('stockReservation.test.ts', { concurrency: false }, () => {
111
+ let releaseTestLock: (() => void) | undefined;
112
+
113
+ before(async () => {
114
+ releaseTestLock = await acquireTestLock();
115
+ });
116
+
117
+ after(() => {
118
+ releaseTestLock?.();
119
+ });
120
+
106
121
  it('reserves and consumes stock exactly once with traceable audits', async () => {
107
122
  await app.bean.executor.mockCtx(async () => {
108
123
  const fixtures: IStockFixturePartial[] = [];
@@ -149,6 +164,7 @@ describe('stockReservation.test.ts', { concurrency: false }, () => {
149
164
  );
150
165
  const audits = await app.scope('commerce-trade').model.stockAudit.select({
151
166
  where: { skuId: fixture.skuId },
167
+ orders: [['id', 'asc']],
152
168
  });
153
169
  assert.deepEqual(
154
170
  audits.map(audit => audit.operation),
@@ -240,6 +256,7 @@ describe('stockReservation.test.ts', { concurrency: false }, () => {
240
256
  assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [3, 0, 3]);
241
257
  const audits = await app.scope('commerce-trade').model.stockAudit.select({
242
258
  where: { skuId: fixture.skuId },
259
+ orders: [['id', 'asc']],
243
260
  });
244
261
  assert.equal(audits.length, 6);
245
262
  assert.deepEqual(
@@ -368,6 +385,7 @@ describe('stockReservation.test.ts', { concurrency: false }, () => {
368
385
  });
369
386
  const audits = await app.scope('commerce-trade').model.stockAudit.select({
370
387
  where: { skuId: fixture.skuId },
388
+ orders: [['id', 'asc']],
371
389
  });
372
390
  assert.equal(reservations.length, 1);
373
391
  assert.deepEqual(
@@ -0,0 +1,11 @@
1
+ let pending = Promise.resolve();
2
+
3
+ export async function acquireTestLock(): Promise<() => void> {
4
+ const previous = pending;
5
+ let release: () => void;
6
+ pending = new Promise<void>(resolve => {
7
+ release = resolve;
8
+ });
9
+ await previous;
10
+ return release!;
11
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-orm",
3
- "version": "5.1.25",
3
+ "version": "5.1.26",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "db",
6
6
  "keywords": [
@@ -253,6 +253,9 @@ export class BeanModelCrudInner<TRecord extends {}> extends BeanModelView<TRecor
253
253
  if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
254
254
  // data
255
255
  [data] = await this.prepareData(table, data);
256
+ for (const key in data) {
257
+ if (data[key] === undefined) data[key] = null as never;
258
+ }
256
259
  // where
257
260
  const where = Object.assign({}, options?.where);
258
261
  // id
@@ -49,7 +49,7 @@ export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
49
49
  if (Object.prototype.hasOwnProperty.call(item, columnName)) {
50
50
  let value = item[columnName];
51
51
  dataOriginal[columnName] = value;
52
- if (column.type === 'json' && value !== undefined) {
52
+ if (column.type === 'json' && !isNil(value)) {
53
53
  value = JSON.stringify(value);
54
54
  }
55
55
  data[columnName] = value;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-suite-a-vona",
3
- "version": "5.1.72",
3
+ "version": "5.1.73",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "author": "",
@@ -28,6 +28,38 @@ export type ApiSchemaCommerceMemberDtoAddressUpdate =
28
28
  components['schemas']['commerce-member.dto.addressUpdate'];
29
29
  export type ApiSchemaCommerceMemberDtoAddressUpdatePartial =
30
30
  Partial<ApiSchemaCommerceMemberDtoAddressUpdate>;
31
+ export type ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305b =
32
+ components['schemas']['home-user.dto.passport_2d063d28bc7243bed02ebd8bddf1212a93c6305b'];
33
+ export type ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305bPartial =
34
+ Partial<ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305b>;
35
+ export type ApiSchemaHomeUserEntityUser = components['schemas']['home-user.entity.user'];
36
+ export type ApiSchemaHomeUserEntityUserPartial = Partial<ApiSchemaHomeUserEntityUser>;
37
+ export type ApiSchemaAAuthDtoAuth = components['schemas']['a-auth.dto.auth'];
38
+ export type ApiSchemaAAuthDtoAuthPartial = Partial<ApiSchemaAAuthDtoAuth>;
39
+ export type ApiSchemaHomeUserEntityRole = components['schemas']['home-user.entity.role'];
40
+ export type ApiSchemaHomeUserEntityRolePartial = Partial<ApiSchemaHomeUserEntityRole>;
41
+ export type ApiSchemaHomeUserDtoPassportJwt = components['schemas']['home-user.dto.passportJwt'];
42
+ export type ApiSchemaHomeUserDtoPassportJwtPartial = Partial<ApiSchemaHomeUserDtoPassportJwt>;
43
+ export type ApiSchemaHomeUserDtoPassport = components['schemas']['home-user.dto.passport'];
44
+ export type ApiSchemaHomeUserDtoPassportPartial = Partial<ApiSchemaHomeUserDtoPassport>;
45
+ export type ApiSchemaAJwtDtoJwtToken = components['schemas']['a-jwt.dto.jwtToken'];
46
+ export type ApiSchemaAJwtDtoJwtTokenPartial = Partial<ApiSchemaAJwtDtoJwtToken>;
47
+ export type ApiSchemaHomeUserDtoRegister = components['schemas']['home-user.dto.register'];
48
+ export type ApiSchemaHomeUserDtoRegisterPartial = Partial<ApiSchemaHomeUserDtoRegister>;
49
+ export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9 =
50
+ components['schemas']['a-captcha.dto.captchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9'];
51
+ export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9Partial =
52
+ Partial<ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9>;
53
+ export type ApiSchemaHomeUserDtoLogin = components['schemas']['home-user.dto.login'];
54
+ export type ApiSchemaHomeUserDtoLoginPartial = Partial<ApiSchemaHomeUserDtoLogin>;
55
+ export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661 =
56
+ components['schemas']['a-captcha.dto.captchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661'];
57
+ export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661Partial =
58
+ Partial<ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661>;
59
+ export type ApiSchemaCommerceSiteadminDtoOperatorContext =
60
+ components['schemas']['commerce-siteadmin.dto.operatorContext'];
61
+ export type ApiSchemaCommerceSiteadminDtoOperatorContextPartial =
62
+ Partial<ApiSchemaCommerceSiteadminDtoOperatorContext>;
31
63
  export type ApiSchemaCommercePromotionDtoCouponMineItem =
32
64
  components['schemas']['commerce-promotion.dto.couponMineItem'];
33
65
  export type ApiSchemaCommercePromotionDtoCouponMineItemPartial =
@@ -70,6 +102,14 @@ export type ApiSchemaCommerceTradeDtoCartUpdateItem =
70
102
  components['schemas']['commerce-trade.dto.cartUpdateItem'];
71
103
  export type ApiSchemaCommerceTradeDtoCartUpdateItemPartial =
72
104
  Partial<ApiSchemaCommerceTradeDtoCartUpdateItem>;
105
+ export type ApiSchemaCommerceTradeDtoCheckoutResult =
106
+ components['schemas']['commerce-trade.dto.checkoutResult'];
107
+ export type ApiSchemaCommerceTradeDtoCheckoutResultPartial =
108
+ Partial<ApiSchemaCommerceTradeDtoCheckoutResult>;
109
+ export type ApiSchemaCommerceTradeDtoCheckoutCreate =
110
+ components['schemas']['commerce-trade.dto.checkoutCreate'];
111
+ export type ApiSchemaCommerceTradeDtoCheckoutCreatePartial =
112
+ Partial<ApiSchemaCommerceTradeDtoCheckoutCreate>;
73
113
  export type ApiSchemaCommerceTradeDtoStockAuditSelectRes =
74
114
  components['schemas']['commerce-trade.dto.stockAuditSelectRes'];
75
115
  export type ApiSchemaCommerceTradeDtoStockAuditSelectResPartial =
@@ -182,38 +222,6 @@ export type ApiSchemaCommerceCatalogDtoSkuUpdate =
182
222
  components['schemas']['commerce-catalog.dto.skuUpdate'];
183
223
  export type ApiSchemaCommerceCatalogDtoSkuUpdatePartial =
184
224
  Partial<ApiSchemaCommerceCatalogDtoSkuUpdate>;
185
- export type ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305b =
186
- components['schemas']['home-user.dto.passport_2d063d28bc7243bed02ebd8bddf1212a93c6305b'];
187
- export type ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305bPartial =
188
- Partial<ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305b>;
189
- export type ApiSchemaHomeUserEntityUser = components['schemas']['home-user.entity.user'];
190
- export type ApiSchemaHomeUserEntityUserPartial = Partial<ApiSchemaHomeUserEntityUser>;
191
- export type ApiSchemaAAuthDtoAuth = components['schemas']['a-auth.dto.auth'];
192
- export type ApiSchemaAAuthDtoAuthPartial = Partial<ApiSchemaAAuthDtoAuth>;
193
- export type ApiSchemaHomeUserEntityRole = components['schemas']['home-user.entity.role'];
194
- export type ApiSchemaHomeUserEntityRolePartial = Partial<ApiSchemaHomeUserEntityRole>;
195
- export type ApiSchemaHomeUserDtoPassportJwt = components['schemas']['home-user.dto.passportJwt'];
196
- export type ApiSchemaHomeUserDtoPassportJwtPartial = Partial<ApiSchemaHomeUserDtoPassportJwt>;
197
- export type ApiSchemaHomeUserDtoPassport = components['schemas']['home-user.dto.passport'];
198
- export type ApiSchemaHomeUserDtoPassportPartial = Partial<ApiSchemaHomeUserDtoPassport>;
199
- export type ApiSchemaAJwtDtoJwtToken = components['schemas']['a-jwt.dto.jwtToken'];
200
- export type ApiSchemaAJwtDtoJwtTokenPartial = Partial<ApiSchemaAJwtDtoJwtToken>;
201
- export type ApiSchemaHomeUserDtoRegister = components['schemas']['home-user.dto.register'];
202
- export type ApiSchemaHomeUserDtoRegisterPartial = Partial<ApiSchemaHomeUserDtoRegister>;
203
- export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9 =
204
- components['schemas']['a-captcha.dto.captchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9'];
205
- export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9Partial =
206
- Partial<ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9>;
207
- export type ApiSchemaHomeUserDtoLogin = components['schemas']['home-user.dto.login'];
208
- export type ApiSchemaHomeUserDtoLoginPartial = Partial<ApiSchemaHomeUserDtoLogin>;
209
- export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661 =
210
- components['schemas']['a-captcha.dto.captchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661'];
211
- export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661Partial =
212
- Partial<ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661>;
213
- export type ApiSchemaCommerceSiteadminDtoOperatorContext =
214
- components['schemas']['commerce-siteadmin.dto.operatorContext'];
215
- export type ApiSchemaCommerceSiteadminDtoOperatorContextPartial =
216
- Partial<ApiSchemaCommerceSiteadminDtoOperatorContext>;
217
225
  export type ApiSchemaAMenuDtoMenus = components['schemas']['a-menu.dto.menus'];
218
226
  export type ApiSchemaAMenuDtoMenusPartial = Partial<ApiSchemaAMenuDtoMenus>;
219
227
  export type ApiSchemaAMenuDtoMenuItem = components['schemas']['a-menu.dto.menuItem'];