@sayren/store-sdk 0.1.0 → 0.1.1

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.mjs CHANGED
@@ -409,6 +409,72 @@ const categoryPatchRequestSchema = z.object({
409
409
  metaKeywords: z.string().max(200).nullable().optional()
410
410
  });
411
411
  const categoryDeleteStrategySchema = z.enum(["reparent", "cascade"]);
412
+ /**
413
+ * `GET /v1/categories` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열). 응답 형태가 쿼리로 갈린다:
414
+ * `q`가 있으면 검색 결과(`CategorySearchResult[]`), 아니면 `tree=true`일 때 트리(`CategoryTreeNode[]`),
415
+ * 둘 다 아니면 목록(`Category[]`)이다.
416
+ */
417
+ const categoryListQuerySchema = z.object({
418
+ parentId: z.string().optional().describe("이 카테고리의 직계 자식만. 생략하면 최상위 카테고리. `flat=true`면 무시"),
419
+ flat: z.enum(["true", "false"]).optional().describe("`true`면 전체 카테고리를 깊이·순서대로 평탄화"),
420
+ tree: z.enum(["true", "false"]).optional().describe("`true`면 최상위부터 `children`을 채운 트리(`CategoryTreeNode[]`)를 돌려준다"),
421
+ q: z.string().optional().describe("이름 검색(포함, 대소문자 무시). 주면 `fullPath`·`ancestors`가 붙은 검색 결과를 돌려준다")
422
+ });
423
+ /** `DELETE /v1/categories/{categoryId}` 쿼리 — OpenAPI 문서용 형태 */
424
+ const categoryDeleteQuerySchema = z.object({ strategy: categoryDeleteStrategySchema.optional().describe("하위 카테고리·연결 상품 처리 방식. 생략하면 둘 중 하나라도 있을 때 409 `CATEGORY_NOT_EMPTY`다. `reparent`는 직계 자식을 삭제할 카테고리의 부모로 옮기고, `cascade`는 서브트리를 삭제하고 연결 상품을 미분류로 둔다") });
425
+ //#endregion
426
+ //#region src/schemas/common.ts
427
+ const pageInfoSchema = z.object({
428
+ page: z.number().int(),
429
+ size: z.number().int(),
430
+ totalElements: z.number().int(),
431
+ totalPages: z.number().int()
432
+ });
433
+ function pageSchema(item) {
434
+ return pageInfoSchema.extend({ contents: z.array(item) });
435
+ }
436
+ /**
437
+ * 목록 쿼리의 `page`·`size` — OpenAPI 문서용 형태(값은 쿼리 문자열). 서버는 숫자가 아니거나 범위를 벗어난
438
+ * 값을 기본값·상한으로 보정한다.
439
+ */
440
+ function pageQueryShape(options = {}) {
441
+ const { defaultSize = 20, maxSize = 100 } = options;
442
+ return {
443
+ page: z.string().optional().describe("페이지 번호 (1부터, 기본 1)"),
444
+ size: z.string().optional().describe(`페이지 크기 (기본 ${defaultSize}, 최대 ${maxSize})`)
445
+ };
446
+ }
447
+ const bulkResultSchema = z.object({
448
+ succeeded: z.array(z.string()),
449
+ failed: z.array(z.object({
450
+ id: z.string().optional(),
451
+ productId: z.string().optional(),
452
+ orderItemId: z.string().optional(),
453
+ code: z.string(),
454
+ message: z.string()
455
+ }))
456
+ });
457
+ const orderItemStatusSchema = z.enum([
458
+ "PAYMENT_WAITING",
459
+ "PAID",
460
+ "CONFIRMED",
461
+ "DISPATCHED",
462
+ "DELIVERING",
463
+ "DELIVERED",
464
+ "PURCHASE_DECIDED",
465
+ "CANCELED"
466
+ ]);
467
+ const changeTypeSchema = z.enum([
468
+ "ORDER.PAID",
469
+ "ORDER.CONFIRMED",
470
+ "ORDER.DISPATCHED",
471
+ "ORDER.DELIVERED",
472
+ "ORDER.PURCHASE_DECIDED",
473
+ "CLAIM.CANCEL_REQUESTED",
474
+ "CLAIM.RETURN_REQUESTED",
475
+ "CLAIM.EXCHANGE_REQUESTED",
476
+ "ORDER.ADDRESS_CHANGE_REQUESTED"
477
+ ]);
412
478
  //#endregion
413
479
  //#region src/schemas/claim.ts
