deliveryapi 0.1.4 → 0.2.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.cjs +282 -202
- package/dist/index.d.cts +440 -461
- package/dist/index.d.ts +440 -461
- package/dist/index.js +281 -198
- package/package.json +2 -5
- package/README.md +0 -252
package/dist/index.cjs
CHANGED
|
@@ -1,232 +1,312 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
// src/
|
|
4
|
-
var
|
|
5
|
-
constructor(
|
|
3
|
+
// src/http.ts
|
|
4
|
+
var ApiError = class extends Error {
|
|
5
|
+
constructor(statusCode, errorCode, message) {
|
|
6
6
|
super(message);
|
|
7
7
|
this.statusCode = statusCode;
|
|
8
|
-
this.
|
|
9
|
-
this.name = "
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
var AuthenticationError = class extends DeliverySaasError {
|
|
13
|
-
constructor(message = "Invalid API key or secret key") {
|
|
14
|
-
super(message, 401, "AUTHENTICATION_ERROR");
|
|
15
|
-
this.name = "AuthenticationError";
|
|
8
|
+
this.errorCode = errorCode;
|
|
9
|
+
this.name = "ApiError";
|
|
16
10
|
}
|
|
17
11
|
};
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
async function request(baseUrl, path, options = {}) {
|
|
13
|
+
const { token, ...fetchOptions } = options;
|
|
14
|
+
const headers = {
|
|
15
|
+
"Content-Type": "application/json",
|
|
16
|
+
...fetchOptions.headers
|
|
17
|
+
};
|
|
18
|
+
if (token) {
|
|
19
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
22
20
|
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
const res = await fetch(`${baseUrl}${path}`, {
|
|
22
|
+
...fetchOptions,
|
|
23
|
+
headers
|
|
24
|
+
});
|
|
25
|
+
const body = await res.json();
|
|
26
|
+
if (!res.ok || !body.isSuccess) {
|
|
27
|
+
throw new ApiError(
|
|
28
|
+
res.status,
|
|
29
|
+
body.errorCode,
|
|
30
|
+
body.error ?? `Request failed with status ${res.status}`
|
|
31
|
+
);
|
|
28
32
|
}
|
|
29
|
-
|
|
33
|
+
return body.data;
|
|
34
|
+
}
|
|
30
35
|
|
|
31
|
-
// src/
|
|
32
|
-
var
|
|
33
|
-
constructor(
|
|
34
|
-
this.baseUrl = baseUrl
|
|
35
|
-
this.
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return this.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
"Content-Type": "application/json"
|
|
60
|
-
};
|
|
61
|
-
const response = await fetch(url, {
|
|
62
|
-
method,
|
|
63
|
-
headers,
|
|
64
|
-
body: body !== void 0 ? JSON.stringify(body) : void 0
|
|
65
|
-
});
|
|
66
|
-
const json = await response.json();
|
|
67
|
-
if (!response.ok) {
|
|
68
|
-
if (response.status === 401) throw new AuthenticationError(json.message);
|
|
69
|
-
if (response.status === 404) throw new NotFoundError(json.message);
|
|
70
|
-
if (response.status === 429) throw new RateLimitError(json.message);
|
|
71
|
-
throw new DeliverySaasError(json.message ?? "Request failed", response.status, json.error);
|
|
72
|
-
}
|
|
73
|
-
if (!json.isSuccess) {
|
|
74
|
-
throw new DeliverySaasError(json.message ?? "API returned failure", response.status, json.error);
|
|
75
|
-
}
|
|
76
|
-
return json.data;
|
|
36
|
+
// src/resources/auth.ts
|
|
37
|
+
var AuthResource = class {
|
|
38
|
+
constructor(baseUrl, getToken) {
|
|
39
|
+
this.baseUrl = baseUrl;
|
|
40
|
+
this.getToken = getToken;
|
|
41
|
+
}
|
|
42
|
+
/** Step 1: 이메일 인증 코드 요청 */
|
|
43
|
+
async requestVerification(params) {
|
|
44
|
+
await request(this.baseUrl, "/v1/homepage/register/request", {
|
|
45
|
+
method: "POST",
|
|
46
|
+
body: JSON.stringify(params)
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/** Step 2: 인증 코드 검증 + Firebase 계정 생성 → customToken 반환 */
|
|
50
|
+
async verifyAndRegister(params) {
|
|
51
|
+
return request(this.baseUrl, "/v1/homepage/register/verify", {
|
|
52
|
+
method: "POST",
|
|
53
|
+
body: JSON.stringify(params)
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** Google 로그인 후 HP 사용자 문서 확인/생성 */
|
|
57
|
+
async ensureUser() {
|
|
58
|
+
const token = await this.getToken();
|
|
59
|
+
return request(this.baseUrl, "/v1/homepage/ensure-user", {
|
|
60
|
+
method: "POST",
|
|
61
|
+
body: JSON.stringify({}),
|
|
62
|
+
token
|
|
63
|
+
});
|
|
77
64
|
}
|
|
78
65
|
};
|
|
79
66
|
|
|
80
|
-
// src/resources/
|
|
81
|
-
var
|
|
82
|
-
constructor(
|
|
83
|
-
this.
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
async getOne(courierCode, trackingNumber, options) {
|
|
100
|
-
return this.get(
|
|
101
|
-
[{ courierCode, trackingNumber, clientId: options?.clientId }],
|
|
102
|
-
options?.includeProgresses ?? true
|
|
103
|
-
);
|
|
67
|
+
// src/resources/dashboard.ts
|
|
68
|
+
var DashboardResource = class {
|
|
69
|
+
constructor(baseUrl, getToken) {
|
|
70
|
+
this.baseUrl = baseUrl;
|
|
71
|
+
this.getToken = getToken;
|
|
72
|
+
}
|
|
73
|
+
/** 대시보드 데이터 조회 (API 키 목록, 사용량, 플랜 정보) */
|
|
74
|
+
async get() {
|
|
75
|
+
const token = await this.getToken();
|
|
76
|
+
return request(this.baseUrl, "/v1/homepage/dashboard", { token });
|
|
77
|
+
}
|
|
78
|
+
/** API 키 발급 */
|
|
79
|
+
async issueKey() {
|
|
80
|
+
const token = await this.getToken();
|
|
81
|
+
return request(this.baseUrl, "/v1/homepage/dashboard/issue-key", {
|
|
82
|
+
method: "POST",
|
|
83
|
+
body: JSON.stringify({}),
|
|
84
|
+
token
|
|
85
|
+
});
|
|
104
86
|
}
|
|
105
87
|
};
|
|
106
88
|
|
|
107
|
-
// src/resources/
|
|
108
|
-
var
|
|
109
|
-
constructor(
|
|
110
|
-
this.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return this.
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
async
|
|
147
|
-
await this.
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
);
|
|
89
|
+
// src/resources/qna.ts
|
|
90
|
+
var QnaResource = class {
|
|
91
|
+
constructor(baseUrl, getToken) {
|
|
92
|
+
this.baseUrl = baseUrl;
|
|
93
|
+
this.getToken = getToken;
|
|
94
|
+
}
|
|
95
|
+
/** 게시글 목록 조회 (비회원도 공개글 열람 가능) */
|
|
96
|
+
async listPosts(params = {}) {
|
|
97
|
+
const token = await this.getToken();
|
|
98
|
+
const qs = new URLSearchParams();
|
|
99
|
+
if (params.cursor) qs.set("cursor", params.cursor);
|
|
100
|
+
if (params.pageSize) qs.set("pageSize", String(params.pageSize));
|
|
101
|
+
const query = qs.toString() ? `?${qs.toString()}` : "";
|
|
102
|
+
return request(this.baseUrl, `/v1/homepage/posts${query}`, { token });
|
|
103
|
+
}
|
|
104
|
+
/** 게시글 상세 조회 */
|
|
105
|
+
async getPost(postId) {
|
|
106
|
+
const token = await this.getToken();
|
|
107
|
+
return request(this.baseUrl, `/v1/homepage/posts/${postId}`, { token });
|
|
108
|
+
}
|
|
109
|
+
/** 게시글 작성 (로그인 필요) */
|
|
110
|
+
async createPost(params) {
|
|
111
|
+
const token = await this.getToken();
|
|
112
|
+
return request(this.baseUrl, "/v1/homepage/posts", {
|
|
113
|
+
method: "POST",
|
|
114
|
+
body: JSON.stringify(params),
|
|
115
|
+
token
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/** 게시글 수정 (작성자/관리자만) */
|
|
119
|
+
async updatePost(postId, params) {
|
|
120
|
+
const token = await this.getToken();
|
|
121
|
+
return request(this.baseUrl, `/v1/homepage/posts/${postId}`, {
|
|
122
|
+
method: "PUT",
|
|
123
|
+
body: JSON.stringify(params),
|
|
124
|
+
token
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/** 게시글 삭제 (작성자/관리자만) */
|
|
128
|
+
async deletePost(postId) {
|
|
129
|
+
const token = await this.getToken();
|
|
130
|
+
await request(this.baseUrl, `/v1/homepage/posts/${postId}`, {
|
|
131
|
+
method: "DELETE",
|
|
132
|
+
token
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/** 댓글 목록 조회 */
|
|
136
|
+
async listComments(postId) {
|
|
137
|
+
const token = await this.getToken();
|
|
138
|
+
return request(this.baseUrl, `/v1/homepage/posts/${postId}/comments`, { token });
|
|
139
|
+
}
|
|
140
|
+
/** 댓글 작성 (로그인 필요) */
|
|
141
|
+
async createComment(postId, params) {
|
|
142
|
+
const token = await this.getToken();
|
|
143
|
+
return request(this.baseUrl, `/v1/homepage/posts/${postId}/comments`, {
|
|
144
|
+
method: "POST",
|
|
145
|
+
body: JSON.stringify(params),
|
|
146
|
+
token
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/** 댓글 삭제 (작성자/관리자만) */
|
|
150
|
+
async deleteComment(commentId) {
|
|
151
|
+
const token = await this.getToken();
|
|
152
|
+
await request(this.baseUrl, `/v1/homepage/comments/${commentId}`, {
|
|
153
|
+
method: "DELETE",
|
|
154
|
+
token
|
|
155
|
+
});
|
|
156
156
|
}
|
|
157
157
|
};
|
|
158
158
|
|
|
159
|
-
// src/resources/
|
|
160
|
-
var
|
|
161
|
-
constructor(
|
|
162
|
-
this.
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
159
|
+
// src/resources/admin.ts
|
|
160
|
+
var AdminResource = class {
|
|
161
|
+
constructor(baseUrl, getToken) {
|
|
162
|
+
this.baseUrl = baseUrl;
|
|
163
|
+
this.getToken = getToken;
|
|
164
|
+
}
|
|
165
|
+
async token() {
|
|
166
|
+
return this.getToken();
|
|
167
|
+
}
|
|
168
|
+
/** 전체 통계 조회 */
|
|
169
|
+
async getStats() {
|
|
170
|
+
return request(this.baseUrl, "/v1/homepage/admin/stats", {
|
|
171
|
+
token: await this.token()
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/** 최근 14일 일별 가입자 수 */
|
|
175
|
+
async getDailySignups() {
|
|
176
|
+
return request(this.baseUrl, "/v1/homepage/admin/daily-signups", {
|
|
177
|
+
token: await this.token()
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/** 사용자 목록 조회 */
|
|
181
|
+
async listUsers() {
|
|
182
|
+
return request(this.baseUrl, "/v1/homepage/admin/users", {
|
|
183
|
+
token: await this.token()
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/** 사용자 정보 수정 */
|
|
187
|
+
async updateUser(uid, params) {
|
|
188
|
+
await request(this.baseUrl, `/v1/homepage/admin/users/${uid}`, {
|
|
189
|
+
method: "PATCH",
|
|
190
|
+
body: JSON.stringify(params),
|
|
191
|
+
token: await this.token()
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/** 사용자 상세 조회 (API 키 + 사용량 포함) */
|
|
195
|
+
async getUserDetail(uid) {
|
|
196
|
+
return request(this.baseUrl, `/v1/homepage/admin/users/${uid}/detail`, {
|
|
197
|
+
token: await this.token()
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
/** customers 목록 조회 */
|
|
201
|
+
async listCustomers() {
|
|
202
|
+
return request(this.baseUrl, "/v1/homepage/admin/customers", {
|
|
203
|
+
token: await this.token()
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/** API 키 목록 조회 */
|
|
207
|
+
async listKeys() {
|
|
208
|
+
return request(this.baseUrl, "/v1/homepage/admin/keys", {
|
|
209
|
+
token: await this.token()
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
/** API 키 플랜 변경 */
|
|
213
|
+
async updateKeyPlan(apiKeyHash, params) {
|
|
214
|
+
await request(this.baseUrl, `/v1/homepage/admin/keys/${apiKeyHash}/plan`, {
|
|
215
|
+
method: "PATCH",
|
|
216
|
+
body: JSON.stringify(params),
|
|
217
|
+
token: await this.token()
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/** API 키 플랜 일괄 변경 */
|
|
221
|
+
async bulkUpdateKeyPlan(params) {
|
|
222
|
+
await request(this.baseUrl, "/v1/homepage/admin/keys/bulk/plan", {
|
|
223
|
+
method: "PATCH",
|
|
224
|
+
body: JSON.stringify(params),
|
|
225
|
+
token: await this.token()
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/** Secret Key limits 수정 */
|
|
229
|
+
async updateKeyLimits(apiKeyHash, params) {
|
|
230
|
+
await request(this.baseUrl, `/v1/homepage/admin/keys/${apiKeyHash}/limits`, {
|
|
231
|
+
method: "PATCH",
|
|
232
|
+
body: JSON.stringify(params),
|
|
233
|
+
token: await this.token()
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
/** 데모 키 생성 */
|
|
237
|
+
async createDemoKey(params = {}) {
|
|
238
|
+
return request(this.baseUrl, "/v1/homepage/admin/demo-keys", {
|
|
239
|
+
method: "POST",
|
|
240
|
+
body: JSON.stringify(params),
|
|
241
|
+
token: await this.token()
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
/** 데모 키 목록 조회 */
|
|
245
|
+
async listDemoKeys() {
|
|
246
|
+
return request(this.baseUrl, "/v1/homepage/admin/demo-keys", {
|
|
247
|
+
token: await this.token()
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
/** 데모 키 비활성화 */
|
|
251
|
+
async deactivateDemoKey(apiKeyHash) {
|
|
252
|
+
await request(this.baseUrl, `/v1/homepage/admin/demo-keys/${apiKeyHash}/deactivate`, {
|
|
253
|
+
method: "PATCH",
|
|
254
|
+
body: JSON.stringify({}),
|
|
255
|
+
token: await this.token()
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
/** 데모 키 활성화 */
|
|
259
|
+
async activateDemoKey(apiKeyHash) {
|
|
260
|
+
await request(this.baseUrl, `/v1/homepage/admin/demo-keys/${apiKeyHash}/activate`, {
|
|
261
|
+
method: "PATCH",
|
|
262
|
+
body: JSON.stringify({}),
|
|
263
|
+
token: await this.token()
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/** 조회 로그 목록 */
|
|
267
|
+
async listTrackingLogs(page = 1) {
|
|
268
|
+
return request(
|
|
269
|
+
this.baseUrl,
|
|
270
|
+
`/v1/homepage/admin/tracking-logs?page=${page}`,
|
|
271
|
+
{ token: await this.token() }
|
|
195
272
|
);
|
|
196
273
|
}
|
|
197
274
|
};
|
|
198
275
|
|
|
199
|
-
// src/resources/
|
|
200
|
-
var
|
|
201
|
-
constructor(
|
|
202
|
-
this.
|
|
276
|
+
// src/resources/public.ts
|
|
277
|
+
var PublicResource = class {
|
|
278
|
+
constructor(baseUrl) {
|
|
279
|
+
this.baseUrl = baseUrl;
|
|
203
280
|
}
|
|
204
|
-
/**
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
281
|
+
/** 요금제 목록 조회 */
|
|
282
|
+
async getPlans() {
|
|
283
|
+
return request(this.baseUrl, "/v1/homepage/plans");
|
|
284
|
+
}
|
|
285
|
+
/** Secret Key 프리셋 목록 조회 */
|
|
286
|
+
async getSecretPresets() {
|
|
287
|
+
return request(this.baseUrl, "/v1/homepage/secret-presets");
|
|
288
|
+
}
|
|
289
|
+
/** 개발 의뢰 문의 전송 */
|
|
290
|
+
async sendContactInquiry(params) {
|
|
291
|
+
await request(this.baseUrl, "/v1/homepage/contact/inquiry", {
|
|
292
|
+
method: "POST",
|
|
293
|
+
body: JSON.stringify(params)
|
|
294
|
+
});
|
|
209
295
|
}
|
|
210
296
|
};
|
|
211
297
|
|
|
212
298
|
// src/client.ts
|
|
213
|
-
var
|
|
214
|
-
var
|
|
215
|
-
constructor(
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
);
|
|
221
|
-
this.
|
|
222
|
-
this.subscriptions = new SubscriptionsResource(http);
|
|
223
|
-
this.webhooks = new WebhooksResource(http);
|
|
224
|
-
this.couriers = new CouriersResource(http);
|
|
299
|
+
var noToken = async () => null;
|
|
300
|
+
var HomepageClient = class {
|
|
301
|
+
constructor(options) {
|
|
302
|
+
const { baseUrl, getToken = noToken } = options;
|
|
303
|
+
this.auth = new AuthResource(baseUrl, getToken);
|
|
304
|
+
this.dashboard = new DashboardResource(baseUrl, getToken);
|
|
305
|
+
this.qna = new QnaResource(baseUrl, getToken);
|
|
306
|
+
this.admin = new AdminResource(baseUrl, getToken);
|
|
307
|
+
this.public = new PublicResource(baseUrl);
|
|
225
308
|
}
|
|
226
309
|
};
|
|
227
310
|
|
|
228
|
-
exports.
|
|
229
|
-
exports.
|
|
230
|
-
exports.DeliverySaasError = DeliverySaasError;
|
|
231
|
-
exports.NotFoundError = NotFoundError;
|
|
232
|
-
exports.RateLimitError = RateLimitError;
|
|
311
|
+
exports.ApiError = ApiError;
|
|
312
|
+
exports.HomepageClient = HomepageClient;
|