@sayren/store-sdk 0.15.1 → 0.17.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.
- package/dist/index.d.mts +2264 -134
- package/dist/index.mjs +1408 -147
- package/package.json +1 -1
- package/src/client.ts +188 -1
- package/src/index.ts +5 -0
- package/src/schemas/claim.ts +24 -2
- package/src/schemas/coupon.ts +312 -0
- package/src/schemas/digital-asset.ts +65 -0
- package/src/schemas/fulfillment-code.ts +143 -0
- package/src/schemas/fulfillment.ts +145 -0
- package/src/schemas/misc.ts +7 -1
- package/src/schemas/order.ts +206 -6
- package/src/schemas/product.ts +147 -14
- package/src/schemas/promotion.ts +806 -0
- package/src/schemas/refund-policy.ts +24 -2
- package/src/schemas/scope.ts +4 -0
- package/src/schemas/shipping-policy.ts +28 -3
- package/src/schemas/store.ts +32 -1
- package/src/schemas/upload.ts +48 -2
- package/src/schemas/webhook-event.ts +148 -0
package/src/schemas/product.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { type PageParams, pageQueryShape } from "./common";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
fulfillmentModeSchema,
|
|
5
|
+
fulfillmentTypeResponseSchema,
|
|
6
|
+
fulfillmentTypeSchema,
|
|
7
|
+
} from "./fulfillment";
|
|
8
|
+
import { productRefundPolicyPatchSchema } from "./refund-policy";
|
|
4
9
|
import { UPLOAD_PURPOSE_LIMITS, uploadExtensionOf } from "./upload";
|
|
5
10
|
|
|
6
11
|
export const productStatusSchema = z.enum(["SALE", "SUSPENDED", "OUT_OF_STOCK", "CLOSED"]);
|
|
@@ -27,6 +32,7 @@ export const productSummarySchema = z.object({
|
|
|
27
32
|
thumbnailUrl: z.url().optional(),
|
|
28
33
|
/** optionGroups.length > 0 */
|
|
29
34
|
hasOptions: z.boolean(),
|
|
35
|
+
fulfillmentType: fulfillmentTypeResponseSchema.optional().default("SHIPPING"),
|
|
30
36
|
updatedAt: z.string(),
|
|
31
37
|
});
|
|
32
38
|
|
|
@@ -73,6 +79,69 @@ export const productVariantSchema = z.object({
|
|
|
73
79
|
|
|
74
80
|
export type ProductVariant = z.infer<typeof productVariantSchema>;
|
|
75
81
|
|
|
82
|
+
export const discountSchema = z.object({
|
|
83
|
+
productId: z.string(),
|
|
84
|
+
discountType: z.enum(["RATE", "AMOUNT"]),
|
|
85
|
+
discountValue: z.number().int(),
|
|
86
|
+
discountedPrice: z.number().int(),
|
|
87
|
+
startAt: z.string().nullable(),
|
|
88
|
+
endAt: z.string().nullable(),
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
export type Discount = z.infer<typeof discountSchema>;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* 상품 유형 응답 필드 (이슈 #48) — 이 필드 이전 서버의 응답에는 없으므로 기본값을 둔다. 서버는 항상 싣는다.
|
|
95
|
+
*/
|
|
96
|
+
function productFulfillmentResponseShape() {
|
|
97
|
+
return {
|
|
98
|
+
fulfillmentType: fulfillmentTypeResponseSchema.optional().default("SHIPPING"),
|
|
99
|
+
fulfillmentMode: z
|
|
100
|
+
.string()
|
|
101
|
+
.nullable()
|
|
102
|
+
.optional()
|
|
103
|
+
.default(null)
|
|
104
|
+
.describe(
|
|
105
|
+
"제공 방식. `AUTO`(결제 확정과 함께 제공)·`MANUAL`(셀러가 제공 처리). 배송 상품은 null. 값이 추가될 수 있어 문자열로 받는다",
|
|
106
|
+
),
|
|
107
|
+
stockTracking: z
|
|
108
|
+
.boolean()
|
|
109
|
+
.optional()
|
|
110
|
+
.default(true)
|
|
111
|
+
.describe("재고를 세는가. false면 재고와 무관하게 판다(파일 다운로드 기본)"),
|
|
112
|
+
downloadLimit: z
|
|
113
|
+
.number()
|
|
114
|
+
.int()
|
|
115
|
+
.nullable()
|
|
116
|
+
.optional()
|
|
117
|
+
.default(null)
|
|
118
|
+
.describe("파일 다운로드 횟수 한도. 파일 다운로드 상품이 아니면 null"),
|
|
119
|
+
downloadDays: z
|
|
120
|
+
.number()
|
|
121
|
+
.int()
|
|
122
|
+
.nullable()
|
|
123
|
+
.optional()
|
|
124
|
+
.default(null)
|
|
125
|
+
.describe("파일 다운로드 기간(제공일부터 일수). 파일 다운로드 상품이 아니면 null"),
|
|
126
|
+
withdrawalRestricted: z
|
|
127
|
+
.boolean()
|
|
128
|
+
.optional()
|
|
129
|
+
.default(false)
|
|
130
|
+
.describe(
|
|
131
|
+
"청약철회 제한 대상인가. 파일 다운로드·코드 발급 상품만 켤 수 있다(그 밖의 유형은 false로 저장한다). " +
|
|
132
|
+
"true면 주문서에서 제한 고지에 대한 구매자 동의를 받고, 첫 다운로드·열람 뒤 구매자 취소·반품을 받지 않는다",
|
|
133
|
+
),
|
|
134
|
+
pickupAddressId: z
|
|
135
|
+
.string()
|
|
136
|
+
.nullable()
|
|
137
|
+
.optional()
|
|
138
|
+
.default(null)
|
|
139
|
+
.describe(
|
|
140
|
+
"방문 수령지 주소 id(`seller_addresses`, 유형 PICKUP). 방문 수령 상품이 아니면 null",
|
|
141
|
+
),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
76
145
|
export const productSchema = productSummarySchema.extend({
|
|
77
146
|
description: z.string().optional(),
|
|
78
147
|
/**
|
|
@@ -91,12 +160,23 @@ export const productSchema = productSummarySchema.extend({
|
|
|
91
160
|
conditionalFreeAmount: z.number().int().nullable().optional(),
|
|
92
161
|
returnFee: z.number().int().optional(),
|
|
93
162
|
exchangeFee: z.number().int().optional(),
|
|
94
|
-
refundPolicy:
|
|
163
|
+
refundPolicy: productRefundPolicyPatchSchema
|
|
95
164
|
.nullable()
|
|
96
165
|
.optional()
|
|
97
166
|
.describe("상품별 환불 정책 덮어쓰기. null이면 스토어 기본 환불 정책을 쓴다"),
|
|
98
167
|
shippingAddressId: z.string().nullable().optional(),
|
|
99
168
|
returnAddressId: z.string().nullable().optional(),
|
|
169
|
+
...productFulfillmentResponseShape(),
|
|
170
|
+
/**
|
|
171
|
+
* 설정된 즉시할인. `GET /products/{productId}/discount`의 응답과 같은 형태다(이슈 #51).
|
|
172
|
+
* 할인이 없으면 null이다. 이 필드를 싣기 전 서버의 응답에는 없으므로 optional이다.
|
|
173
|
+
*/
|
|
174
|
+
discount: discountSchema
|
|
175
|
+
.nullable()
|
|
176
|
+
.optional()
|
|
177
|
+
.describe(
|
|
178
|
+
"설정된 즉시할인. GET /v1/products/{productId}/discount 응답과 같은 형태다. 할인이 없으면 null",
|
|
179
|
+
),
|
|
100
180
|
createdAt: z.string().optional(),
|
|
101
181
|
});
|
|
102
182
|
|
|
@@ -281,6 +361,68 @@ const ADDRESS_DESCRIPTIONS = {
|
|
|
281
361
|
"이 스토어의 `RETURN` 주소가 아니면 거부한다",
|
|
282
362
|
} as const;
|
|
283
363
|
|
|
364
|
+
/**
|
|
365
|
+
* 상품 유형 요청 필드 (이슈 #48) — 등록·전체 수정·부분 수정이 같은 필드를 받는다.
|
|
366
|
+
*
|
|
367
|
+
* 생략의 뜻: 등록은 배송 상품(`SHIPPING`)과 유형 기본값이고, 전체 수정(PUT)·부분 수정(PATCH)은 **현재 값을 유지**한다.
|
|
368
|
+
* 이 필드를 모르는 옛 클라이언트가 전체 수정을 보내도 유형이 배송 상품으로 되돌아가지 않게 한다.
|
|
369
|
+
*/
|
|
370
|
+
function productFulfillmentRequestShape() {
|
|
371
|
+
return {
|
|
372
|
+
fulfillmentType: fulfillmentTypeSchema
|
|
373
|
+
.optional()
|
|
374
|
+
.describe(
|
|
375
|
+
"상품 유형. `SHIPPING` 배송 상품 · `DOWNLOAD` 파일 다운로드 · `CODE` 코드 발급 · `SERVICE` 이용권·서비스 · `PICKUP` 방문 수령. " +
|
|
376
|
+
"등록에서 생략하면 SHIPPING이고, 수정에서 생략하면 바꾸지 않는다. 판매 이력이 있는 상품의 유형은 바꿀 수 없다" +
|
|
377
|
+
"(409 `FULFILLMENT_TYPE_LOCKED`). 배송 상품이 아니면 배송비·출고지·반품지·반품비·교환비를 무시하고 0·null로 저장한다",
|
|
378
|
+
),
|
|
379
|
+
fulfillmentMode: fulfillmentModeSchema
|
|
380
|
+
.nullable()
|
|
381
|
+
.optional()
|
|
382
|
+
.describe(
|
|
383
|
+
"제공 방식. `AUTO` 결제 확정과 함께 제공 · `MANUAL` 셀러가 제공 처리. 생략·null이면 유형 기본값이다" +
|
|
384
|
+
"(코드 발급 AUTO, 이용권 MANUAL, 파일 다운로드 AUTO만, 방문 수령 MANUAL만). 배송 상품은 무시한다",
|
|
385
|
+
),
|
|
386
|
+
stockTracking: z
|
|
387
|
+
.boolean()
|
|
388
|
+
.optional()
|
|
389
|
+
.describe(
|
|
390
|
+
"재고를 세는가. 파일 다운로드 상품만 끌 수 있다(기본 false). 그 밖의 유형은 항상 true",
|
|
391
|
+
),
|
|
392
|
+
downloadLimit: z
|
|
393
|
+
.number()
|
|
394
|
+
.int()
|
|
395
|
+
.min(1)
|
|
396
|
+
.max(100)
|
|
397
|
+
.nullable()
|
|
398
|
+
.optional()
|
|
399
|
+
.describe("파일 다운로드 횟수 한도. 파일 다운로드 상품만 쓰고 생략·null이면 5회"),
|
|
400
|
+
downloadDays: z
|
|
401
|
+
.number()
|
|
402
|
+
.int()
|
|
403
|
+
.min(1)
|
|
404
|
+
.max(3650)
|
|
405
|
+
.nullable()
|
|
406
|
+
.optional()
|
|
407
|
+
.describe(
|
|
408
|
+
"파일 다운로드 기간(제공일부터 일수). 파일 다운로드 상품만 쓰고 생략·null이면 30일",
|
|
409
|
+
),
|
|
410
|
+
withdrawalRestricted: z
|
|
411
|
+
.boolean()
|
|
412
|
+
.optional()
|
|
413
|
+
.describe(
|
|
414
|
+
"청약철회 제한 대상인가. true면 주문서가 제한 고지를 보여 주고 구매자 동의를 받는다. 배송 상품은 false로 저장한다",
|
|
415
|
+
),
|
|
416
|
+
pickupAddressId: z
|
|
417
|
+
.string()
|
|
418
|
+
.nullable()
|
|
419
|
+
.optional()
|
|
420
|
+
.describe(
|
|
421
|
+
"방문 수령지 주소 id(`GET /v1/seller-addresses?type=PICKUP`). 방문 수령 상품만 쓴다. 생략하면 스토어 기본 방문 수령지를 저장한다",
|
|
422
|
+
),
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
|
|
284
426
|
export const productCreateRequestSchema = z
|
|
285
427
|
.object({
|
|
286
428
|
name: z.string().min(1).max(100),
|
|
@@ -332,7 +474,7 @@ export const productCreateRequestSchema = z
|
|
|
332
474
|
.int()
|
|
333
475
|
.default(0)
|
|
334
476
|
.describe("교환 배송비. 원 단위. `refundPolicy.exchangeDeliveryFee`와 같은 값이다"),
|
|
335
|
-
refundPolicy:
|
|
477
|
+
refundPolicy: productRefundPolicyPatchSchema
|
|
336
478
|
.nullish()
|
|
337
479
|
.describe(
|
|
338
480
|
"상품별 환불 정책 — 준 항목만 스토어 기본을 덮어쓴다. `null`이나 생략은 스토어 기본을 그대로 쓴다는 뜻이다. " +
|
|
@@ -340,6 +482,7 @@ export const productCreateRequestSchema = z
|
|
|
340
482
|
),
|
|
341
483
|
shippingAddressId: z.string().nullable().optional().describe(ADDRESS_DESCRIPTIONS.shipping),
|
|
342
484
|
returnAddressId: z.string().nullable().optional().describe(ADDRESS_DESCRIPTIONS.return),
|
|
485
|
+
...productFulfillmentRequestShape(),
|
|
343
486
|
})
|
|
344
487
|
.extend(optionModelRequestSchema.shape);
|
|
345
488
|
|
|
@@ -358,6 +501,7 @@ export const productPatchRequestSchema = z
|
|
|
358
501
|
.optional()
|
|
359
502
|
.describe(ADDRESS_DESCRIPTIONS.patchShipping),
|
|
360
503
|
returnAddressId: z.string().nullable().optional().describe(ADDRESS_DESCRIPTIONS.patchReturn),
|
|
504
|
+
...productFulfillmentRequestShape(),
|
|
361
505
|
})
|
|
362
506
|
.refine((value) => Object.values(value).some((v) => v !== undefined), {
|
|
363
507
|
message: "최소 1개 필드가 필요합니다",
|
|
@@ -396,17 +540,6 @@ export const productListQuerySchema = z.object({
|
|
|
396
540
|
...pageQueryShape(),
|
|
397
541
|
});
|
|
398
542
|
|
|
399
|
-
export const discountSchema = z.object({
|
|
400
|
-
productId: z.string(),
|
|
401
|
-
discountType: z.enum(["RATE", "AMOUNT"]),
|
|
402
|
-
discountValue: z.number().int(),
|
|
403
|
-
discountedPrice: z.number().int(),
|
|
404
|
-
startAt: z.string().nullable(),
|
|
405
|
-
endAt: z.string().nullable(),
|
|
406
|
-
});
|
|
407
|
-
|
|
408
|
-
export type Discount = z.infer<typeof discountSchema>;
|
|
409
|
-
|
|
410
543
|
export const discountRequestSchema = z.object({
|
|
411
544
|
discountType: z.enum(["RATE", "AMOUNT"]),
|
|
412
545
|
discountValue: z.number().int().min(1),
|