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.
- package/.cabloy-version +1 -1
- package/.github/workflows/vona-test-mysql.yml +6 -10
- package/.github/workflows/vona-test-pg.yml +6 -10
- package/CHANGELOG.md +14 -0
- package/cabloy-docs/backend/orm-mutation-guide.md +36 -10
- package/cabloy-docs/backend/orm-select-guide.md +15 -10
- package/package.json +1 -1
- package/vona/packages-vona/vona/package.json +1 -1
- package/vona/pnpm-lock.yaml +8 -124
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/sku.test.ts +1 -1
- package/vona/src/suite/a-commerce/modules/commerce-member/test/addressOwnership.test.ts +4 -1
- package/vona/src/suite/a-commerce/modules/commerce-promotion/src/dto/couponIssue.tsx +1 -1
- package/vona/src/suite/a-commerce/modules/commerce-promotion/src/service/coupon.ts +4 -1
- package/vona/src/suite/a-commerce/modules/commerce-promotion/test/couponReservation.test.ts +85 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/cart.ts +14 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/order.ts +42 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockBalance.ts +4 -3
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/cartOwnership.test.ts +160 -80
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutReservation.test.ts +255 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutTransaction.test.ts +208 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/orderSnapshot.test.ts +28 -4
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/reservationExpiry.test.ts +90 -8
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockBalance.test.ts +15 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockReservation.test.ts +20 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/testLock.ts +11 -0
- package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_crud_inner.ts +3 -0
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_utils.ts +1 -1
- package/vona/src/suite-vendor/a-vona/package.json +1 -1
- package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/schemas.ts +40 -32
- 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
|
-
|
|
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() -
|
|
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({
|
|
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
|
+
}
|
package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_crud_inner.ts
CHANGED
|
@@ -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
|
|
52
|
+
if (column.type === 'json' && !isNil(value)) {
|
|
53
53
|
value = JSON.stringify(value);
|
|
54
54
|
}
|
|
55
55
|
data[columnName] = value;
|
|
@@ -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'];
|