@downcity/services 0.1.6

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.
Files changed (78) hide show
  1. package/README.md +47 -0
  2. package/bin/accounts/db.d.ts +19 -0
  3. package/bin/accounts/db.d.ts.map +1 -0
  4. package/bin/accounts/db.js +68 -0
  5. package/bin/accounts/db.js.map +1 -0
  6. package/bin/accounts/index.d.ts +348 -0
  7. package/bin/accounts/index.d.ts.map +1 -0
  8. package/bin/accounts/index.js +681 -0
  9. package/bin/accounts/index.js.map +1 -0
  10. package/bin/accounts/oauth.d.ts +129 -0
  11. package/bin/accounts/oauth.d.ts.map +1 -0
  12. package/bin/accounts/oauth.js +220 -0
  13. package/bin/accounts/oauth.js.map +1 -0
  14. package/bin/accounts/schema.d.ts +319 -0
  15. package/bin/accounts/schema.d.ts.map +1 -0
  16. package/bin/accounts/schema.js +72 -0
  17. package/bin/accounts/schema.js.map +1 -0
  18. package/bin/balance/index.d.ts +7 -0
  19. package/bin/balance/index.d.ts.map +1 -0
  20. package/bin/balance/index.js +6 -0
  21. package/bin/balance/index.js.map +1 -0
  22. package/bin/balance/raw.d.ts +20 -0
  23. package/bin/balance/raw.d.ts.map +1 -0
  24. package/bin/balance/raw.js +75 -0
  25. package/bin/balance/raw.js.map +1 -0
  26. package/bin/balance/routes.d.ts +14 -0
  27. package/bin/balance/routes.d.ts.map +1 -0
  28. package/bin/balance/routes.js +166 -0
  29. package/bin/balance/routes.js.map +1 -0
  30. package/bin/balance/schema.d.ts +764 -0
  31. package/bin/balance/schema.d.ts.map +1 -0
  32. package/bin/balance/schema.js +185 -0
  33. package/bin/balance/schema.js.map +1 -0
  34. package/bin/balance/service.d.ts +880 -0
  35. package/bin/balance/service.d.ts.map +1 -0
  36. package/bin/balance/service.js +557 -0
  37. package/bin/balance/service.js.map +1 -0
  38. package/bin/balance/types.d.ts +326 -0
  39. package/bin/balance/types.d.ts.map +1 -0
  40. package/bin/balance/types.js +10 -0
  41. package/bin/balance/types.js.map +1 -0
  42. package/bin/balance/utils.d.ts +91 -0
  43. package/bin/balance/utils.d.ts.map +1 -0
  44. package/bin/balance/utils.js +231 -0
  45. package/bin/balance/utils.js.map +1 -0
  46. package/bin/index.d.ts +22 -0
  47. package/bin/index.d.ts.map +1 -0
  48. package/bin/index.js +16 -0
  49. package/bin/index.js.map +1 -0
  50. package/bin/payment/index.d.ts +19 -0
  51. package/bin/payment/index.d.ts.map +1 -0
  52. package/bin/payment/index.js +63 -0
  53. package/bin/payment/index.js.map +1 -0
  54. package/bin/payment/types.d.ts +107 -0
  55. package/bin/payment/types.d.ts.map +1 -0
  56. package/bin/payment/types.js +10 -0
  57. package/bin/payment/types.js.map +1 -0
  58. package/bin/payment-stripe/index.d.ts +17 -0
  59. package/bin/payment-stripe/index.d.ts.map +1 -0
  60. package/bin/payment-stripe/index.js +619 -0
  61. package/bin/payment-stripe/index.js.map +1 -0
  62. package/bin/payment-stripe/schema.d.ts +378 -0
  63. package/bin/payment-stripe/schema.d.ts.map +1 -0
  64. package/bin/payment-stripe/schema.js +47 -0
  65. package/bin/payment-stripe/schema.js.map +1 -0
  66. package/bin/payment-stripe/stripe.d.ts +38 -0
  67. package/bin/payment-stripe/stripe.d.ts.map +1 -0
  68. package/bin/payment-stripe/stripe.js +129 -0
  69. package/bin/payment-stripe/stripe.js.map +1 -0
  70. package/bin/payment-stripe/types.d.ts +331 -0
  71. package/bin/payment-stripe/types.d.ts.map +1 -0
  72. package/bin/payment-stripe/types.js +10 -0
  73. package/bin/payment-stripe/types.js.map +1 -0
  74. package/bin/usage/index.d.ts +177 -0
  75. package/bin/usage/index.d.ts.map +1 -0
  76. package/bin/usage/index.js +120 -0
  77. package/bin/usage/index.js.map +1 -0
  78. package/package.json +60 -0
