@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,880 @@
1
+ /**
2
+ * Downcity 官方 Balance 服务实现。
3
+ *
4
+ * 设计边界:
5
+ * - 余额是用户级全局钱包,不与 product 绑定
6
+ * - 服务只负责账户、流水、充值单、redeem_code 与原子加减款
7
+ * - 真正的计费策略应由业务方在 hook 中直接调用本服务
8
+ */
9
+ import { InstallableService, type ServiceInstallContext } from "@downcity/infra";
10
+ import type { BalanceAccount, BalanceCreateRedeemCodeInput, BalanceExtra, BalanceHistoryQuery, BalanceLedgerEntry, BalanceServiceOptions, BalanceRedeemCode, BalanceRedeemCodeIssueResult, BalanceRedeemCodeQuery, BalanceRedeemCodeRedeemResult, BalanceTopup, BalanceTopupQuery } from "./types.js";
11
+ /**
12
+ * Balance 服务实例。
13
+ *
14
+ * 业务方应保存返回实例,并在 hook 中直接调用它的 `require()` / `sub()` / `add()`。
15
+ */
16
+ export declare class BalanceService extends InstallableService {
17
+ readonly id = "balance";
18
+ readonly name = "Balance";
19
+ readonly version = "0.1.0";
20
+ readonly schema: {
21
+ accounts: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
22
+ name: "service_balance_accounts";
23
+ schema: undefined;
24
+ columns: {
25
+ user_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
26
+ name: "user_id";
27
+ tableName: "service_balance_accounts";
28
+ dataType: "string";
29
+ columnType: "SQLiteText";
30
+ data: string;
31
+ driverParam: string;
32
+ notNull: true;
33
+ hasDefault: false;
34
+ isPrimaryKey: true;
35
+ isAutoincrement: false;
36
+ hasRuntimeDefault: false;
37
+ enumValues: [string, ...string[]];
38
+ baseColumn: never;
39
+ identity: undefined;
40
+ generated: undefined;
41
+ }, {}, {
42
+ length: number | undefined;
43
+ }>;
44
+ balance: import("drizzle-orm/sqlite-core").SQLiteColumn<{
45
+ name: "balance";
46
+ tableName: "service_balance_accounts";
47
+ dataType: "number";
48
+ columnType: "SQLiteInteger";
49
+ data: number;
50
+ driverParam: number;
51
+ notNull: true;
52
+ hasDefault: false;
53
+ isPrimaryKey: false;
54
+ isAutoincrement: false;
55
+ hasRuntimeDefault: false;
56
+ enumValues: undefined;
57
+ baseColumn: never;
58
+ identity: undefined;
59
+ generated: undefined;
60
+ }, {}, {}>;
61
+ unit: import("drizzle-orm/sqlite-core").SQLiteColumn<{
62
+ name: "unit";
63
+ tableName: "service_balance_accounts";
64
+ dataType: "string";
65
+ columnType: "SQLiteText";
66
+ data: string;
67
+ driverParam: string;
68
+ notNull: true;
69
+ hasDefault: false;
70
+ isPrimaryKey: false;
71
+ isAutoincrement: false;
72
+ hasRuntimeDefault: false;
73
+ enumValues: [string, ...string[]];
74
+ baseColumn: never;
75
+ identity: undefined;
76
+ generated: undefined;
77
+ }, {}, {
78
+ length: number | undefined;
79
+ }>;
80
+ created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
81
+ name: "created_at";
82
+ tableName: "service_balance_accounts";
83
+ dataType: "string";
84
+ columnType: "SQLiteText";
85
+ data: string;
86
+ driverParam: string;
87
+ notNull: true;
88
+ hasDefault: false;
89
+ isPrimaryKey: false;
90
+ isAutoincrement: false;
91
+ hasRuntimeDefault: false;
92
+ enumValues: [string, ...string[]];
93
+ baseColumn: never;
94
+ identity: undefined;
95
+ generated: undefined;
96
+ }, {}, {
97
+ length: number | undefined;
98
+ }>;
99
+ updated_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
100
+ name: "updated_at";
101
+ tableName: "service_balance_accounts";
102
+ dataType: "string";
103
+ columnType: "SQLiteText";
104
+ data: string;
105
+ driverParam: string;
106
+ notNull: true;
107
+ hasDefault: false;
108
+ isPrimaryKey: false;
109
+ isAutoincrement: false;
110
+ hasRuntimeDefault: false;
111
+ enumValues: [string, ...string[]];
112
+ baseColumn: never;
113
+ identity: undefined;
114
+ generated: undefined;
115
+ }, {}, {
116
+ length: number | undefined;
117
+ }>;
118
+ };
119
+ dialect: "sqlite";
120
+ }>;
121
+ ledger: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
122
+ name: "service_balance_ledger";
123
+ schema: undefined;
124
+ columns: {
125
+ entry_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
126
+ name: "entry_id";
127
+ tableName: "service_balance_ledger";
128
+ dataType: "string";
129
+ columnType: "SQLiteText";
130
+ data: string;
131
+ driverParam: string;
132
+ notNull: true;
133
+ hasDefault: false;
134
+ isPrimaryKey: true;
135
+ isAutoincrement: false;
136
+ hasRuntimeDefault: false;
137
+ enumValues: [string, ...string[]];
138
+ baseColumn: never;
139
+ identity: undefined;
140
+ generated: undefined;
141
+ }, {}, {
142
+ length: number | undefined;
143
+ }>;
144
+ user_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
145
+ name: "user_id";
146
+ tableName: "service_balance_ledger";
147
+ dataType: "string";
148
+ columnType: "SQLiteText";
149
+ data: string;
150
+ driverParam: string;
151
+ notNull: true;
152
+ hasDefault: false;
153
+ isPrimaryKey: false;
154
+ isAutoincrement: false;
155
+ hasRuntimeDefault: false;
156
+ enumValues: [string, ...string[]];
157
+ baseColumn: never;
158
+ identity: undefined;
159
+ generated: undefined;
160
+ }, {}, {
161
+ length: number | undefined;
162
+ }>;
163
+ kind: import("drizzle-orm/sqlite-core").SQLiteColumn<{
164
+ name: "kind";
165
+ tableName: "service_balance_ledger";
166
+ dataType: "string";
167
+ columnType: "SQLiteText";
168
+ data: string;
169
+ driverParam: string;
170
+ notNull: true;
171
+ hasDefault: false;
172
+ isPrimaryKey: false;
173
+ isAutoincrement: false;
174
+ hasRuntimeDefault: false;
175
+ enumValues: [string, ...string[]];
176
+ baseColumn: never;
177
+ identity: undefined;
178
+ generated: undefined;
179
+ }, {}, {
180
+ length: number | undefined;
181
+ }>;
182
+ amount: import("drizzle-orm/sqlite-core").SQLiteColumn<{
183
+ name: "amount";
184
+ tableName: "service_balance_ledger";
185
+ dataType: "number";
186
+ columnType: "SQLiteInteger";
187
+ data: number;
188
+ driverParam: number;
189
+ notNull: true;
190
+ hasDefault: false;
191
+ isPrimaryKey: false;
192
+ isAutoincrement: false;
193
+ hasRuntimeDefault: false;
194
+ enumValues: undefined;
195
+ baseColumn: never;
196
+ identity: undefined;
197
+ generated: undefined;
198
+ }, {}, {}>;
199
+ balance_after: import("drizzle-orm/sqlite-core").SQLiteColumn<{
200
+ name: "balance_after";
201
+ tableName: "service_balance_ledger";
202
+ dataType: "number";
203
+ columnType: "SQLiteInteger";
204
+ data: number;
205
+ driverParam: number;
206
+ notNull: true;
207
+ hasDefault: false;
208
+ isPrimaryKey: false;
209
+ isAutoincrement: false;
210
+ hasRuntimeDefault: false;
211
+ enumValues: undefined;
212
+ baseColumn: never;
213
+ identity: undefined;
214
+ generated: undefined;
215
+ }, {}, {}>;
216
+ unit: import("drizzle-orm/sqlite-core").SQLiteColumn<{
217
+ name: "unit";
218
+ tableName: "service_balance_ledger";
219
+ dataType: "string";
220
+ columnType: "SQLiteText";
221
+ data: string;
222
+ driverParam: string;
223
+ notNull: true;
224
+ hasDefault: false;
225
+ isPrimaryKey: false;
226
+ isAutoincrement: false;
227
+ hasRuntimeDefault: false;
228
+ enumValues: [string, ...string[]];
229
+ baseColumn: never;
230
+ identity: undefined;
231
+ generated: undefined;
232
+ }, {}, {
233
+ length: number | undefined;
234
+ }>;
235
+ note: import("drizzle-orm/sqlite-core").SQLiteColumn<{
236
+ name: "note";
237
+ tableName: "service_balance_ledger";
238
+ dataType: "string";
239
+ columnType: "SQLiteText";
240
+ data: string;
241
+ driverParam: string;
242
+ notNull: true;
243
+ hasDefault: false;
244
+ isPrimaryKey: false;
245
+ isAutoincrement: false;
246
+ hasRuntimeDefault: false;
247
+ enumValues: [string, ...string[]];
248
+ baseColumn: never;
249
+ identity: undefined;
250
+ generated: undefined;
251
+ }, {}, {
252
+ length: number | undefined;
253
+ }>;
254
+ ref: import("drizzle-orm/sqlite-core").SQLiteColumn<{
255
+ name: "ref";
256
+ tableName: "service_balance_ledger";
257
+ dataType: "string";
258
+ columnType: "SQLiteText";
259
+ data: string;
260
+ driverParam: string;
261
+ notNull: true;
262
+ hasDefault: false;
263
+ isPrimaryKey: false;
264
+ isAutoincrement: false;
265
+ hasRuntimeDefault: false;
266
+ enumValues: [string, ...string[]];
267
+ baseColumn: never;
268
+ identity: undefined;
269
+ generated: undefined;
270
+ }, {}, {
271
+ length: number | undefined;
272
+ }>;
273
+ metadata_json: import("drizzle-orm/sqlite-core").SQLiteColumn<{
274
+ name: "metadata_json";
275
+ tableName: "service_balance_ledger";
276
+ dataType: "string";
277
+ columnType: "SQLiteText";
278
+ data: string;
279
+ driverParam: string;
280
+ notNull: true;
281
+ hasDefault: false;
282
+ isPrimaryKey: false;
283
+ isAutoincrement: false;
284
+ hasRuntimeDefault: false;
285
+ enumValues: [string, ...string[]];
286
+ baseColumn: never;
287
+ identity: undefined;
288
+ generated: undefined;
289
+ }, {}, {
290
+ length: number | undefined;
291
+ }>;
292
+ created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
293
+ name: "created_at";
294
+ tableName: "service_balance_ledger";
295
+ dataType: "string";
296
+ columnType: "SQLiteText";
297
+ data: string;
298
+ driverParam: string;
299
+ notNull: true;
300
+ hasDefault: false;
301
+ isPrimaryKey: false;
302
+ isAutoincrement: false;
303
+ hasRuntimeDefault: false;
304
+ enumValues: [string, ...string[]];
305
+ baseColumn: never;
306
+ identity: undefined;
307
+ generated: undefined;
308
+ }, {}, {
309
+ length: number | undefined;
310
+ }>;
311
+ };
312
+ dialect: "sqlite";
313
+ }>;
314
+ topups: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
315
+ name: "service_balance_topups";
316
+ schema: undefined;
317
+ columns: {
318
+ topup_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
319
+ name: "topup_id";
320
+ tableName: "service_balance_topups";
321
+ dataType: "string";
322
+ columnType: "SQLiteText";
323
+ data: string;
324
+ driverParam: string;
325
+ notNull: true;
326
+ hasDefault: false;
327
+ isPrimaryKey: true;
328
+ isAutoincrement: false;
329
+ hasRuntimeDefault: false;
330
+ enumValues: [string, ...string[]];
331
+ baseColumn: never;
332
+ identity: undefined;
333
+ generated: undefined;
334
+ }, {}, {
335
+ length: number | undefined;
336
+ }>;
337
+ user_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
338
+ name: "user_id";
339
+ tableName: "service_balance_topups";
340
+ dataType: "string";
341
+ columnType: "SQLiteText";
342
+ data: string;
343
+ driverParam: string;
344
+ notNull: true;
345
+ hasDefault: false;
346
+ isPrimaryKey: false;
347
+ isAutoincrement: false;
348
+ hasRuntimeDefault: false;
349
+ enumValues: [string, ...string[]];
350
+ baseColumn: never;
351
+ identity: undefined;
352
+ generated: undefined;
353
+ }, {}, {
354
+ length: number | undefined;
355
+ }>;
356
+ amount: import("drizzle-orm/sqlite-core").SQLiteColumn<{
357
+ name: "amount";
358
+ tableName: "service_balance_topups";
359
+ dataType: "number";
360
+ columnType: "SQLiteInteger";
361
+ data: number;
362
+ driverParam: number;
363
+ notNull: true;
364
+ hasDefault: false;
365
+ isPrimaryKey: false;
366
+ isAutoincrement: false;
367
+ hasRuntimeDefault: false;
368
+ enumValues: undefined;
369
+ baseColumn: never;
370
+ identity: undefined;
371
+ generated: undefined;
372
+ }, {}, {}>;
373
+ unit: import("drizzle-orm/sqlite-core").SQLiteColumn<{
374
+ name: "unit";
375
+ tableName: "service_balance_topups";
376
+ dataType: "string";
377
+ columnType: "SQLiteText";
378
+ data: string;
379
+ driverParam: string;
380
+ notNull: true;
381
+ hasDefault: false;
382
+ isPrimaryKey: false;
383
+ isAutoincrement: false;
384
+ hasRuntimeDefault: false;
385
+ enumValues: [string, ...string[]];
386
+ baseColumn: never;
387
+ identity: undefined;
388
+ generated: undefined;
389
+ }, {}, {
390
+ length: number | undefined;
391
+ }>;
392
+ status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
393
+ name: "status";
394
+ tableName: "service_balance_topups";
395
+ dataType: "string";
396
+ columnType: "SQLiteText";
397
+ data: string;
398
+ driverParam: string;
399
+ notNull: true;
400
+ hasDefault: false;
401
+ isPrimaryKey: false;
402
+ isAutoincrement: false;
403
+ hasRuntimeDefault: false;
404
+ enumValues: [string, ...string[]];
405
+ baseColumn: never;
406
+ identity: undefined;
407
+ generated: undefined;
408
+ }, {}, {
409
+ length: number | undefined;
410
+ }>;
411
+ note: import("drizzle-orm/sqlite-core").SQLiteColumn<{
412
+ name: "note";
413
+ tableName: "service_balance_topups";
414
+ dataType: "string";
415
+ columnType: "SQLiteText";
416
+ data: string;
417
+ driverParam: string;
418
+ notNull: true;
419
+ hasDefault: false;
420
+ isPrimaryKey: false;
421
+ isAutoincrement: false;
422
+ hasRuntimeDefault: false;
423
+ enumValues: [string, ...string[]];
424
+ baseColumn: never;
425
+ identity: undefined;
426
+ generated: undefined;
427
+ }, {}, {
428
+ length: number | undefined;
429
+ }>;
430
+ ref: import("drizzle-orm/sqlite-core").SQLiteColumn<{
431
+ name: "ref";
432
+ tableName: "service_balance_topups";
433
+ dataType: "string";
434
+ columnType: "SQLiteText";
435
+ data: string;
436
+ driverParam: string;
437
+ notNull: true;
438
+ hasDefault: false;
439
+ isPrimaryKey: false;
440
+ isAutoincrement: false;
441
+ hasRuntimeDefault: false;
442
+ enumValues: [string, ...string[]];
443
+ baseColumn: never;
444
+ identity: undefined;
445
+ generated: undefined;
446
+ }, {}, {
447
+ length: number | undefined;
448
+ }>;
449
+ metadata_json: import("drizzle-orm/sqlite-core").SQLiteColumn<{
450
+ name: "metadata_json";
451
+ tableName: "service_balance_topups";
452
+ dataType: "string";
453
+ columnType: "SQLiteText";
454
+ data: string;
455
+ driverParam: string;
456
+ notNull: true;
457
+ hasDefault: false;
458
+ isPrimaryKey: false;
459
+ isAutoincrement: false;
460
+ hasRuntimeDefault: false;
461
+ enumValues: [string, ...string[]];
462
+ baseColumn: never;
463
+ identity: undefined;
464
+ generated: undefined;
465
+ }, {}, {
466
+ length: number | undefined;
467
+ }>;
468
+ created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
469
+ name: "created_at";
470
+ tableName: "service_balance_topups";
471
+ dataType: "string";
472
+ columnType: "SQLiteText";
473
+ data: string;
474
+ driverParam: string;
475
+ notNull: true;
476
+ hasDefault: false;
477
+ isPrimaryKey: false;
478
+ isAutoincrement: false;
479
+ hasRuntimeDefault: false;
480
+ enumValues: [string, ...string[]];
481
+ baseColumn: never;
482
+ identity: undefined;
483
+ generated: undefined;
484
+ }, {}, {
485
+ length: number | undefined;
486
+ }>;
487
+ updated_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
488
+ name: "updated_at";
489
+ tableName: "service_balance_topups";
490
+ dataType: "string";
491
+ columnType: "SQLiteText";
492
+ data: string;
493
+ driverParam: string;
494
+ notNull: true;
495
+ hasDefault: false;
496
+ isPrimaryKey: false;
497
+ isAutoincrement: false;
498
+ hasRuntimeDefault: false;
499
+ enumValues: [string, ...string[]];
500
+ baseColumn: never;
501
+ identity: undefined;
502
+ generated: undefined;
503
+ }, {}, {
504
+ length: number | undefined;
505
+ }>;
506
+ };
507
+ dialect: "sqlite";
508
+ }>;
509
+ redeem_codes: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
510
+ name: "service_balance_redeem_codes";
511
+ schema: undefined;
512
+ columns: {
513
+ redeem_code_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
514
+ name: "redeem_code_id";
515
+ tableName: "service_balance_redeem_codes";
516
+ dataType: "string";
517
+ columnType: "SQLiteText";
518
+ data: string;
519
+ driverParam: string;
520
+ notNull: true;
521
+ hasDefault: false;
522
+ isPrimaryKey: true;
523
+ isAutoincrement: false;
524
+ hasRuntimeDefault: false;
525
+ enumValues: [string, ...string[]];
526
+ baseColumn: never;
527
+ identity: undefined;
528
+ generated: undefined;
529
+ }, {}, {
530
+ length: number | undefined;
531
+ }>;
532
+ code_hash: import("drizzle-orm/sqlite-core").SQLiteColumn<{
533
+ name: "code_hash";
534
+ tableName: "service_balance_redeem_codes";
535
+ dataType: "string";
536
+ columnType: "SQLiteText";
537
+ data: string;
538
+ driverParam: string;
539
+ notNull: true;
540
+ hasDefault: false;
541
+ isPrimaryKey: false;
542
+ isAutoincrement: false;
543
+ hasRuntimeDefault: false;
544
+ enumValues: [string, ...string[]];
545
+ baseColumn: never;
546
+ identity: undefined;
547
+ generated: undefined;
548
+ }, {}, {
549
+ length: number | undefined;
550
+ }>;
551
+ code_mask: import("drizzle-orm/sqlite-core").SQLiteColumn<{
552
+ name: "code_mask";
553
+ tableName: "service_balance_redeem_codes";
554
+ dataType: "string";
555
+ columnType: "SQLiteText";
556
+ data: string;
557
+ driverParam: string;
558
+ notNull: true;
559
+ hasDefault: false;
560
+ isPrimaryKey: false;
561
+ isAutoincrement: false;
562
+ hasRuntimeDefault: false;
563
+ enumValues: [string, ...string[]];
564
+ baseColumn: never;
565
+ identity: undefined;
566
+ generated: undefined;
567
+ }, {}, {
568
+ length: number | undefined;
569
+ }>;
570
+ amount: import("drizzle-orm/sqlite-core").SQLiteColumn<{
571
+ name: "amount";
572
+ tableName: "service_balance_redeem_codes";
573
+ dataType: "number";
574
+ columnType: "SQLiteInteger";
575
+ data: number;
576
+ driverParam: number;
577
+ notNull: true;
578
+ hasDefault: false;
579
+ isPrimaryKey: false;
580
+ isAutoincrement: false;
581
+ hasRuntimeDefault: false;
582
+ enumValues: undefined;
583
+ baseColumn: never;
584
+ identity: undefined;
585
+ generated: undefined;
586
+ }, {}, {}>;
587
+ unit: import("drizzle-orm/sqlite-core").SQLiteColumn<{
588
+ name: "unit";
589
+ tableName: "service_balance_redeem_codes";
590
+ dataType: "string";
591
+ columnType: "SQLiteText";
592
+ data: string;
593
+ driverParam: string;
594
+ notNull: true;
595
+ hasDefault: false;
596
+ isPrimaryKey: false;
597
+ isAutoincrement: false;
598
+ hasRuntimeDefault: false;
599
+ enumValues: [string, ...string[]];
600
+ baseColumn: never;
601
+ identity: undefined;
602
+ generated: undefined;
603
+ }, {}, {
604
+ length: number | undefined;
605
+ }>;
606
+ status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
607
+ name: "status";
608
+ tableName: "service_balance_redeem_codes";
609
+ dataType: "string";
610
+ columnType: "SQLiteText";
611
+ data: string;
612
+ driverParam: string;
613
+ notNull: true;
614
+ hasDefault: false;
615
+ isPrimaryKey: false;
616
+ isAutoincrement: false;
617
+ hasRuntimeDefault: false;
618
+ enumValues: [string, ...string[]];
619
+ baseColumn: never;
620
+ identity: undefined;
621
+ generated: undefined;
622
+ }, {}, {
623
+ length: number | undefined;
624
+ }>;
625
+ note: import("drizzle-orm/sqlite-core").SQLiteColumn<{
626
+ name: "note";
627
+ tableName: "service_balance_redeem_codes";
628
+ dataType: "string";
629
+ columnType: "SQLiteText";
630
+ data: string;
631
+ driverParam: string;
632
+ notNull: true;
633
+ hasDefault: false;
634
+ isPrimaryKey: false;
635
+ isAutoincrement: false;
636
+ hasRuntimeDefault: false;
637
+ enumValues: [string, ...string[]];
638
+ baseColumn: never;
639
+ identity: undefined;
640
+ generated: undefined;
641
+ }, {}, {
642
+ length: number | undefined;
643
+ }>;
644
+ ref: import("drizzle-orm/sqlite-core").SQLiteColumn<{
645
+ name: "ref";
646
+ tableName: "service_balance_redeem_codes";
647
+ dataType: "string";
648
+ columnType: "SQLiteText";
649
+ data: string;
650
+ driverParam: string;
651
+ notNull: true;
652
+ hasDefault: false;
653
+ isPrimaryKey: false;
654
+ isAutoincrement: false;
655
+ hasRuntimeDefault: false;
656
+ enumValues: [string, ...string[]];
657
+ baseColumn: never;
658
+ identity: undefined;
659
+ generated: undefined;
660
+ }, {}, {
661
+ length: number | undefined;
662
+ }>;
663
+ metadata_json: import("drizzle-orm/sqlite-core").SQLiteColumn<{
664
+ name: "metadata_json";
665
+ tableName: "service_balance_redeem_codes";
666
+ dataType: "string";
667
+ columnType: "SQLiteText";
668
+ data: string;
669
+ driverParam: string;
670
+ notNull: true;
671
+ hasDefault: false;
672
+ isPrimaryKey: false;
673
+ isAutoincrement: false;
674
+ hasRuntimeDefault: false;
675
+ enumValues: [string, ...string[]];
676
+ baseColumn: never;
677
+ identity: undefined;
678
+ generated: undefined;
679
+ }, {}, {
680
+ length: number | undefined;
681
+ }>;
682
+ redeemed_by_user_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
683
+ name: "redeemed_by_user_id";
684
+ tableName: "service_balance_redeem_codes";
685
+ dataType: "string";
686
+ columnType: "SQLiteText";
687
+ data: string;
688
+ driverParam: string;
689
+ notNull: true;
690
+ hasDefault: false;
691
+ isPrimaryKey: false;
692
+ isAutoincrement: false;
693
+ hasRuntimeDefault: false;
694
+ enumValues: [string, ...string[]];
695
+ baseColumn: never;
696
+ identity: undefined;
697
+ generated: undefined;
698
+ }, {}, {
699
+ length: number | undefined;
700
+ }>;
701
+ redeemed_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
702
+ name: "redeemed_at";
703
+ tableName: "service_balance_redeem_codes";
704
+ dataType: "string";
705
+ columnType: "SQLiteText";
706
+ data: string;
707
+ driverParam: string;
708
+ notNull: true;
709
+ hasDefault: false;
710
+ isPrimaryKey: false;
711
+ isAutoincrement: false;
712
+ hasRuntimeDefault: false;
713
+ enumValues: [string, ...string[]];
714
+ baseColumn: never;
715
+ identity: undefined;
716
+ generated: undefined;
717
+ }, {}, {
718
+ length: number | undefined;
719
+ }>;
720
+ created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
721
+ name: "created_at";
722
+ tableName: "service_balance_redeem_codes";
723
+ dataType: "string";
724
+ columnType: "SQLiteText";
725
+ data: string;
726
+ driverParam: string;
727
+ notNull: true;
728
+ hasDefault: false;
729
+ isPrimaryKey: false;
730
+ isAutoincrement: false;
731
+ hasRuntimeDefault: false;
732
+ enumValues: [string, ...string[]];
733
+ baseColumn: never;
734
+ identity: undefined;
735
+ generated: undefined;
736
+ }, {}, {
737
+ length: number | undefined;
738
+ }>;
739
+ updated_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
740
+ name: "updated_at";
741
+ tableName: "service_balance_redeem_codes";
742
+ dataType: "string";
743
+ columnType: "SQLiteText";
744
+ data: string;
745
+ driverParam: string;
746
+ notNull: true;
747
+ hasDefault: false;
748
+ isPrimaryKey: false;
749
+ isAutoincrement: false;
750
+ hasRuntimeDefault: false;
751
+ enumValues: [string, ...string[]];
752
+ baseColumn: never;
753
+ identity: undefined;
754
+ generated: undefined;
755
+ }, {}, {
756
+ length: number | undefined;
757
+ }>;
758
+ };
759
+ dialect: "sqlite";
760
+ }>;
761
+ };
762
+ private readonly initAmount;
763
+ private readonly unitName;
764
+ constructor(options?: BalanceServiceOptions);
765
+ install(ctx: ServiceInstallContext): void;
766
+ /**
767
+ * 读取用户余额。
768
+ *
769
+ * 若账户不存在,会自动开户并按配置发放初始余额。
770
+ */
771
+ read(user_id: string): Promise<BalanceAccount>;
772
+ /**
773
+ * 检查用户余额是否足够。
774
+ *
775
+ * 余额不足时会抛出 `402 insufficient balance`。
776
+ */
777
+ require(user_id: string, amount: number): Promise<BalanceAccount>;
778
+ /**
779
+ * 给用户加余额,并写入 `add` 流水。
780
+ */
781
+ add(user_id: string, amount: number, extra?: BalanceExtra): Promise<BalanceAccount>;
782
+ /**
783
+ * 给用户扣余额,并写入 `sub` 流水。
784
+ */
785
+ sub(user_id: string, amount: number, extra?: BalanceExtra): Promise<BalanceAccount>;
786
+ /**
787
+ * 查询某个用户的流水。
788
+ */
789
+ history(user_id: string, limit?: number | string): Promise<BalanceLedgerEntry[]>;
790
+ /**
791
+ * 读取一笔充值单。
792
+ *
793
+ * 关键说明(中文)
794
+ * - 这是给支付桥接层使用的公开只读能力
795
+ * - 充值单的状态流转仍然只能通过 finishTopup / cancelTopup 完成
796
+ */
797
+ readTopup(topup_id: string): Promise<BalanceTopup>;
798
+ /**
799
+ * 创建充值单。
800
+ *
801
+ * 这一步不会直接入账,只会生成 `pending` 充值单。
802
+ */
803
+ createTopup(user_id: string, amount: number | undefined, extra?: BalanceExtra): Promise<BalanceTopup>;
804
+ /**
805
+ * 将充值单标记为完成,并真正给用户加余额。
806
+ */
807
+ finishTopup(topup_id: string, extra?: BalanceExtra): Promise<BalanceTopup>;
808
+ /**
809
+ * 取消待处理充值单。
810
+ */
811
+ cancelTopup(topup_id: string, extra?: BalanceExtra): Promise<BalanceTopup>;
812
+ /**
813
+ * 创建一个新的 redeem_code。
814
+ */
815
+ createRedeemCode(input: BalanceCreateRedeemCodeInput): Promise<BalanceRedeemCodeIssueResult>;
816
+ /**
817
+ * 用户兑换 redeem_code,并立刻给余额入账。
818
+ */
819
+ redeemCode(user_id: string, code: unknown, extra?: BalanceExtra): Promise<BalanceRedeemCodeRedeemResult>;
820
+ /**
821
+ * 停用一个尚未兑换的 redeem_code。
822
+ */
823
+ disableRedeemCode(redeem_code_id: string, extra?: BalanceExtra): Promise<BalanceRedeemCode>;
824
+ /**
825
+ * 列出余额账户。
826
+ */
827
+ listUsers(limit?: number | string): Promise<BalanceAccount[]>;
828
+ /**
829
+ * 列出流水。
830
+ */
831
+ listHistory(query?: BalanceHistoryQuery): Promise<BalanceLedgerEntry[]>;
832
+ /**
833
+ * 列出充值单。
834
+ */
835
+ listTopups(query?: BalanceTopupQuery): Promise<BalanceTopup[]>;
836
+ /**
837
+ * 列出 redeem_code。
838
+ */
839
+ listRedeemCodes(query?: BalanceRedeemCodeQuery): Promise<BalanceRedeemCode[]>;
840
+ /**
841
+ * 关键说明(中文)
842
+ * - 正数表示加款,负数表示扣款
843
+ * - 扣款走 SQL 条件更新,避免把余额扣成负数
844
+ * - 扣费策略本身不写在服务里,而是由业务 hook 调用本方法
845
+ */
846
+ private applyDelta;
847
+ /**
848
+ * 首次见到某用户时自动开户。
849
+ */
850
+ private ensureAccount;
851
+ /**
852
+ * 读取账户;不存在时报错。
853
+ */
854
+ private readAccountRequired;
855
+ /**
856
+ * 读取充值单;不存在时报错。
857
+ */
858
+ private readTopupRequired;
859
+ /**
860
+ * 按 ID 读取 redeem_code;不存在时报错。
861
+ */
862
+ private readRedeemCodeRequired;
863
+ /**
864
+ * 按哈希读取 redeem_code;不存在时返回空。
865
+ */
866
+ private readRedeemCodeByHash;
867
+ /**
868
+ * 写入流水。
869
+ */
870
+ private insertLedger;
871
+ /**
872
+ * 拿到底层原始数据库对象。
873
+ */
874
+ private resolveRaw;
875
+ }
876
+ /**
877
+ * 创建 Balance 服务实例。
878
+ */
879
+ export declare function balanceService(options?: BalanceServiceOptions): BalanceService;
880
+ //# sourceMappingURL=service.d.ts.map