@ingestkorea/client-naver-commerce 0.3.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/LICENSE +21 -0
- package/README.md +160 -0
- package/dist-cjs/NaverCommerceClient.js +77 -0
- package/dist-cjs/commands/CreateAccessTokenCommand.js +14 -0
- package/dist-cjs/commands/GetAccountInfoCommand.js +14 -0
- package/dist-cjs/commands/ListChangedOrderStatusesCommand.js +44 -0
- package/dist-cjs/commands/index.js +19 -0
- package/dist-cjs/index.js +18 -0
- package/dist-cjs/middleware/constants.js +9 -0
- package/dist-cjs/middleware/index.js +19 -0
- package/dist-cjs/middleware/middleware-auth.js +18 -0
- package/dist-cjs/middleware/middleware-metadata.js +18 -0
- package/dist-cjs/middleware/middleware-retry.js +64 -0
- package/dist-cjs/models/CommerceClient.js +2 -0
- package/dist-cjs/models/CommerceCommand.js +9 -0
- package/dist-cjs/models/CommerceErrorInfo.js +14 -0
- package/dist-cjs/models/CommerceMiddleware.js +2 -0
- package/dist-cjs/models/CreateAccessToken.js +2 -0
- package/dist-cjs/models/GetAccountInfo.js +2 -0
- package/dist-cjs/models/ListChangedOrderStatuses.js +36 -0
- package/dist-cjs/models/MetadataBearer.js +2 -0
- package/dist-cjs/models/index.js +24 -0
- package/dist-cjs/protocols/CreateAccessToken.js +61 -0
- package/dist-cjs/protocols/GetAccountInfo.js +47 -0
- package/dist-cjs/protocols/ListChangedOrderStatuses.js +81 -0
- package/dist-cjs/protocols/constants.js +116 -0
- package/dist-es/NaverCommerceClient.js +66 -0
- package/dist-es/commands/CreateAccessTokenCommand.js +14 -0
- package/dist-es/commands/GetAccountInfoCommand.js +14 -0
- package/dist-es/commands/ListChangedOrderStatusesCommand.js +49 -0
- package/dist-es/commands/index.js +19 -0
- package/dist-es/index.js +18 -0
- package/dist-es/middleware/constants.js +9 -0
- package/dist-es/middleware/index.js +19 -0
- package/dist-es/middleware/middleware-auth.js +12 -0
- package/dist-es/middleware/middleware-metadata.js +12 -0
- package/dist-es/middleware/middleware-retry.js +61 -0
- package/dist-es/models/CommerceClient.js +2 -0
- package/dist-es/models/CommerceCommand.js +9 -0
- package/dist-es/models/CommerceErrorInfo.js +14 -0
- package/dist-es/models/CommerceMiddleware.js +2 -0
- package/dist-es/models/CreateAccessToken.js +2 -0
- package/dist-es/models/GetAccountInfo.js +2 -0
- package/dist-es/models/ListChangedOrderStatuses.js +36 -0
- package/dist-es/models/MetadataBearer.js +2 -0
- package/dist-es/models/index.js +24 -0
- package/dist-es/protocols/CreateAccessToken.js +55 -0
- package/dist-es/protocols/GetAccountInfo.js +41 -0
- package/dist-es/protocols/ListChangedOrderStatuses.js +79 -0
- package/dist-es/protocols/constants.js +113 -0
- package/dist-types/NaverCommerceClient.d.ts +8 -0
- package/dist-types/commands/CreateAccessTokenCommand.d.ts +11 -0
- package/dist-types/commands/GetAccountInfoCommand.d.ts +11 -0
- package/dist-types/commands/ListChangedOrderStatusesCommand.d.ts +11 -0
- package/dist-types/commands/index.d.ts +3 -0
- package/dist-types/index.d.ts +2 -0
- package/dist-types/middleware/constants.d.ts +6 -0
- package/dist-types/middleware/index.d.ts +3 -0
- package/dist-types/middleware/middleware-auth.d.ts +2 -0
- package/dist-types/middleware/middleware-metadata.d.ts +2 -0
- package/dist-types/middleware/middleware-retry.d.ts +2 -0
- package/dist-types/models/CommerceClient.d.ts +13 -0
- package/dist-types/models/CommerceCommand.d.ts +9 -0
- package/dist-types/models/CommerceErrorInfo.d.ts +19 -0
- package/dist-types/models/CommerceMiddleware.d.ts +8 -0
- package/dist-types/models/CreateAccessToken.d.ts +7 -0
- package/dist-types/models/GetAccountInfo.d.ts +7 -0
- package/dist-types/models/ListChangedOrderStatuses.d.ts +68 -0
- package/dist-types/models/MetadataBearer.d.ts +10 -0
- package/dist-types/models/index.d.ts +8 -0
- package/dist-types/protocols/CreateAccessToken.d.ts +4 -0
- package/dist-types/protocols/GetAccountInfo.d.ts +4 -0
- package/dist-types/protocols/ListChangedOrderStatuses.d.ts +4 -0
- package/dist-types/protocols/constants.d.ts +5 -0
- package/package.json +56 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 INGESTKOREA LLC. All Rights Reserved.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# @ingestkorea/client-naver-commerce
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
INGESTKOREA SDK - Naver Commerce Client for Node.js.
|
|
6
|
+
|
|
7
|
+
INGESTKOREA SDK - Naver Commerce Client는 [네이버 커머스 API](https://apicenter.commerce.naver.com/docs/commerce-api/current)에서 필수적으로 사용되는 메서드 위주로 구현된 가벼운 라이브러리입니다.
|
|
8
|
+
|
|
9
|
+
SDK는 아래 작업들을 내부적으로 수행합니다.
|
|
10
|
+
|
|
11
|
+
- OAuth Token 발급을 위한 전자서명
|
|
12
|
+
- OAuth Token을 이용한 API 인증
|
|
13
|
+
- HTTP 요청 실패시 재시도
|
|
14
|
+
- Naver Commerce API 표준 에러 핸들링
|
|
15
|
+
|
|
16
|
+
SDK는 [네이버 커머스 API Docs](https://apicenter.commerce.naver.com/docs/commerce-api/current)에서 제공하는 형식을 준수합니다.
|
|
17
|
+
|
|
18
|
+
네이버 커머스 API 이용을 위해서는 [커머스 API 센터](https://apicenter.commerce.naver.com/ko/member/home)에서 개발업체 계정 생성 후 애플리케이션을 등록해야 합니다.
|
|
19
|
+
|
|
20
|
+
**주의사항**: 애플리케이션 등록 과정에서 API 호출에 사용할 **고정 IP**가 필요합니다.
|
|
21
|
+
|
|
22
|
+
## Getting Started
|
|
23
|
+
|
|
24
|
+
### Installing
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
npm install @ingestkorea/client-naver-commerce
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Pre-requisites
|
|
31
|
+
|
|
32
|
+
SDK는 아래 사항들을 요구합니다.
|
|
33
|
+
|
|
34
|
+
- TypeScript v5 이상
|
|
35
|
+
- Node v22 이상
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
# save dev mode
|
|
39
|
+
npm install -D typescript
|
|
40
|
+
npm install -D @types/node
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Support Methods
|
|
44
|
+
|
|
45
|
+
- CreateAccessToken
|
|
46
|
+
- GetAccountInfo
|
|
47
|
+
- ListChangedOrderStatuses
|
|
48
|
+
|
|
49
|
+
## Import
|
|
50
|
+
|
|
51
|
+
Naver Commerce SDK는 `client`, `commands` 두 개의 모듈로 구성되어 있습니다.
|
|
52
|
+
|
|
53
|
+
SDK 사용을 위해서는 `NaverCommerceClient`, 필요한 `Command` 단 두 개만 import 하면 됩니다. (예시를 위해 `CreateAccessTokenCommand`를 사용하겠습니다)
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
import { NaverCommerceClient, CreateAccessTokenCommand } from "@ingestkorea/client-naver-commerce";
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Usage
|
|
60
|
+
|
|
61
|
+
요청을 보내기 위해서는
|
|
62
|
+
|
|
63
|
+
- Client 초기화 / 설정 정보 필요(ex. credentials)
|
|
64
|
+
- Command 초기화 / 파라미터 값들 필요
|
|
65
|
+
- `send` 메서드 호출 / Command 객체 필요
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { NaverCommerceClient, GetAccountInfoCommand } from "@ingestkorea/client-naver-commerce";
|
|
69
|
+
|
|
70
|
+
// a client can be shared by different commands.
|
|
71
|
+
const client = new NaverCommerceClient({
|
|
72
|
+
credentials: {
|
|
73
|
+
appId: "APPLICATION_ID",
|
|
74
|
+
appSecret: "APPLICATION_SECRET",
|
|
75
|
+
accessToken: "ACCESS_TOKEN",
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
const command = new GetAccountInfoCommand({});
|
|
79
|
+
|
|
80
|
+
const output = await client.send(command);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Acess Token
|
|
84
|
+
|
|
85
|
+
네이버 커머스 API는 모든 요청에 [인증 토큰](https://apicenter.commerce.naver.com/docs/auth)을 요구합니다.
|
|
86
|
+
|
|
87
|
+
토큰 발급에 필요한 전자서명은 SDK에서 내부적으로 수행하므로, SDK 사용자는 오직 [커머스 API 센터](https://apicenter.commerce.naver.com/ko/member/home)에서 발급한 **Applicaion ID, Applicaion Secret** 값들을 `Client`에 선언 후, `CreateAccessTokenCommand`를 호출하시면 됩니다.
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
import { NaverCommerceClient, CreateAccessTokenCommand } from "@ingestkorea/client-naver-commerce";
|
|
91
|
+
|
|
92
|
+
const client = new NaverCommerceClient({
|
|
93
|
+
credentials: {
|
|
94
|
+
appId: "MY_APP_ID",
|
|
95
|
+
appSecret: "MY_APP_SECRET",
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const output = await client.send(new CreateAccessTokenCommand({}));
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"$metadata": {
|
|
105
|
+
"httpStatusCode": 200,
|
|
106
|
+
"attempts": 1,
|
|
107
|
+
"totalRetryDelay": 0,
|
|
108
|
+
"traceId": "xxxxxxxxx"
|
|
109
|
+
},
|
|
110
|
+
"access_token": "5M8fqYeK6xxxxx",
|
|
111
|
+
"expires_in": 10800,
|
|
112
|
+
"token_type": "Bearer"
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### API 호출하기
|
|
117
|
+
|
|
118
|
+
발급받은 인증 토큰의 유효 시간은 **3시간**(10,800초)입니다.
|
|
119
|
+
|
|
120
|
+
한 번 초기화된 `client`는 다른 `command` 호출을 위해 공유할 수 있습니다.
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
import {
|
|
124
|
+
NaverCommerceClient,
|
|
125
|
+
GetAccountInfoCommand,
|
|
126
|
+
} from "@ingestkorea/client-naver-commerce";
|
|
127
|
+
|
|
128
|
+
...
|
|
129
|
+
|
|
130
|
+
// 발급받은 access_token을 client 인증 정보에 반영
|
|
131
|
+
client.config.credentials.accessToken = "MY_ACCESS_TOKEN";
|
|
132
|
+
|
|
133
|
+
const command = new GetAccountInfoCommand({});
|
|
134
|
+
|
|
135
|
+
// a client can be shared by different commands.
|
|
136
|
+
const output = await client.send(command);
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"$metadata": {
|
|
142
|
+
"httpStatusCode": 200,
|
|
143
|
+
"attempts": 1,
|
|
144
|
+
"totalRetryDelay": 0,
|
|
145
|
+
"traceId": "xxxxxxxx",
|
|
146
|
+
"rateLimit": 3
|
|
147
|
+
},
|
|
148
|
+
"accountId": "ncp_xxxxxx",
|
|
149
|
+
"accountUid": "ncp_xxxxxxzzzzzz",
|
|
150
|
+
"grade": "xx"
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Getting Help
|
|
155
|
+
|
|
156
|
+
기능 추가 요청, 버그 신고는 깃허브 이슈를 사용해주세요.
|
|
157
|
+
|
|
158
|
+
## License
|
|
159
|
+
|
|
160
|
+
This SDK is distributed under the [MIT License](https://opensource.org/licenses/MIT), see LICENSE for more information.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.NaverCommerceClient = void 0;
|
|
13
|
+
const util_http_handler_1 = require("@ingestkorea/util-http-handler");
|
|
14
|
+
const index_js_1 = require("./models/index.js");
|
|
15
|
+
const index_js_2 = require("./middleware/index.js");
|
|
16
|
+
class NaverCommerceClient {
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.httpHandler = new util_http_handler_1.NodeHttpHandler({ connectionTimeout: 3000, socketTimeout: 3000 });
|
|
19
|
+
this.requestHandler = (input, context) => __awaiter(this, void 0, void 0, function* () { return this.httpHandler.handle(input.request); });
|
|
20
|
+
this.config = {
|
|
21
|
+
credentials: resolveCredentials(config),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
send(command) {
|
|
25
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
const { input, serializer, deserializer } = command;
|
|
27
|
+
const middlewares = [index_js_2.middlewareAuth, index_js_2.middlewareIngestkoreaMetadata, index_js_2.middlewareRetry];
|
|
28
|
+
const handler = composeMiddleware(middlewares, this.requestHandler);
|
|
29
|
+
try {
|
|
30
|
+
const request = yield serializer(input, this.config);
|
|
31
|
+
const { response } = yield handler({ request }, this.config);
|
|
32
|
+
const output = yield deserializer(response, this.config);
|
|
33
|
+
return output;
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
throw e;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.NaverCommerceClient = NaverCommerceClient;
|
|
42
|
+
const composeMiddleware = (middlewares, finalHandler) => {
|
|
43
|
+
const handler = middlewares.reduceRight((next, middleware) => {
|
|
44
|
+
return middleware(next);
|
|
45
|
+
}, finalHandler);
|
|
46
|
+
return handler;
|
|
47
|
+
};
|
|
48
|
+
const resolveCredentials = (config) => {
|
|
49
|
+
const { credentials } = config;
|
|
50
|
+
let error = new index_js_1.NaverCommerceError({
|
|
51
|
+
code: "GENERAL_ERROR",
|
|
52
|
+
message: "자격 증명이 유효하지 않습니다.",
|
|
53
|
+
timestamp: new Date().toISOString(),
|
|
54
|
+
invalidInputs: [
|
|
55
|
+
{
|
|
56
|
+
name: "credentials",
|
|
57
|
+
type: "not-valid.args",
|
|
58
|
+
message: "NaverCommerceClient 초기화시 인증 정보를 확인해주세요.",
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
});
|
|
62
|
+
if (!credentials)
|
|
63
|
+
throw error;
|
|
64
|
+
if (!credentials.appId) {
|
|
65
|
+
error.invalidInputs[0].message = "Application ID 정보를 확인해주세요.";
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
if (!credentials.appSecret) {
|
|
69
|
+
error.invalidInputs[0].message = "Application Secret 정보를 확인해주세요.";
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
appId: credentials.appId,
|
|
74
|
+
appSecret: credentials.appSecret,
|
|
75
|
+
accessToken: credentials.accessToken || "",
|
|
76
|
+
};
|
|
77
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CreateAccessTokenCommand = void 0;
|
|
4
|
+
const index_js_1 = require("../models/index.js");
|
|
5
|
+
const CreateAccessToken_js_1 = require("../protocols/CreateAccessToken.js");
|
|
6
|
+
class CreateAccessTokenCommand extends index_js_1.CommerceCommand {
|
|
7
|
+
constructor(input) {
|
|
8
|
+
super(input);
|
|
9
|
+
this.input = {};
|
|
10
|
+
this.serializer = CreateAccessToken_js_1.se_CreateAccessTokenCommand;
|
|
11
|
+
this.deserializer = CreateAccessToken_js_1.de_CreateAccessTokenCommand;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.CreateAccessTokenCommand = CreateAccessTokenCommand;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GetAccountInfoCommand = void 0;
|
|
4
|
+
const index_js_1 = require("../models/index.js");
|
|
5
|
+
const GetAccountInfo_js_1 = require("../protocols/GetAccountInfo.js");
|
|
6
|
+
class GetAccountInfoCommand extends index_js_1.CommerceCommand {
|
|
7
|
+
constructor(input) {
|
|
8
|
+
super(input);
|
|
9
|
+
this.input = {};
|
|
10
|
+
this.serializer = GetAccountInfo_js_1.se_GetAccountInfoCommand;
|
|
11
|
+
this.deserializer = GetAccountInfo_js_1.de_GetAccountInfoCommand;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.GetAccountInfoCommand = GetAccountInfoCommand;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ListChangedOrderStatusesCommand = void 0;
|
|
4
|
+
const index_js_1 = require("../models/index.js");
|
|
5
|
+
const ListChangedOrderStatuses_js_1 = require("../protocols/ListChangedOrderStatuses.js");
|
|
6
|
+
const LAST_CHANGED_TYPE_SET = new Set(Object.values(index_js_1.LAST_CHANGED_TYPE));
|
|
7
|
+
const DEFAULT_LIMIT = 10;
|
|
8
|
+
const MAX_LIMIT = 300;
|
|
9
|
+
class ListChangedOrderStatusesCommand extends index_js_1.CommerceCommand {
|
|
10
|
+
constructor(input) {
|
|
11
|
+
var _a;
|
|
12
|
+
super(input);
|
|
13
|
+
const now = new Date();
|
|
14
|
+
const lastChangedFrom = isUtcTimeFormat(input.lastChangedFrom) ? input.lastChangedFrom : null;
|
|
15
|
+
if (!lastChangedFrom) {
|
|
16
|
+
throw new index_js_1.NaverCommerceError({
|
|
17
|
+
code: "GENERAL_ERROR",
|
|
18
|
+
message: "lastChangedFrom must be UTC format (ISO 8601). 2026-01-01T12:34:56.789Z",
|
|
19
|
+
timestamp: now.toISOString(),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const lastChangedTo = isUtcTimeFormat(input.lastChangedTo) ? input.lastChangedTo : now.toISOString();
|
|
23
|
+
const lastChangedType = isLastChangedType(input.lastChangedType) ? input.lastChangedType : null;
|
|
24
|
+
this.input = Object.assign(Object.assign(Object.assign({ lastChangedFrom,
|
|
25
|
+
lastChangedTo }, (lastChangedType && { lastChangedType })), (input.moreSequence && { moreSequence: input.moreSequence })), { limitCount: Math.min(MAX_LIMIT, Math.max(1, (_a = input.limitCount) !== null && _a !== void 0 ? _a : DEFAULT_LIMIT)) });
|
|
26
|
+
this.serializer = ListChangedOrderStatuses_js_1.se_ListChangedOrderStatusesCommand;
|
|
27
|
+
this.deserializer = ListChangedOrderStatuses_js_1.de_ListChangedOrderStatusesCommand;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.ListChangedOrderStatusesCommand = ListChangedOrderStatusesCommand;
|
|
31
|
+
const isUtcTimeFormat = (input) => {
|
|
32
|
+
if (!input || typeof input !== "string")
|
|
33
|
+
return false;
|
|
34
|
+
const utcZRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/;
|
|
35
|
+
if (!utcZRegex.test(input))
|
|
36
|
+
return false;
|
|
37
|
+
const date = new Date(input);
|
|
38
|
+
return !isNaN(date.getTime());
|
|
39
|
+
};
|
|
40
|
+
const isLastChangedType = (input) => {
|
|
41
|
+
if (!input || typeof input !== "string")
|
|
42
|
+
return false;
|
|
43
|
+
return LAST_CHANGED_TYPE_SET.has(input);
|
|
44
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./CreateAccessTokenCommand.js"), exports);
|
|
18
|
+
__exportStar(require("./GetAccountInfoCommand.js"), exports);
|
|
19
|
+
__exportStar(require("./ListChangedOrderStatusesCommand.js"), exports);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./NaverCommerceClient.js"), exports);
|
|
18
|
+
__exportStar(require("./commands/index.js"), exports);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NAVER_COMMERCE_RATE_LIMIT = exports.NAVER_COMMERCE_TRACE_ID = exports.INGESTKOREA_RETRY_DELAY = exports.INGESTKOREA_RETRY = exports.INGESTKOREA_REQUEST_LOG = exports.INGESTKOREA_USER_AGENT = void 0;
|
|
4
|
+
exports.INGESTKOREA_USER_AGENT = "x-ingestkorea-user-agent";
|
|
5
|
+
exports.INGESTKOREA_REQUEST_LOG = "x-ingestkorea-request";
|
|
6
|
+
exports.INGESTKOREA_RETRY = "x-ingestkorea-attempts";
|
|
7
|
+
exports.INGESTKOREA_RETRY_DELAY = "x-ingestkorea-total-retry-delay";
|
|
8
|
+
exports.NAVER_COMMERCE_TRACE_ID = "gncp-gw-trace-id";
|
|
9
|
+
exports.NAVER_COMMERCE_RATE_LIMIT = "gncp-gw-ratelimit-remaining";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./middleware-auth.js"), exports);
|
|
18
|
+
__exportStar(require("./middleware-metadata.js"), exports);
|
|
19
|
+
__exportStar(require("./middleware-retry.js"), exports);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.middlewareAuth = void 0;
|
|
13
|
+
const middlewareAuth = (next) => (input, context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
14
|
+
const { credentials } = context;
|
|
15
|
+
input.request.headers = Object.assign(Object.assign({}, input.request.headers), (credentials.accessToken && { authorization: "Bearer " + credentials.accessToken }));
|
|
16
|
+
return next(input, context);
|
|
17
|
+
});
|
|
18
|
+
exports.middlewareAuth = middlewareAuth;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.middlewareIngestkoreaMetadata = void 0;
|
|
13
|
+
const constants_js_1 = require("./constants.js");
|
|
14
|
+
const middlewareIngestkoreaMetadata = (next) => (input, context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
input.request.headers = Object.assign(Object.assign({}, input.request.headers), { [constants_js_1.INGESTKOREA_USER_AGENT]: "@ingestkorea/client-naver-commerce/0.3.x" });
|
|
16
|
+
return next(input, context);
|
|
17
|
+
});
|
|
18
|
+
exports.middlewareIngestkoreaMetadata = middlewareIngestkoreaMetadata;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.middlewareRetry = void 0;
|
|
13
|
+
const util_error_handler_1 = require("@ingestkorea/util-error-handler");
|
|
14
|
+
const constants_js_1 = require("./constants.js");
|
|
15
|
+
const middlewareRetry = (next) => (input, context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
16
|
+
var _a, _b;
|
|
17
|
+
var _c;
|
|
18
|
+
const MAX_RETRIES = 3;
|
|
19
|
+
const BASE_DELAY_MS = 500;
|
|
20
|
+
const MAX_DELAY_MS = 5000;
|
|
21
|
+
let attempts = 0;
|
|
22
|
+
let totalRetryDelay = 0;
|
|
23
|
+
(_a = (_c = input.request).headers) !== null && _a !== void 0 ? _a : (_c.headers = {});
|
|
24
|
+
let lastError = new util_error_handler_1.IngestkoreaError({
|
|
25
|
+
code: 400,
|
|
26
|
+
type: "Bad Request",
|
|
27
|
+
message: "Invalid Request",
|
|
28
|
+
description: { attempts, maxRetries: MAX_RETRIES, totalRetryDelay },
|
|
29
|
+
});
|
|
30
|
+
while (attempts < MAX_RETRIES) {
|
|
31
|
+
const attemptNo = attempts + 1;
|
|
32
|
+
// 요청에 현재 상태 로깅
|
|
33
|
+
const requestLog = `attempt=${attemptNo}; max=${MAX_RETRIES}; totalRetryDelay=${totalRetryDelay}`;
|
|
34
|
+
input.request.headers[constants_js_1.INGESTKOREA_REQUEST_LOG] = requestLog;
|
|
35
|
+
try {
|
|
36
|
+
const { response } = yield next(input, context);
|
|
37
|
+
response.headers[constants_js_1.INGESTKOREA_RETRY] = attemptNo.toString();
|
|
38
|
+
response.headers[constants_js_1.INGESTKOREA_RETRY_DELAY] = totalRetryDelay.toString();
|
|
39
|
+
return { response };
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
attempts++;
|
|
43
|
+
lastError.error.description = { attempts, maxRetries: MAX_RETRIES, totalRetryDelay };
|
|
44
|
+
if (error instanceof util_error_handler_1.IngestkoreaError) {
|
|
45
|
+
lastError.error.description = Object.assign(Object.assign({}, lastError.error.description), { detail: error.error.description });
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
lastError.error.description = Object.assign(Object.assign({}, lastError.error.description), { detail: String((_b = error === null || error === void 0 ? void 0 : error.message) !== null && _b !== void 0 ? _b : error) });
|
|
49
|
+
}
|
|
50
|
+
if (attempts >= MAX_RETRIES) {
|
|
51
|
+
lastError.error.description = { attempts, maxRetries: MAX_RETRIES, totalRetryDelay };
|
|
52
|
+
throw lastError;
|
|
53
|
+
}
|
|
54
|
+
const exp = BASE_DELAY_MS * Math.pow(2, (attempts - 1));
|
|
55
|
+
const capped = Math.min(MAX_DELAY_MS, exp);
|
|
56
|
+
const delay = Math.floor(Math.random() * capped);
|
|
57
|
+
totalRetryDelay += delay;
|
|
58
|
+
lastError.error.description = { attempts, maxRetries: MAX_RETRIES, totalRetryDelay };
|
|
59
|
+
yield new Promise((resolve) => setTimeout(resolve, delay));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
throw lastError;
|
|
63
|
+
});
|
|
64
|
+
exports.middlewareRetry = middlewareRetry;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NaverCommerceError = void 0;
|
|
4
|
+
class NaverCommerceError extends Error {
|
|
5
|
+
constructor(info) {
|
|
6
|
+
super(info.message);
|
|
7
|
+
this.name = "NaverCommerceError";
|
|
8
|
+
this.code = info.code;
|
|
9
|
+
this.timestamp = new Date(info.timestamp).toISOString();
|
|
10
|
+
this.traceId = info.traceId || "local";
|
|
11
|
+
this.invalidInputs = info.invalidInputs || [];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.NaverCommerceError = NaverCommerceError;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CLAIM_TYPE = exports.PRODUCT_ORDER_STATUS_TYPE = exports.LAST_CHANGED_TYPE = void 0;
|
|
4
|
+
exports.LAST_CHANGED_TYPE = {
|
|
5
|
+
PAY_WAITING: "PAY_WAITING",
|
|
6
|
+
PAYED: "PAYED",
|
|
7
|
+
EXCHANGE_OPTION: "EXCHANGE_OPTION",
|
|
8
|
+
DELIVERY_ADDRESS_CHANGED: "DELIVERY_ADDRESS_CHANGED",
|
|
9
|
+
GIFT_RECEIVED: "GIFT_RECEIVED",
|
|
10
|
+
CLAIM_REJECTED: "CLAIM_REJECTED",
|
|
11
|
+
DISPATCHED: "DISPATCHED",
|
|
12
|
+
CLAIM_REQUESTED: "CLAIM_REQUESTED",
|
|
13
|
+
COLLECT_DONE: "COLLECT_DONE",
|
|
14
|
+
CLAIM_COMPLETED: "CLAIM_COMPLETED",
|
|
15
|
+
PURCHASE_DECIDED: "PURCHASE_DECIDED",
|
|
16
|
+
HOPE_DELIVERY_INFO_CHANGED: "HOPE_DELIVERY_INFO_CHANGED",
|
|
17
|
+
CLAIM_REDELIVERING: "CLAIM_REDELIVERING",
|
|
18
|
+
};
|
|
19
|
+
exports.PRODUCT_ORDER_STATUS_TYPE = {
|
|
20
|
+
PAYMENT_WAITING: "PAYMENT_WAITING",
|
|
21
|
+
PAYED: "PAYED",
|
|
22
|
+
DELIVERING: "DELIVERING",
|
|
23
|
+
DELIVERED: "DELIVERED",
|
|
24
|
+
PURCHASE_DECIDED: "PURCHASE_DECIDED",
|
|
25
|
+
EXCHANGED: "EXCHANGED",
|
|
26
|
+
CANCELED: "CANCELED",
|
|
27
|
+
RETURNED: "RETURNED",
|
|
28
|
+
CANCELED_BY_NOPAYMENT: "CANCELED_BY_NOPAYMENT",
|
|
29
|
+
};
|
|
30
|
+
exports.CLAIM_TYPE = {
|
|
31
|
+
CANCEL: "CANCEL",
|
|
32
|
+
RETURN: "RETURN",
|
|
33
|
+
EXCHANGE: "EXCHANGE",
|
|
34
|
+
PURCHASE_DECISION_HOLDBACK: "PURCHASE_DECISION_HOLDBACK",
|
|
35
|
+
ADMIN_CANCEL: "ADMIN_CANCEL",
|
|
36
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./CommerceClient.js"), exports);
|
|
18
|
+
__exportStar(require("./CommerceCommand.js"), exports);
|
|
19
|
+
__exportStar(require("./CommerceErrorInfo.js"), exports);
|
|
20
|
+
__exportStar(require("./CommerceMiddleware.js"), exports);
|
|
21
|
+
__exportStar(require("./CreateAccessToken.js"), exports);
|
|
22
|
+
__exportStar(require("./GetAccountInfo.js"), exports);
|
|
23
|
+
__exportStar(require("./ListChangedOrderStatuses.js"), exports);
|
|
24
|
+
__exportStar(require("./MetadataBearer.js"), exports);
|