414
480
  const claimTypeSchema = z.enum([
@@ -460,6 +526,30 @@ const claimSchema = z.object({
460
526
  requestedAt: z.string(),
461
527
  completedAt: z.string().nullable()
462
528
  });
529
+ /** `GET /v1/claims` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열) */
530
+ const claimListQuerySchema = z.object({
531
+ type: claimTypeSchema.optional().describe("클레임 유형 필터"),
532
+ status: claimStatusSchema.optional().describe("클레임 상태 필터"),
533
+ orderItemId: z.string().optional().describe("주문상품 id 필터"),
534
+ requestedFrom: z.string().optional().describe("요청 시각 조회 시작 (ISO 8601, 포함)"),
535
+ requestedTo: z.string().optional().describe("요청 시각 조회 끝 (ISO 8601, 포함)"),
536
+ ...pageQueryShape()
537
+ });
538
+ /** `GET /v1/claims/{claimId}` 응답 — 클레임 + 상태 이력 */
539
+ const claimDetailSchema = claimSchema.extend({ histories: z.array(z.object({
540
+ status: claimStatusSchema,
541
+ actor: z.enum([
542
+ "BUYER",
543
+ "SELLER",
544
+ "SYSTEM"
545
+ ]),
546
+ occurredAt: z.string()
547
+ })).optional() });
548
+ /** `POST /v1/claims/{claimId}/hold` 응답 */
549
+ const claimHoldResultSchema = z.object({
550
+ claimId: z.string(),
551
+ holdExpiresAt: z.string()
552
+ });
463
553
  const rejectClaimRequestSchema = z.object({
464
554
  reason: z.enum([
465
555
  "USED_PRODUCT",
@@ -478,48 +568,6 @@ const approveClaimResultSchema = z.object({
478
568
  refundedAt: z.string()
479
569
  });
480
570
  //#endregion
481
- //#region src/schemas/common.ts
482
- const pageInfoSchema = z.object({
483
- page: z.number().int(),
484
- size: z.number().int(),
485
- totalElements: z.number().int(),
486
- totalPages: z.number().int()
487
- });
488
- function pageSchema(item) {
489
- return pageInfoSchema.extend({ contents: z.array(item) });
490
- }
491
- const bulkResultSchema = z.object({
492
- succeeded: z.array(z.string()),
493
- failed: z.array(z.object({
494
- id: z.string().optional(),
495
- productId: z.string().optional(),
496
- orderItemId: z.string().optional(),
497
- code: z.string(),
498
- message: z.string()
499
- }))
500
- });
501
- const orderItemStatusSchema = z.enum([
502
- "PAYMENT_WAITING",
503
- "PAID",
504
- "CONFIRMED",
505
- "DISPATCHED",
506
- "DELIVERING",
507
- "DELIVERED",
508
- "PURCHASE_DECIDED",
509
- "CANCELED"
510
- ]);
511
- const changeTypeSchema = z.enum([
512
- "ORDER.PAID",
513
- "ORDER.CONFIRMED",
514
- "ORDER.DISPATCHED",
515
- "ORDER.DELIVERED",
516
- "ORDER.PURCHASE_DECIDED",
517
- "CLAIM.CANCEL_REQUESTED",
518
- "CLAIM.RETURN_REQUESTED",
519
- "CLAIM.EXCHANGE_REQUESTED",
520
- "ORDER.ADDRESS_CHANGE_REQUESTED"
521
- ]);
522
- //#endregion
523
571
  //#region src/schemas/misc.ts
524
572
  const inquirySchema = z.object({
525
573
  inquiryId: z.string(),
@@ -567,6 +615,21 @@ const sellerCustomerInquirySchema = z.object({
567
615
  }).nullable(),
568
616
  createdAt: z.string()
569
617
  });
618
+ const answeredQuery = z.enum(["true", "false"]).optional().describe("답변 여부 필터. `true`면 답변된 문의만, `false`면 미답변만, 생략하면 전부");
619
+ /** `GET /v1/inquiries` 쿼리(상품 문의) — OpenAPI 문서용 형태(값은 쿼리 문자열). 최신순이다 */
620
+ const inquiryListQuerySchema = z.object({
621
+ answered: answeredQuery,
622
+ productId: z.string().optional().describe("상품 id 필터"),
623
+ from: z.string().optional().describe("작성 시각 조회 시작 (ISO 8601, 포함)"),
624
+ ...pageQueryShape()
625
+ });
626
+ /** `GET /v1/customer-inquiries` 쿼리(1:1 문의) — OpenAPI 문서용 형태(값은 쿼리 문자열). 최신순이다 */
627
+ const customerInquiryListQuerySchema = z.object({
628
+ answered: answeredQuery,
629
+ category: customerInquiryCategorySchema.optional().describe("문의 유형 필터"),
630
+ from: z.string().optional().describe("작성 시각 조회 시작 (ISO 8601, 포함)"),
631
+ ...pageQueryShape()
632
+ });
570
633
  const settlementStatusSchema = z.enum([
571
634
  "SCHEDULED",
572
635
  "PAID",
@@ -600,6 +663,20 @@ const settlementDetailSchema = z.object({
600
663
  settlementAmount: z.number().int(),
601
664
  purchaseDecidedAt: z.string().nullable()
602
665
  });
666
+ /** `GET /v1/settlements/{settlementId}` 응답 — 정산 요약 + 상세 내역(`size`건까지) */
667
+ const settlementWithDetailsSchema = settlementSummarySchema.extend({ details: z.array(settlementDetailSchema).optional() });
668
+ /** `GET /v1/settlements` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열). 정산일 최신순이다 */
669
+ const settlementListQuerySchema = z.object({
670
+ from: z.string().describe("정산일 조회 시작 (ISO 8601, 포함). 필수"),
671
+ to: z.string().optional().describe("정산일 조회 끝 (ISO 8601, 포함). 생략하면 from부터 31일. 기간은 최대 31일"),
672
+ status: settlementStatusSchema.optional().describe("정산 상태 필터"),
673
+ ...pageQueryShape()
674
+ });
675
+ /** `GET /v1/settlements/{settlementId}` 쿼리 — `size`는 돌려줄 상세 내역 건수다(`page`는 무시) */
676
+ const settlementDetailQuerySchema = z.object(pageQueryShape({
677
+ defaultSize: 100,
678
+ maxSize: 300
679
+ }));
603
680
  const eventTypeSchema = z.enum([
604
681
  "ORDER.PAID",
605
682
  "ORDER.CONFIRMED",
@@ -699,6 +776,33 @@ const reviewSchema = z.object({
699
776
  }).nullable(),
700
777
  createdAt: z.string()
701
778
  });
779
+ const reviewSortSchema = z.enum([
780
+ "createdAt.desc",
781
+ "createdAt.asc",
782
+ "rating.asc",
783
+ "rating.desc"
784
+ ]);
785
+ /** `GET /v1/reviews` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열) */
786
+ const reviewListQuerySchema = z.object({
787
+ productId: z.string().optional().describe("상품 id 필터"),
788
+ rating: z.enum([
789
+ "1",
790
+ "2",
791
+ "3",
792
+ "4",
793
+ "5"
794
+ ]).optional().describe("별점 필터 (일치)"),
795
+ replied: z.enum(["true", "false"]).optional().describe("답글 여부 필터. `true`면 답글 단 리뷰만, `false`면 답글 없는 리뷰만"),
796
+ hasImage: z.enum(["true", "false"]).optional().describe("`true`면 이미지가 있는 리뷰만"),
797
+ from: z.string().optional().describe("작성 시각 조회 시작 (ISO 8601, 포함)"),
798
+ sort: reviewSortSchema.optional().describe("정렬 (기본 createdAt.desc)"),
799
+ ...pageQueryShape()
800
+ });
801
+ /** `POST /v1/reviews/{reviewId}/report` 응답(202) — 신고 접수 */
802
+ const reviewReportResultSchema = z.object({
803
+ reviewId: z.string(),
804
+ status: z.literal("PENDING_REVIEW")
805
+ });
702
806
  //#endregion
703
807
  //#region src/schemas/order.ts
704
808
  const orderSummarySchema = z.object({
@@ -835,6 +939,18 @@ const deliveryInfoSchema = z.object({
835
939
  dispatchedAt: z.string(),
836
940
  deliveredAt: z.string().nullable()
837
941
  });
942
+ /** `GET /v1/order-items/{orderItemId}/delivery` 응답 — 배송 정보 + 배송 추적 이벤트 */
943
+ const deliveryStatusSchema = deliveryInfoSchema.extend({ trackingEvents: z.array(z.object({
944
+ status: z.string(),
945
+ location: z.string(),
946
+ occurredAt: z.string()
947
+ })).optional() });
948
+ /** `PUT /v1/order-items/{orderItemId}/dispatch/tracking` 응답 — 바뀐 송장 */
949
+ const trackingUpdateResultSchema = z.object({
950
+ orderItemId: z.string(),
951
+ carrierCode: z.string(),
952
+ trackingNumber: z.string()
953
+ });
838
954
  const carrierSchema = z.object({
839
955
  carrierCode: z.string(),
840
956
  name: z.string(),
@@ -859,6 +975,33 @@ const cancelBySellerRequestSchema = z.object({
859
975
  ]),
860
976
  detail: z.string().max(500).optional()
861
977
  });
978
+ /** `POST /v1/order-items/{orderItemId}/cancel` 응답 — 셀러 직권취소 환불 결과 */
979
+ const cancelBySellerResultSchema = z.object({
980
+ orderItemId: z.string(),
981
+ refundAmount: z.number().int(),
982
+ refundedAt: z.string()
983
+ });
984
+ /** `PUT /v1/order-items/{orderItemId}/memo` 응답 — 빈 문자열로 저장하면 메모가 지워져 `null`이다 */
985
+ const orderItemMemoResultSchema = z.object({
986
+ orderItemId: z.string(),
987
+ sellerMemo: z.string().nullable()
988
+ });
989
+ /** `POST /v1/order-items/{orderItemId}/purchase-decision/request` 응답 */
990
+ const purchaseDecisionRequestResultSchema = z.object({
991
+ orderItemId: z.string(),
992
+ requestedAt: z.string()
993
+ });
994
+ /** `POST /v1/order-items/{orderItemId}/purchase-decision/extend` 응답 — 연장은 최대 2회 */
995
+ const purchaseDecisionExtendResultSchema = z.object({
996
+ orderItemId: z.string(),
997
+ autoDecisionDate: z.string(),
998
+ extendCount: z.number().int().max(2)
999
+ });
1000
+ /**
1001
+ * `GET /v1/orders/{orderId}/address-change-requests` 응답 — 배송지 변경 요청 플로우는 아직 제공하지 않아
1002
+ * 현재는 항상 빈 배열이다
1003
+ */
1004
+ const addressChangeRequestListSchema = z.array(z.record(z.string(), z.unknown())).describe("배송지 변경 요청 목록 (현재 항상 빈 배열)");
862
1005
  //#endregion
863
1006
  //#region src/schemas/payment.ts
864
1007
  /**
@@ -1340,6 +1483,28 @@ const productPatchRequestSchema = z.object({
1340
1483
  status: productStatusSchema.optional(),
1341
1484
  deliveryFee: z.number().int().optional()
1342
1485
  }).refine((value) => Object.values(value).some((v) => v !== void 0), { message: "최소 1개 필드가 필요합니다" });
1486
+ const productSortSchema = z.enum([
1487
+ "createdAt.desc",
1488
+ "createdAt.asc",
1489
+ "salePrice.asc",
1490
+ "salePrice.desc",
1491
+ "updatedAt.desc"
1492
+ ]);
1493
+ /** `GET /v1/products` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열) */
1494
+ const productListQuerySchema = z.object({
1495
+ status: productStatusSchema.optional().describe("판매 상태 필터"),
1496
+ categoryId: z.string().optional().describe("카테고리 필터 — 하위 카테고리의 상품도 포함"),
1497
+ keyword: z.string().optional().describe("상품명 검색 (포함)"),
1498
+ sellerCode: z.string().optional().describe("판매자 상품코드 — 이 코드가 붙은 variant를 가진 상품"),
1499
+ sort: productSortSchema.optional().describe("정렬 (기본 createdAt.desc)"),
1500
+ ...pageQueryShape()
1501
+ });
1502
+ /** `POST /v1/product-images` 응답 — 업로드된 이미지의 CDN 주소 */
1503
+ const productImageUploadResultSchema = z.object({ images: z.array(z.object({
1504
+ url: z.url(),
1505
+ width: z.number().int(),
1506
+ height: z.number().int()
1507
+ })) });
1343
1508
  const discountSchema = z.object({
1344
1509
  productId: z.string(),
1345
1510
  discountType: z.enum(["RATE", "AMOUNT"]),
@@ -1453,7 +1618,16 @@ const invitationSchema = z.object({
1453
1618
  expiresAt: z.string(),
1454
1619
  createdAt: z.string()
1455
1620
  });
1621
+ /** `GET /v1/store/invitations` 쿼리 — OpenAPI 문서용 형태 */
1622
+ const invitationListQuerySchema = z.object({ status: invitationSchema.shape.status.optional().describe("초대 상태 필터") });
1623
+ /** `PATCH /v1/store/members/{userId}` 응답 — 바뀐 역할 */
1624
+ const storeMemberRoleUpdatedSchema = z.object({
1625
+ userId: z.string(),
1626
+ role: z.enum(["ADMIN", "STAFF"])
1627
+ });
1456
1628
  const addressTypeSchema = z.enum(["SHIPPING", "RETURN"]);
1629
+ /** `GET /v1/seller-addresses` 쿼리 — OpenAPI 문서용 형태. 기본 주소 우선, 그다음 등록순이다 */
1630
+ const sellerAddressListQuerySchema = z.object({ type: addressTypeSchema.optional().describe("주소 유형 필터") });
1457
1631
  const sellerAddressSchema = z.object({
1458
1632
  addressId: z.string(),
1459
1633
  type: addressTypeSchema,
@@ -1681,21 +1855,13 @@ function createStoreClient(options) {
1681
1855
  }),
1682
1856
  hold: (orderItemId, body) => storeHttp.requestVoid("POST", path`/order-items/${orderItemId}/hold`, { body: holdOrderItemRequestSchema.parse(body) }),
1683
1857
  releaseHold: (orderItemId) => storeHttp.requestVoid("DELETE", path`/order-items/${orderItemId}/hold`),
1684
- cancelBySeller: (orderItemId, body, idempotencyKey) => storeHttp.request("POST", path`/order-items/${orderItemId}/cancel`, z.object({
1685
- orderItemId: z.string(),
1686
- refundAmount: z.number().int(),
1687
- refundedAt: z.string()
1688
- }), {
1858
+ cancelBySeller: (orderItemId, body, idempotencyKey) => storeHttp.request("POST", path`/order-items/${orderItemId}/cancel`, cancelBySellerResultSchema, {
1689
1859
  body: cancelBySellerRequestSchema.parse(body),
1690
1860
  headers: idempotency(idempotencyKey)
1691
1861
  }),
1692
1862
  updateMemo: (orderItemId, memo) => storeHttp.requestVoid("PUT", path`/order-items/${orderItemId}/memo`, { body: { memo } }),
1693
1863
  requestPurchaseDecision: (orderItemId) => storeHttp.requestVoid("POST", path`/order-items/${orderItemId}/purchase-decision/request`),
1694
- extendPurchaseDecision: (orderItemId) => storeHttp.request("POST", path`/order-items/${orderItemId}/purchase-decision/extend`, z.object({
1695
- orderItemId: z.string(),
1696
- autoDecisionDate: z.string(),
1697
- extendCount: z.number().int().max(2)
1698
- })),
1864
+ extendPurchaseDecision: (orderItemId) => storeHttp.request("POST", path`/order-items/${orderItemId}/purchase-decision/extend`, purchaseDecisionExtendResultSchema),
1699
1865
  dispatch: (orderItemId, body, idempotencyKey) => storeHttp.request("POST", path`/order-items/${orderItemId}/dispatch`, deliveryInfoSchema, {
1700
1866
  body: dispatchRequestSchema.parse(body),
1701
1867
  headers: idempotency(idempotencyKey)
@@ -1708,24 +1874,12 @@ function createStoreClient(options) {
1708
1874
  carrierCode,
1709
1875
  trackingNumber
1710
1876
  } }),
1711
- getDelivery: (orderItemId) => storeHttp.request("GET", path`/order-items/${orderItemId}/delivery`, deliveryInfoSchema.extend({ trackingEvents: z.array(z.object({
1712
- status: z.string(),
1713
- location: z.string(),
1714
- occurredAt: z.string()
1715
- })).optional() }))
1877
+ getDelivery: (orderItemId) => storeHttp.request("GET", path`/order-items/${orderItemId}/delivery`, deliveryStatusSchema)
1716
1878
  },
1717
1879
  carriers: { list: () => storeHttp.request("GET", "/carriers", z.array(carrierSchema)) },
1718
1880
  claims: {
1719
1881
  list: (params) => storeHttp.request("GET", "/claims", pageSchema(claimSchema), { query: params }),
1720
- get: (claimId) => storeHttp.request("GET", path`/claims/${claimId}`, claimSchema.extend({ histories: z.array(z.object({
1721
- status: claimStatusSchema,
1722
- actor: z.enum([
1723
- "BUYER",
1724
- "SELLER",
1725
- "SYSTEM"
1726
- ]),
1727
- occurredAt: z.string()
1728
- })).optional() })),
1882
+ get: (claimId) => storeHttp.request("GET", path`/claims/${claimId}`, claimDetailSchema),
1729
1883
  approve: (claimId, deductAmount, idempotencyKey) => storeHttp.request("POST", path`/claims/${claimId}/approve`, approveClaimResultSchema, {
1730
1884
  body: deductAmount !== void 0 ? { deductAmount } : {},
1731
1885
  headers: idempotency(idempotencyKey)
@@ -1737,10 +1891,7 @@ function createStoreClient(options) {
1737
1891
  carrierCode,
1738
1892
  trackingNumber
1739
1893
  } }),
1740
- hold: (claimId, reason) => storeHttp.request("POST", path`/claims/${claimId}/hold`, z.object({
1741
- claimId: z.string(),
1742
- holdExpiresAt: z.string()
1743
- }), { body: { reason } }),
1894
+ hold: (claimId, reason) => storeHttp.request("POST", path`/claims/${claimId}/hold`, claimHoldResultSchema, { body: { reason } }),
1744
1895
  releaseHold: (claimId) => storeHttp.requestVoid("DELETE", path`/claims/${claimId}/hold`)
1745
1896
  },
1746
1897
  inquiries: {
@@ -1763,7 +1914,7 @@ function createStoreClient(options) {
1763
1914
  /** @deprecated `salesReport.get`을 쓴다. 기존 정산 레코드 조회만 유지된다 */
1764
1915
  list: (params) => storeHttp.request("GET", "/settlements", pageSchema(settlementSummarySchema), { query: params }),
1765
1916
  /** @deprecated `salesReport.get`을 쓴다. 기존 정산 레코드 조회만 유지된다 */
1766
- get: (settlementId, params) => storeHttp.request("GET", path`/settlements/${settlementId}`, settlementSummarySchema.extend({ details: z.array(settlementDetailSchema).optional() }), { query: params })
1917
+ get: (settlementId, params) => storeHttp.request("GET", path`/settlements/${settlementId}`, settlementWithDetailsSchema, { query: params })
1767
1918
  },
1768
1919
  /**
1769
1920
  * 매출 리포트 (정산 API 대체) — 스코프 `settlement:r`. PG 승인 시각 기준 결제, PG 취소 완료 시각 기준
@@ -2297,4 +2448,4 @@ function createStoreSession(options) {
2297
2448
  };
2298
2449
  }
2299
2450
  //#endregion
2300
- export { ApiError, MAX_OPTION_GROUPS, MAX_VALUES_PER_GROUP, MAX_VARIANTS, PAYMENT_ROUTING_EXCLUSION_CODES, PORTONE_CHANNEL_NAME_MAX_LENGTH, PORTONE_MAX_CHANNELS, PORTONE_MIN_CHANNELS, RESERVED_STORE_CODES, STORE_CODE_PATTERN, STORE_ROLE_SCOPES, STORE_SCOPE_RESOURCES, STORE_SESSION_KEYS, TOSS_WIDGET_CLIENT_KEY_PATTERN, TOSS_WIDGET_KEY_MESSAGE, TOSS_WIDGET_SECRET_KEY_PATTERN, VARIANT_STOCK_EXCLUSIVE_MESSAGE, WEBHOOK_DEFAULT_TOLERANCE_SEC, WEBHOOK_DELIVERY_ID_HEADER, WEBHOOK_EVENT_ID_HEADER, WEBHOOK_EVENT_TYPE_HEADER, WEBHOOK_HEADERS, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_USER_AGENT, addressTypeSchema, apiClientListQuerySchema, apiClientSchema, apiClientSecretRotatedSchema, apiClientStatusSchema, apiClientTypeSchema, apiLogErrorSchema, apiLogListQuerySchema, apiLogPageSchema, apiLogPrincipalSchema, apiLogPrincipalTypeSchema, apiLogSchema, apiLogStatusFilterSchema, apiLogSummarySchema, apiTokenCreateRequestSchema, apiTokenCreatedSchema, apiTokenSchema, approveClaimResultSchema, buildAuthorizeUrl, buildQuery, bulkResultSchema, cancelBySellerRequestSchema, carrierSchema, categoryAttributeSchema, categoryCreateRequestSchema, categoryDeleteStrategySchema, categoryPatchRequestSchema, categoryProductSortSchema, categorySchema, categorySearchResultSchema, categoryTreeNodeSchema, categoryWithPathSchema, changeTypeSchema, claimReasonSchema, claimSchema, claimStatusSchema, claimTypeSchema, claimWebhookEventDataSchema, claimWebhookEventSchema, clientCredentialsTokenResponseSchema, createPkcePair, createStoreClient, createStoreSession, customerInquiryCategorySchema, deliveryInfoSchema, deliveryMethodSchema, deliveryTypeSchema, discountRequestSchema, discountSchema, dispatchRequestSchema, effectivePaymentRoutingModeSchema, eventTypeSchema, exchangeAuthorizationCode, exchangeStoreTokenViaOAuth, holdOrderItemRequestSchema, inquirySchema, inquiryWebhookEventDataSchema, inquiryWebhookEventSchema, invitationSchema, isReservedStoreCode, isStoreScope, liveGateConditionCodeSchema, liveGateConditionSchema, liveGateErrorDetailsSchema, liveGateSchema, maskedSecretSchema, myAccountSchema, myStoreSchema, oauthClientRegistrationRequestSchema, oauthClientRegistrationResponseSchema, oauthTokenResponseSchema, optionGroupRequestSchema, optionGroupSchema, optionModelRequestSchema, optionModelSchema, optionValueRequestSchema, optionValueSchema, orderItemListQuerySchema, orderItemPageSchema, orderItemSchema, orderItemStatusSchema, orderListQuerySchema, orderSchema, orderSummaryPageSchema, orderSummarySchema, orderWebhookEventDataSchema, orderWebhookEventSchema, pageInfoSchema, pageSchema, paymentAttemptRecordSchema, paymentAttemptStatusSchema, paymentCredentialSetSchema, paymentListQuerySchema, paymentProviderSchema, paymentProviderVerificationSchema, paymentRecordDetailSchema, paymentRecordPageSchema, paymentRecordSchema, paymentRecordStatusSchema, paymentRefundRecordSchema, paymentRoutingModeSchema, paymentSettingsSchema, pgEnvironmentSchema, pgPaymentMethodSchema, pgProviderSchema, pgVerificationResultSchema, portOneChannelSchema, portOneCredentialsInputSchema, productCreateRequestSchema, productOutOfStockWebhookEventDataSchema, productOutOfStockWebhookEventSchema, productPatchRequestSchema, productSchema, productStatusSchema, productSummarySchema, productVariantRequestSchema, productVariantSchema, refreshUserToken, rejectClaimRequestSchema, reviewSchema, reviewWebhookEventDataSchema, reviewWebhookEventSchema, salesReportGroupBySchema, salesReportQuerySchema, salesReportRowSchema, salesReportSchema, salesTotalsSchema, scopeAccessSchema, sellerAddressRequestSchema, sellerAddressSchema, sellerCustomerInquirySchema, settlementDetailSchema, settlementStatusSchema, settlementSummarySchema, shippingAddressSchema, storeCodeSchema, storeMemberSchema, storeRoleSchema, storeSchema, storeScopeResourceSchema, storeTokenResponseSchema, tossPaymentsCredentialsInputSchema, updatePaymentProviderRequestSchema, updatePaymentSettingsRequestSchema, uploadRequestSchema, uploadTicketSchema, upsertPortOneProviderRequestSchema, upsertTossPaymentsProviderRequestSchema, userTokenResponseSchema, variantStockRequestSchema, variantStockSchema, verifyPaymentProviderRequestSchema, webhookCreatedSchema, webhookDeliveryErrorCodeSchema, webhookDeliveryListQuerySchema, webhookDeliverySchema, webhookDeliveryStatusSchema, webhookEventSchema, webhookRedeliverFailedResultSchema, webhookRequestSchema, webhookSchema, webhookSecretRotatedSchema, webhookStatusSchema, webhookTestRequestSchema, webhookTestResultSchema };
2451
+ export { ApiError, MAX_OPTION_GROUPS, MAX_VALUES_PER_GROUP, MAX_VARIANTS, PAYMENT_ROUTING_EXCLUSION_CODES, PORTONE_CHANNEL_NAME_MAX_LENGTH, PORTONE_MAX_CHANNELS, PORTONE_MIN_CHANNELS, RESERVED_STORE_CODES, STORE_CODE_PATTERN, STORE_ROLE_SCOPES, STORE_SCOPE_RESOURCES, STORE_SESSION_KEYS, TOSS_WIDGET_CLIENT_KEY_PATTERN, TOSS_WIDGET_KEY_MESSAGE, TOSS_WIDGET_SECRET_KEY_PATTERN, VARIANT_STOCK_EXCLUSIVE_MESSAGE, WEBHOOK_DEFAULT_TOLERANCE_SEC, WEBHOOK_DELIVERY_ID_HEADER, WEBHOOK_EVENT_ID_HEADER, WEBHOOK_EVENT_TYPE_HEADER, WEBHOOK_HEADERS, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_USER_AGENT, addressChangeRequestListSchema, addressTypeSchema, apiClientListQuerySchema, apiClientSchema, apiClientSecretRotatedSchema, apiClientStatusSchema, apiClientTypeSchema, apiLogErrorSchema, apiLogListQuerySchema, apiLogPageSchema, apiLogPrincipalSchema, apiLogPrincipalTypeSchema, apiLogSchema, apiLogStatusFilterSchema, apiLogSummarySchema, apiTokenCreateRequestSchema, apiTokenCreatedSchema, apiTokenSchema, approveClaimResultSchema, buildAuthorizeUrl, buildQuery, bulkResultSchema, cancelBySellerRequestSchema, cancelBySellerResultSchema, carrierSchema, categoryAttributeSchema, categoryCreateRequestSchema, categoryDeleteQuerySchema, categoryDeleteStrategySchema, categoryListQuerySchema, categoryPatchRequestSchema, categoryProductSortSchema, categorySchema, categorySearchResultSchema, categoryTreeNodeSchema, categoryWithPathSchema, changeTypeSchema, claimDetailSchema, claimHoldResultSchema, claimListQuerySchema, claimReasonSchema, claimSchema, claimStatusSchema, claimTypeSchema, claimWebhookEventDataSchema, claimWebhookEventSchema, clientCredentialsTokenResponseSchema, createPkcePair, createStoreClient, createStoreSession, customerInquiryCategorySchema, customerInquiryListQuerySchema, deliveryInfoSchema, deliveryMethodSchema, deliveryStatusSchema, deliveryTypeSchema, discountRequestSchema, discountSchema, dispatchRequestSchema, effectivePaymentRoutingModeSchema, eventTypeSchema, exchangeAuthorizationCode, exchangeStoreTokenViaOAuth, holdOrderItemRequestSchema, inquiryListQuerySchema, inquirySchema, inquiryWebhookEventDataSchema, inquiryWebhookEventSchema, invitationListQuerySchema, invitationSchema, isReservedStoreCode, isStoreScope, liveGateConditionCodeSchema, liveGateConditionSchema, liveGateErrorDetailsSchema, liveGateSchema, maskedSecretSchema, myAccountSchema, myStoreSchema, oauthClientRegistrationRequestSchema, oauthClientRegistrationResponseSchema, oauthTokenResponseSchema, optionGroupRequestSchema, optionGroupSchema, optionModelRequestSchema, optionModelSchema, optionValueRequestSchema, optionValueSchema, orderItemListQuerySchema, orderItemMemoResultSchema, orderItemPageSchema, orderItemSchema, orderItemStatusSchema, orderListQuerySchema, orderSchema, orderSummaryPageSchema, orderSummarySchema, orderWebhookEventDataSchema, orderWebhookEventSchema, pageInfoSchema, pageQueryShape, pageSchema, paymentAttemptRecordSchema, paymentAttemptStatusSchema, paymentCredentialSetSchema, paymentListQuerySchema, paymentProviderSchema, paymentProviderVerificationSchema, paymentRecordDetailSchema, paymentRecordPageSchema, paymentRecordSchema, paymentRecordStatusSchema, paymentRefundRecordSchema, paymentRoutingModeSchema, paymentSettingsSchema, pgEnvironmentSchema, pgPaymentMethodSchema, pgProviderSchema, pgVerificationResultSchema, portOneChannelSchema, portOneCredentialsInputSchema, productCreateRequestSchema, productImageUploadResultSchema, productListQuerySchema, productOutOfStockWebhookEventDataSchema, productOutOfStockWebhookEventSchema, productPatchRequestSchema, productSchema, productSortSchema, productStatusSchema, productSummarySchema, productVariantRequestSchema, productVariantSchema, purchaseDecisionExtendResultSchema, purchaseDecisionRequestResultSchema, refreshUserToken, rejectClaimRequestSchema, reviewListQuerySchema, reviewReportResultSchema, reviewSchema, reviewSortSchema, reviewWebhookEventDataSchema, reviewWebhookEventSchema, salesReportGroupBySchema, salesReportQuerySchema, salesReportRowSchema, salesReportSchema, salesTotalsSchema, scopeAccessSchema, sellerAddressListQuerySchema, sellerAddressRequestSchema, sellerAddressSchema, sellerCustomerInquirySchema, settlementDetailQuerySchema, settlementDetailSchema, settlementListQuerySchema, settlementStatusSchema, settlementSummarySchema, settlementWithDetailsSchema, shippingAddressSchema, storeCodeSchema, storeMemberRoleUpdatedSchema, storeMemberSchema, storeRoleSchema, storeSchema, storeScopeResourceSchema, storeTokenResponseSchema, tossPaymentsCredentialsInputSchema, trackingUpdateResultSchema, updatePaymentProviderRequestSchema, updatePaymentSettingsRequestSchema, uploadRequestSchema, uploadTicketSchema, upsertPortOneProviderRequestSchema, upsertTossPaymentsProviderRequestSchema, userTokenResponseSchema, variantStockRequestSchema, variantStockSchema, verifyPaymentProviderRequestSchema, webhookCreatedSchema, webhookDeliveryErrorCodeSchema, webhookDeliveryListQuerySchema, webhookDeliverySchema, webhookDeliveryStatusSchema, webhookEventSchema, webhookRedeliverFailedResultSchema, webhookRequestSchema, webhookSchema, webhookSecretRotatedSchema, webhookStatusSchema, webhookTestRequestSchema, webhookTestResultSchema };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sayren/store-sdk",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "main": "./dist/index.mjs",
5
5
  "types": "./dist/index.d.mts",
6
6
  "exports": {
@@ -31,7 +31,7 @@
31
31
  "license": "UNLICENSED",
32
32
  "repository": {
33
33
  "type": "git",
34
- "url": "git+https://github.com/cochoio/shop.24.git"
34
+ "url": "git+https://github.com/avarcorp/sayren.git"
35
35
  },
36
36
  "files": [
37
37
  "dist",
package/src/client.ts CHANGED
@@ -34,8 +34,9 @@ import {
34
34
  import {
35
35
  approveClaimResultSchema,
36
36
  type ClaimListParams,
37
+ claimDetailSchema,
38
+ claimHoldResultSchema,
37
39
  claimSchema,
38
- claimStatusSchema,
39
40
  type RejectClaimRequest,
40
41
  rejectClaimRequestSchema,
41
42
  } from "./schemas/claim";
@@ -47,8 +48,8 @@ import {
47
48
  reviewSchema,
48
49
  type SettlementListParams,
49
50
  sellerCustomerInquirySchema,
50
- settlementDetailSchema,
51
51
  settlementSummarySchema,
52
+ settlementWithDetailsSchema,
52
53
  type WebhookDeliveryListParams,
53
54
  type WebhookRequest,
54
55
  type WebhookTestRequest,
@@ -64,9 +65,11 @@ import {
64
65
  import {
65
66
  type CancelBySellerRequest,
66
67
  cancelBySellerRequestSchema,
68
+ cancelBySellerResultSchema,
67
69
  carrierSchema,
68
70
  type DispatchRequest,
69
71
  deliveryInfoSchema,
72
+ deliveryStatusSchema,
70
73
  dispatchRequestSchema,
71
74
  type HoldOrderItemRequest,
72
75
  holdOrderItemRequestSchema,
@@ -75,6 +78,7 @@ import {
75
78
  orderItemSchema,
76
79
  orderSchema,
77
80
  orderSummarySchema,
81
+ purchaseDecisionExtendResultSchema,
78
82
  } from "./schemas/order";
79
83
  import {
80
84
  type PaymentListParams,
@@ -459,11 +463,7 @@ export function createStoreClient(options: StoreClientOptions) {
459
463
  storeHttp.request(
460
464
  "POST",
461
465
  path`/order-items/${orderItemId}/cancel`,
462
- z.object({
463
- orderItemId: z.string(),
464
- refundAmount: z.number().int(),
465
- refundedAt: z.string(),
466
- }),
466
+ cancelBySellerResultSchema,
467
467
  { body: cancelBySellerRequestSchema.parse(body), headers: idempotency(idempotencyKey) },
468
468
  ),
469
469
  updateMemo: (orderItemId: string, memo: string) =>
@@ -474,11 +474,7 @@ export function createStoreClient(options: StoreClientOptions) {
474
474
  storeHttp.request(
475
475
  "POST",
476
476
  path`/order-items/${orderItemId}/purchase-decision/extend`,
477
- z.object({
478
- orderItemId: z.string(),
479
- autoDecisionDate: z.string(),
480
- extendCount: z.number().int().max(2),
481
- }),
477
+ purchaseDecisionExtendResultSchema,
482
478
  ),
483
479
  dispatch: (orderItemId: string, body: DispatchRequest, idempotencyKey?: string) =>
484
480
  storeHttp.request("POST", path`/order-items/${orderItemId}/dispatch`, deliveryInfoSchema, {
@@ -498,15 +494,7 @@ export function createStoreClient(options: StoreClientOptions) {
498
494
  body: { carrierCode, trackingNumber },
499
495
  }),
500
496
  getDelivery: (orderItemId: string) =>
501
- storeHttp.request(
502
- "GET",
503
- path`/order-items/${orderItemId}/delivery`,
504
- deliveryInfoSchema.extend({
505
- trackingEvents: z
506
- .array(z.object({ status: z.string(), location: z.string(), occurredAt: z.string() }))
507
- .optional(),
508
- }),
509
- ),
497
+ storeHttp.request("GET", path`/order-items/${orderItemId}/delivery`, deliveryStatusSchema),
510
498
  },
511
499
 
512
500
  carriers: {
@@ -517,21 +505,7 @@ export function createStoreClient(options: StoreClientOptions) {
517
505
  list: (params?: ClaimListParams) =>
518
506
  storeHttp.request("GET", "/claims", pageSchema(claimSchema), { query: params as Query }),
519
507
  get: (claimId: string) =>
520
- storeHttp.request(
521
- "GET",
522
- path`/claims/${claimId}`,
523
- claimSchema.extend({
524
- histories: z
525
- .array(
526
- z.object({
527
- status: claimStatusSchema,
528
- actor: z.enum(["BUYER", "SELLER", "SYSTEM"]),
529
- occurredAt: z.string(),
530
- }),
531
- )
532
- .optional(),
533
- }),
534
- ),
508
+ storeHttp.request("GET", path`/claims/${claimId}`, claimDetailSchema),
535
509
  approve: (claimId: string, deductAmount?: number, idempotencyKey?: string) =>
536
510
  storeHttp.request("POST", path`/claims/${claimId}/approve`, approveClaimResultSchema, {
537
511
  body: deductAmount !== undefined ? { deductAmount } : {},
@@ -552,12 +526,9 @@ export function createStoreClient(options: StoreClientOptions) {
552
526
  body: { carrierCode, trackingNumber },
553
527
  }),
554
528
  hold: (claimId: string, reason: string) =>
555
- storeHttp.request(
556
- "POST",
557
- path`/claims/${claimId}/hold`,
558
- z.object({ claimId: z.string(), holdExpiresAt: z.string() }),
559
- { body: { reason } },
560
- ),
529
+ storeHttp.request("POST", path`/claims/${claimId}/hold`, claimHoldResultSchema, {
530
+ body: { reason },
531
+ }),
561
532
  releaseHold: (claimId: string) =>
562
533
  storeHttp.requestVoid("DELETE", path`/claims/${claimId}/hold`),
563
534
  },
@@ -614,12 +585,9 @@ export function createStoreClient(options: StoreClientOptions) {
614
585
  }),
615
586
  /** @deprecated `salesReport.get`을 쓴다. 기존 정산 레코드 조회만 유지된다 */
616
587
  get: (settlementId: string, params?: PageParams) =>
617
- storeHttp.request(
618
- "GET",
619
- path`/settlements/${settlementId}`,
620
- settlementSummarySchema.extend({ details: z.array(settlementDetailSchema).optional() }),
621
- { query: params as Query },
622
- ),
588
+ storeHttp.request("GET", path`/settlements/${settlementId}`, settlementWithDetailsSchema, {
589
+ query: params as Query,
590
+ }),
623
591
  },
624
592
 
625
593
  /**
@@ -96,3 +96,39 @@ export type CategoryPatchRequest = z.infer<typeof categoryPatchRequestSchema>;
96
96
  export const categoryDeleteStrategySchema = z.enum(["reparent", "cascade"]);
97
97
 
98
98
  export type CategoryDeleteStrategy = z.infer<typeof categoryDeleteStrategySchema>;
99
+
100
+ /**
101
+ * `GET /v1/categories` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열). 응답 형태가 쿼리로 갈린다:
102
+ * `q`가 있으면 검색 결과(`CategorySearchResult[]`), 아니면 `tree=true`일 때 트리(`CategoryTreeNode[]`),
103
+ * 둘 다 아니면 목록(`Category[]`)이다.
104
+ */
105
+ export const categoryListQuerySchema = z.object({
106
+ parentId: z
107
+ .string()
108
+ .optional()
109
+ .describe("이 카테고리의 직계 자식만. 생략하면 최상위 카테고리. `flat=true`면 무시"),
110
+ flat: z
111
+ .enum(["true", "false"])
112
+ .optional()
113
+ .describe("`true`면 전체 카테고리를 깊이·순서대로 평탄화"),
114
+ tree: z
115
+ .enum(["true", "false"])
116
+ .optional()
117
+ .describe("`true`면 최상위부터 `children`을 채운 트리(`CategoryTreeNode[]`)를 돌려준다"),
118
+ q: z
119
+ .string()
120
+ .optional()
121
+ .describe(
122
+ "이름 검색(포함, 대소문자 무시). 주면 `fullPath`·`ancestors`가 붙은 검색 결과를 돌려준다",
123
+ ),
124
+ });
125
+
126
+ /** `DELETE /v1/categories/{categoryId}` 쿼리 — OpenAPI 문서용 형태 */
127
+ export const categoryDeleteQuerySchema = z.object({
128
+ strategy: categoryDeleteStrategySchema
129
+ .optional()
130
+ .describe(
131
+ "하위 카테고리·연결 상품 처리 방식. 생략하면 둘 중 하나라도 있을 때 409 `CATEGORY_NOT_EMPTY`다. " +
132
+ "`reparent`는 직계 자식을 삭제할 카테고리의 부모로 옮기고, `cascade`는 서브트리를 삭제하고 연결 상품을 미분류로 둔다",
133
+ ),
134
+ });
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import type { PageParams } from "./common";
2
+ import { type PageParams, pageQueryShape } from "./common";
3
3
 
4
4
  export const claimTypeSchema = z.enum(["CANCEL", "RETURN", "EXCHANGE"]);
5
5
 
@@ -65,6 +65,36 @@ export interface ClaimListParams extends PageParams {
65
65
  requestedTo?: string;
66
66
  }
67
67
 
68
+ /** `GET /v1/claims` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열) */
69
+ export const claimListQuerySchema = z.object({
70
+ type: claimTypeSchema.optional().describe("클레임 유형 필터"),
71
+ status: claimStatusSchema.optional().describe("클레임 상태 필터"),
72
+ orderItemId: z.string().optional().describe("주문상품 id 필터"),
73
+ requestedFrom: z.string().optional().describe("요청 시각 조회 시작 (ISO 8601, 포함)"),
74
+ requestedTo: z.string().optional().describe("요청 시각 조회 끝 (ISO 8601, 포함)"),
75
+ ...pageQueryShape(),
76
+ });
77
+
78
+ /** `GET /v1/claims/{claimId}` 응답 — 클레임 + 상태 이력 */
79
+ export const claimDetailSchema = claimSchema.extend({
80
+ histories: z
81
+ .array(
82
+ z.object({
83
+ status: claimStatusSchema,
84
+ actor: z.enum(["BUYER", "SELLER", "SYSTEM"]),
85
+ occurredAt: z.string(),
86
+ }),
87
+ )
88
+ .optional(),
89
+ });
90
+
91
+ export type ClaimDetail = z.infer<typeof claimDetailSchema>;
92
+
93
+ /** `POST /v1/claims/{claimId}/hold` 응답 */
94
+ export const claimHoldResultSchema = z.object({ claimId: z.string(), holdExpiresAt: z.string() });
95
+
96
+ export type ClaimHoldResult = z.infer<typeof claimHoldResultSchema>;
97
+
68
98
  export const rejectClaimRequestSchema = z.object({
69
99
  reason: z.enum([
70
100
  "USED_PRODUCT",