@@ -0,0 +1,326 @@
1
+ /**
2
+ * Balance 服务对外类型定义。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 余额单位仍然由业务侧决定,默认值是 `credits`
6
+ * - `redeem_code` 是一次性兑换码,用于直接给用户充值
7
+ * - 充值单 `topup` 与 `redeem_code` 是两条不同语义的充值链路
8
+ */
9
+ /**
10
+ * Balance 服务配置。
11
+ */
12
+ export interface BalanceServiceOptions {
13
+ /**
14
+ * 首次自动开户时要发放的初始余额。
15
+ *
16
+ * 默认值为 `0`。使用整数,避免浮点金额误差。
17
+ */
18
+ init?: number;
19
+ /**
20
+ * 余额单位名称。
21
+ *
22
+ * 例如:`credits`、`points`、`tokens`。
23
+ * 默认值为 `credits`。
24
+ */
25
+ unit?: string;
26
+ }
27
+ /**
28
+ * 余额附加信息。
29
+ */
30
+ export interface BalanceExtra {
31
+ /**
32
+ * 写入流水、充值单或兑换码的人类可读说明。
33
+ */
34
+ note?: string;
35
+ /**
36
+ * 外部引用 ID。
37
+ *
38
+ * 例如业务请求 ID、订单 ID、支付回调 ID。
39
+ */
40
+ ref?: string;
41
+ /**
42
+ * 结构化扩展字段。
43
+ *
44
+ * 服务会序列化为 JSON 文本存储。
45
+ */
46
+ meta?: Record<string, unknown>;
47
+ }
48
+ /**
49
+ * 余额流水类型。
50
+ */
51
+ export type BalanceLedgerKind = "init" | "add" | "sub" | "topup" | "redeem";
52
+ /**
53
+ * 充值单状态。
54
+ */
55
+ export type BalanceTopupStatus = "pending" | "paid" | "canceled";
56
+ /**
57
+ * redeem_code 状态。
58
+ */
59
+ export type BalanceRedeemCodeStatus = "active" | "redeemed" | "disabled";
60
+ /**
61
+ * 用户余额账户。
62
+ */
63
+ export interface BalanceAccount extends Record<string, unknown> {
64
+ /**
65
+ * 用户 ID。
66
+ */
67
+ user_id: string;
68
+ /**
69
+ * 当前可用余额。
70
+ */
71
+ balance: number;
72
+ /**
73
+ * 余额单位。
74
+ */
75
+ unit: string;
76
+ /**
77
+ * 账户创建时间。
78
+ */
79
+ created_at: string;
80
+ /**
81
+ * 账户最近更新时间。
82
+ */
83
+ updated_at: string;
84
+ }
85
+ /**
86
+ * 余额流水记录。
87
+ */
88
+ export interface BalanceLedgerEntry extends Record<string, unknown> {
89
+ /**
90
+ * 流水主键。
91
+ */
92
+ entry_id: string;
93
+ /**
94
+ * 用户 ID。
95
+ */
96
+ user_id: string;
97
+ /**
98
+ * 流水类型。
99
+ */
100
+ kind: BalanceLedgerKind;
101
+ /**
102
+ * 本次变动金额。
103
+ *
104
+ * 约定:
105
+ * - 加款为正数
106
+ * - 扣款为负数
107
+ */
108
+ amount: number;
109
+ /**
110
+ * 本次变动后的余额快照。
111
+ */
112
+ balance_after: number;
113
+ /**
114
+ * 余额单位。
115
+ */
116
+ unit: string;
117
+ /**
118
+ * 流水说明。
119
+ */
120
+ note: string;
121
+ /**
122
+ * 外部引用 ID。
123
+ */
124
+ ref: string;
125
+ /**
126
+ * 扩展字段 JSON 文本。
127
+ */
128
+ metadata_json: string;
129
+ /**
130
+ * 流水创建时间。
131
+ */
132
+ created_at: string;
133
+ }
134
+ /**
135
+ * 充值单。
136
+ */
137
+ export interface BalanceTopup extends Record<string, unknown> {
138
+ /**
139
+ * 充值单 ID。
140
+ */
141
+ topup_id: string;
142
+ /**
143
+ * 用户 ID。
144
+ */
145
+ user_id: string;
146
+ /**
147
+ * 充值金额。
148
+ */
149
+ amount: number;
150
+ /**
151
+ * 余额单位。
152
+ */
153
+ unit: string;
154
+ /**
155
+ * 当前状态。
156
+ */
157
+ status: BalanceTopupStatus;
158
+ /**
159
+ * 充值说明。
160
+ */
161
+ note: string;
162
+ /**
163
+ * 外部引用 ID。
164
+ */
165
+ ref: string;
166
+ /**
167
+ * 扩展字段 JSON 文本。
168
+ */
169
+ metadata_json: string;
170
+ /**
171
+ * 充值单创建时间。
172
+ */
173
+ created_at: string;
174
+ /**
175
+ * 充值单更新时间。
176
+ */
177
+ updated_at: string;
178
+ }
179
+ /**
180
+ * redeem_code 记录。
181
+ */
182
+ export interface BalanceRedeemCode extends Record<string, unknown> {
183
+ /**
184
+ * redeem_code 主键。
185
+ */
186
+ redeem_code_id: string;
187
+ /**
188
+ * 充值金额。
189
+ */
190
+ amount: number;
191
+ /**
192
+ * 余额单位。
193
+ */
194
+ unit: string;
195
+ /**
196
+ * 当前状态。
197
+ */
198
+ status: BalanceRedeemCodeStatus;
199
+ /**
200
+ * 脱敏后的兑换码文本。
201
+ */
202
+ code_mask: string;
203
+ /**
204
+ * redeem_code 说明。
205
+ */
206
+ note: string;
207
+ /**
208
+ * 外部引用 ID。
209
+ */
210
+ ref: string;
211
+ /**
212
+ * 扩展字段 JSON 文本。
213
+ */
214
+ metadata_json: string;
215
+ /**
216
+ * 被哪个用户兑换。
217
+ *
218
+ * 未兑换时为空字符串。
219
+ */
220
+ redeemed_by_user_id: string;
221
+ /**
222
+ * 兑换时间。
223
+ *
224
+ * 未兑换时为空字符串。
225
+ */
226
+ redeemed_at: string;
227
+ /**
228
+ * 创建时间。
229
+ */
230
+ created_at: string;
231
+ /**
232
+ * 更新时间。
233
+ */
234
+ updated_at: string;
235
+ }
236
+ /**
237
+ * 管理端创建 redeem_code 的输入。
238
+ */
239
+ export interface BalanceCreateRedeemCodeInput extends BalanceExtra {
240
+ /**
241
+ * 兑换成功后要充值到用户账户的额度。
242
+ */
243
+ amount: number;
244
+ /**
245
+ * 可选自定义兑换码明文。
246
+ *
247
+ * 为空时由系统自动生成。
248
+ */
249
+ code?: string;
250
+ }
251
+ /**
252
+ * 创建 redeem_code 后返回的结果。
253
+ */
254
+ export interface BalanceRedeemCodeIssueResult extends BalanceRedeemCode {
255
+ /**
256
+ * redeem_code 明文。
257
+ *
258
+ * 只在创建时返回一次,后续列表接口不会再返回。
259
+ */
260
+ code: string;
261
+ }
262
+ /**
263
+ * 用户兑换 redeem_code 成功后的结果。
264
+ */
265
+ export interface BalanceRedeemCodeRedeemResult extends Record<string, unknown> {
266
+ /**
267
+ * 兑换成功后的最新账户快照。
268
+ */
269
+ account: BalanceAccount;
270
+ /**
271
+ * 被兑换的 redeem_code 记录。
272
+ */
273
+ redeem_code: BalanceRedeemCode;
274
+ }
275
+ /**
276
+ * 历史查询条件。
277
+ */
278
+ export interface BalanceHistoryQuery {
279
+ /**
280
+ * 可选用户 ID。
281
+ *
282
+ * 为空时返回全局流水。
283
+ */
284
+ user_id?: string;
285
+ /**
286
+ * 返回条数上限。
287
+ */
288
+ limit?: number | string;
289
+ }
290
+ /**
291
+ * 充值单查询条件。
292
+ */
293
+ export interface BalanceTopupQuery {
294
+ /**
295
+ * 可选用户 ID。
296
+ *
297
+ * 为空时返回全局充值单。
298
+ */
299
+ user_id?: string;
300
+ /**
301
+ * 返回条数上限。
302
+ */
303
+ limit?: number | string;
304
+ }
305
+ /**
306
+ * redeem_code 查询条件。
307
+ */
308
+ export interface BalanceRedeemCodeQuery {
309
+ /**
310
+ * 可选兑换状态。
311
+ *
312
+ * 为空时返回所有状态。
313
+ */
314
+ status?: BalanceRedeemCodeStatus | string;
315
+ /**
316
+ * 可选兑换用户 ID。
317
+ *
318
+ * 为空时返回所有用户。
319
+ */
320
+ user_id?: string;
321
+ /**
322
+ * 返回条数上限。
323
+ */
324
+ limit?: number | string;
325
+ }
326
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/balance/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Balance 服务对外类型定义。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 余额单位仍然由业务侧决定,默认值是 `credits`
6
+ * - `redeem_code` 是一次性兑换码,用于直接给用户充值
7
+ * - 充值单 `topup` 与 `redeem_code` 是两条不同语义的充值链路
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/balance/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Balance 服务通用工具。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 所有输入都在这里统一做标准化
6
+ * - redeem_code 明文只在创建时短暂存在,落库前必须哈希
7
+ */
8
+ import type { BalanceAccount, BalanceLedgerEntry, BalanceTopup, BalanceRedeemCode, BalanceRedeemCodeStatus } from "./types.js";
9
+ /**
10
+ * 读取必填字符串。
11
+ */
12
+ export declare function readRequired(value: unknown, label: string): string;
13
+ /**
14
+ * 标准化用户 ID。
15
+ */
16
+ export declare function normalizeUserId(value: string): string;
17
+ /**
18
+ * 标准化正整数。
19
+ */
20
+ export declare function normalizePositiveInteger(value: unknown, label: string): number;
21
+ /**
22
+ * 标准化非负整数。
23
+ */
24
+ export declare function normalizeNonNegativeInteger(value: unknown, label: string): number;
25
+ /**
26
+ * 标准化 limit。
27
+ */
28
+ export declare function normalizeLimit(value: unknown): number;
29
+ /**
30
+ * 标准化普通文本。
31
+ */
32
+ export declare function normalizeText(value: unknown): string;
33
+ /**
34
+ * 序列化 meta。
35
+ */
36
+ export declare function stringifyMeta(meta: Record<string, unknown> | undefined): string;
37
+ /**
38
+ * 解析 meta JSON。
39
+ */
40
+ export declare function parseMetaJSON(value: string): Record<string, unknown>;
41
+ /**
42
+ * 合并 meta JSON。
43
+ */
44
+ export declare function mergeMetaJSON(current: string, next: Record<string, unknown> | undefined): string;
45
+ /**
46
+ * 生成随机 ID。
47
+ */
48
+ export declare function randomId(): string;
49
+ /**
50
+ * 标准化 redeem_code 明文。
51
+ *
52
+ * 关键说明(中文)
53
+ * - 允许用户输入时带空格或连字符
54
+ * - 最终统一成不带分隔符的大写文本再做哈希
55
+ */
56
+ export declare function normalizeRedeemCode(value: unknown, label?: string): string;
57
+ /**
58
+ * 生成 redeem_code 明文。
59
+ */
60
+ export declare function generateRedeemCode(): string;
61
+ /**
62
+ * 生成脱敏 redeem_code。
63
+ */
64
+ export declare function maskRedeemCode(code: string): string;
65
+ /**
66
+ * 计算 redeem_code 哈希值。
67
+ */
68
+ export declare function hashRedeemCode(code: string): Promise<string>;
69
+ /**
70
+ * 标准化 redeem_code 状态。
71
+ */
72
+ export declare function normalizeRedeemCodeStatus(value: unknown): BalanceRedeemCodeStatus | undefined;
73
+ /**
74
+ * 解析账户行。
75
+ */
76
+ export declare function parseAccountRow(row: BalanceAccount): BalanceAccount;
77
+ /**
78
+ * 解析流水行。
79
+ */
80
+ export declare function parseLedgerRow(row: BalanceLedgerEntry): BalanceLedgerEntry;
81
+ /**
82
+ * 解析充值单行。
83
+ */
84
+ export declare function parseTopupRow(row: BalanceTopup): BalanceTopup;
85
+ /**
86
+ * 解析 redeem_code 行。
87
+ */
88
+ export declare function parseRedeemCodeRow(row: BalanceRedeemCode & {
89
+ code_hash?: string;
90
+ }): BalanceRedeemCode;
91
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/balance/utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAElB,YAAY,EAEZ,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM9E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,CAE/E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASpE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,CAKhG;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAOjC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAS,GAAG,MAAM,CAe1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAW3C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOlE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,GAAG,SAAS,CAO7F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,CAQnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,kBAAkB,GAAG,kBAAkB,CAa1E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY,CAa7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CAerG"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Balance 服务通用工具。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 所有输入都在这里统一做标准化
6
+ * - redeem_code 明文只在创建时短暂存在,落库前必须哈希
7
+ */
8
+ const REDEEM_CODE_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
9
+ /**
10
+ * 读取必填字符串。
11
+ */
12
+ export function readRequired(value, label) {
13
+ const normalized = String(value ?? "").trim();
14
+ if (!normalized)
15
+ throw new TypeError(`${label} is required`);
16
+ return normalized;
17
+ }
18
+ /**
19
+ * 标准化用户 ID。
20
+ */
21
+ export function normalizeUserId(value) {
22
+ return readRequired(value, "user_id");
23
+ }
24
+ /**
25
+ * 标准化正整数。
26
+ */
27
+ export function normalizePositiveInteger(value, label) {
28
+ const normalized = Number(value);
29
+ if (!Number.isInteger(normalized) || normalized <= 0) {
30
+ throw new TypeError(`${label} must be a positive integer`);
31
+ }
32
+ return normalized;
33
+ }
34
+ /**
35
+ * 标准化非负整数。
36
+ */
37
+ export function normalizeNonNegativeInteger(value, label) {
38
+ const normalized = Number(value);
39
+ if (!Number.isInteger(normalized) || normalized < 0) {
40
+ throw new TypeError(`${label} must be a non-negative integer`);
41
+ }
42
+ return normalized;
43
+ }
44
+ /**
45
+ * 标准化 limit。
46
+ */
47
+ export function normalizeLimit(value) {
48
+ const normalized = Number(value ?? 20);
49
+ if (!Number.isInteger(normalized) || normalized <= 0)
50
+ return 20;
51
+ return Math.min(normalized, 200);
52
+ }
53
+ /**
54
+ * 标准化普通文本。
55
+ */
56
+ export function normalizeText(value) {
57
+ return String(value ?? "").trim();
58
+ }
59
+ /**
60
+ * 序列化 meta。
61
+ */
62
+ export function stringifyMeta(meta) {
63
+ return JSON.stringify(meta ?? {});
64
+ }
65
+ /**
66
+ * 解析 meta JSON。
67
+ */
68
+ export function parseMetaJSON(value) {
69
+ try {
70
+ const parsed = JSON.parse(value || "{}");
71
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
72
+ ? parsed
73
+ : {};
74
+ }
75
+ catch {
76
+ return {};
77
+ }
78
+ }
79
+ /**
80
+ * 合并 meta JSON。
81
+ */
82
+ export function mergeMetaJSON(current, next) {
83
+ return JSON.stringify({
84
+ ...parseMetaJSON(current),
85
+ ...(next ?? {}),
86
+ });
87
+ }
88
+ /**
89
+ * 生成随机 ID。
90
+ */
91
+ export function randomId() {
92
+ const bytes = new Uint8Array(12);
93
+ crypto.getRandomValues(bytes);
94
+ return btoa(String.fromCharCode(...bytes))
95
+ .replace(/\+/g, "-")
96
+ .replace(/\//g, "_")
97
+ .replace(/=+$/, "");
98
+ }
99
+ /**
100
+ * 标准化 redeem_code 明文。
101
+ *
102
+ * 关键说明(中文)
103
+ * - 允许用户输入时带空格或连字符
104
+ * - 最终统一成不带分隔符的大写文本再做哈希
105
+ */
106
+ export function normalizeRedeemCode(value, label = "code") {
107
+ const normalized = String(value ?? "")
108
+ .trim()
109
+ .toUpperCase()
110
+ .replace(/[\s-]+/g, "");
111
+ if (!normalized) {
112
+ throw new TypeError(`${label} is required`);
113
+ }
114
+ if (!/^[A-Z0-9]+$/.test(normalized)) {
115
+ throw new TypeError(`${label} must contain only letters and numbers`);
116
+ }
117
+ return normalized;
118
+ }
119
+ /**
120
+ * 生成 redeem_code 明文。
121
+ */
122
+ export function generateRedeemCode() {
123
+ const bytes = new Uint8Array(16);
124
+ crypto.getRandomValues(bytes);
125
+ const chars = Array.from(bytes, (value) => REDEEM_CODE_ALPHABET[value % REDEEM_CODE_ALPHABET.length]);
126
+ return [
127
+ chars.slice(0, 4).join(""),
128
+ chars.slice(4, 8).join(""),
129
+ chars.slice(8, 12).join(""),
130
+ chars.slice(12, 16).join(""),
131
+ ].join("-");
132
+ }
133
+ /**
134
+ * 生成脱敏 redeem_code。
135
+ */
136
+ export function maskRedeemCode(code) {
137
+ const normalized = normalizeRedeemCode(code);
138
+ const head = normalized.slice(0, 4);
139
+ const tail = normalized.slice(-4);
140
+ const middleLength = Math.max(0, normalized.length - head.length - tail.length);
141
+ return `${head}${middleLength > 0 ? `-${"*".repeat(middleLength)}` : ""}${tail ? `-${tail}` : ""}`;
142
+ }
143
+ /**
144
+ * 计算 redeem_code 哈希值。
145
+ */
146
+ export async function hashRedeemCode(code) {
147
+ const normalized = normalizeRedeemCode(code);
148
+ const data = new TextEncoder().encode(normalized);
149
+ const digest = await crypto.subtle.digest("SHA-256", data);
150
+ return Array.from(new Uint8Array(digest))
151
+ .map((item) => item.toString(16).padStart(2, "0"))
152
+ .join("");
153
+ }
154
+ /**
155
+ * 标准化 redeem_code 状态。
156
+ */
157
+ export function normalizeRedeemCodeStatus(value) {
158
+ const normalized = String(value ?? "").trim();
159
+ if (!normalized)
160
+ return undefined;
161
+ if (normalized === "active" || normalized === "redeemed" || normalized === "disabled") {
162
+ return normalized;
163
+ }
164
+ throw new TypeError("status must be one of: active, redeemed, disabled");
165
+ }
166
+ /**
167
+ * 解析账户行。
168
+ */
169
+ export function parseAccountRow(row) {
170
+ return {
171
+ user_id: String(row.user_id),
172
+ balance: Number(row.balance),
173
+ unit: String(row.unit),
174
+ created_at: String(row.created_at),
175
+ updated_at: String(row.updated_at),
176
+ };
177
+ }
178
+ /**
179
+ * 解析流水行。
180
+ */
181
+ export function parseLedgerRow(row) {
182
+ return {
183
+ entry_id: String(row.entry_id),
184
+ user_id: String(row.user_id),
185
+ kind: String(row.kind),
186
+ amount: Number(row.amount),
187
+ balance_after: Number(row.balance_after),
188
+ unit: String(row.unit),
189
+ note: String(row.note ?? ""),
190
+ ref: String(row.ref ?? ""),
191
+ metadata_json: String(row.metadata_json ?? "{}"),
192
+ created_at: String(row.created_at),
193
+ };
194
+ }
195
+ /**
196
+ * 解析充值单行。
197
+ */
198
+ export function parseTopupRow(row) {
199
+ return {
200
+ topup_id: String(row.topup_id),
201
+ user_id: String(row.user_id),
202
+ amount: Number(row.amount),
203
+ unit: String(row.unit),
204
+ status: String(row.status),
205
+ note: String(row.note ?? ""),
206
+ ref: String(row.ref ?? ""),
207
+ metadata_json: String(row.metadata_json ?? "{}"),
208
+ created_at: String(row.created_at),
209
+ updated_at: String(row.updated_at),
210
+ };
211
+ }
212
+ /**
213
+ * 解析 redeem_code 行。
214
+ */
215
+ export function parseRedeemCodeRow(row) {
216
+ return {
217
+ redeem_code_id: String(row.redeem_code_id),
218
+ amount: Number(row.amount),
219
+ unit: String(row.unit),
220
+ status: String(row.status),
221
+ code_mask: String(row.code_mask ?? ""),
222
+ note: String(row.note ?? ""),
223
+ ref: String(row.ref ?? ""),
224
+ metadata_json: String(row.metadata_json ?? "{}"),
225
+ redeemed_by_user_id: String(row.redeemed_by_user_id ?? ""),
226
+ redeemed_at: String(row.redeemed_at ?? ""),
227
+ created_at: String(row.created_at),
228
+ updated_at: String(row.updated_at),
229
+ };
230
+ }
231
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/balance/utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,MAAM,oBAAoB,GAAG,kCAAkC,CAAC;AAEhE;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc,EAAE,KAAa;IACxD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC;IAC7D,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAc,EAAE,KAAa;IACpE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,6BAA6B,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAc,EAAE,KAAa;IACvE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,iCAAiC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAChE,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAyC;IACrE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;QACzC,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACnE,CAAC,CAAC,MAAiC;YACnC,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,IAAyC;IACtF,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,GAAG,aAAa,CAAC,OAAO,CAAC;QACzB,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;KAChB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC;SACvC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,KAAK,GAAG,MAAM;IAChE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACnC,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAE1B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,wCAAwC,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE9B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;IACtG,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;KAC7B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAChF,OAAO,GAAG,IAAI,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACrG,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACjD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QACtF,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAmB;IACjD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAuB;IACpD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAsB;QAC3C,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;QACxC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC;QAChD,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAiB;IAC7C,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC5B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAuB;QAChD,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC;QAChD,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAA+C;IAChF,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAA4B;QACrD,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;QACtC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC;QAChD,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC;QAC1D,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QAC1C,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KACnC,CAAC;AACJ,CAAC"}