fastify-wrap 0.1.0

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 (150) hide show
  1. package/README.md +980 -0
  2. package/dist/src/client/TestClient.d.ts +33 -0
  3. package/dist/src/client/TestClient.d.ts.map +1 -0
  4. package/dist/src/client/TestClient.js +359 -0
  5. package/dist/src/client/TestClient.js.map +1 -0
  6. package/dist/src/client/index.d.ts +4 -0
  7. package/dist/src/client/index.d.ts.map +1 -0
  8. package/dist/src/client/index.js +3 -0
  9. package/dist/src/client/index.js.map +1 -0
  10. package/dist/src/client/sign.d.ts +12 -0
  11. package/dist/src/client/sign.d.ts.map +1 -0
  12. package/dist/src/client/sign.js +44 -0
  13. package/dist/src/client/sign.js.map +1 -0
  14. package/dist/src/client/types.d.ts +41 -0
  15. package/dist/src/client/types.d.ts.map +1 -0
  16. package/dist/src/client/types.js +20 -0
  17. package/dist/src/client/types.js.map +1 -0
  18. package/dist/src/common/auth/AuthStrategy.d.ts +6 -0
  19. package/dist/src/common/auth/AuthStrategy.d.ts.map +1 -0
  20. package/dist/src/common/auth/AuthStrategy.js +2 -0
  21. package/dist/src/common/auth/AuthStrategy.js.map +1 -0
  22. package/dist/src/common/auth/JwtStrategy.d.ts +9 -0
  23. package/dist/src/common/auth/JwtStrategy.d.ts.map +1 -0
  24. package/dist/src/common/auth/JwtStrategy.js +34 -0
  25. package/dist/src/common/auth/JwtStrategy.js.map +1 -0
  26. package/dist/src/common/auth/NonceStore.d.ts +22 -0
  27. package/dist/src/common/auth/NonceStore.d.ts.map +1 -0
  28. package/dist/src/common/auth/NonceStore.js +27 -0
  29. package/dist/src/common/auth/NonceStore.js.map +1 -0
  30. package/dist/src/common/auth/SecretResolvers.d.ts +18 -0
  31. package/dist/src/common/auth/SecretResolvers.d.ts.map +1 -0
  32. package/dist/src/common/auth/SecretResolvers.js +30 -0
  33. package/dist/src/common/auth/SecretResolvers.js.map +1 -0
  34. package/dist/src/common/auth/SignatureStrategy.d.ts +23 -0
  35. package/dist/src/common/auth/SignatureStrategy.d.ts.map +1 -0
  36. package/dist/src/common/auth/SignatureStrategy.js +115 -0
  37. package/dist/src/common/auth/SignatureStrategy.js.map +1 -0
  38. package/dist/src/common/auth/index.d.ts +4 -0
  39. package/dist/src/common/auth/index.d.ts.map +1 -0
  40. package/dist/src/common/auth/index.js +3 -0
  41. package/dist/src/common/auth/index.js.map +1 -0
  42. package/dist/src/common/auth/signToken.d.ts +4 -0
  43. package/dist/src/common/auth/signToken.d.ts.map +1 -0
  44. package/dist/src/common/auth/signToken.js +11 -0
  45. package/dist/src/common/auth/signToken.js.map +1 -0
  46. package/dist/src/common/config/loader.d.ts +10 -0
  47. package/dist/src/common/config/loader.d.ts.map +1 -0
  48. package/dist/src/common/config/loader.js +20 -0
  49. package/dist/src/common/config/loader.js.map +1 -0
  50. package/dist/src/common/container/index.d.ts +7 -0
  51. package/dist/src/common/container/index.d.ts.map +1 -0
  52. package/dist/src/common/container/index.js +15 -0
  53. package/dist/src/common/container/index.js.map +1 -0
  54. package/dist/src/common/db/index.d.ts +19 -0
  55. package/dist/src/common/db/index.d.ts.map +1 -0
  56. package/dist/src/common/db/index.js +64 -0
  57. package/dist/src/common/db/index.js.map +1 -0
  58. package/dist/src/common/dto/PageResult.d.ts +12 -0
  59. package/dist/src/common/dto/PageResult.d.ts.map +1 -0
  60. package/dist/src/common/dto/PageResult.js +2 -0
  61. package/dist/src/common/dto/PageResult.js.map +1 -0
  62. package/dist/src/common/errorHandler.d.ts +3 -0
  63. package/dist/src/common/errorHandler.d.ts.map +1 -0
  64. package/dist/src/common/errorHandler.js +47 -0
  65. package/dist/src/common/errorHandler.js.map +1 -0
  66. package/dist/src/common/exceptions/AuthException.d.ts +5 -0
  67. package/dist/src/common/exceptions/AuthException.d.ts.map +1 -0
  68. package/dist/src/common/exceptions/AuthException.js +8 -0
  69. package/dist/src/common/exceptions/AuthException.js.map +1 -0
  70. package/dist/src/common/exceptions/BaseException.d.ts +4 -0
  71. package/dist/src/common/exceptions/BaseException.d.ts.map +1 -0
  72. package/dist/src/common/exceptions/BaseException.js +7 -0
  73. package/dist/src/common/exceptions/BaseException.js.map +1 -0
  74. package/dist/src/common/exceptions/BusinessException.d.ts +5 -0
  75. package/dist/src/common/exceptions/BusinessException.d.ts.map +1 -0
  76. package/dist/src/common/exceptions/BusinessException.js +8 -0
  77. package/dist/src/common/exceptions/BusinessException.js.map +1 -0
  78. package/dist/src/common/exceptions/NotFoundException.d.ts +5 -0
  79. package/dist/src/common/exceptions/NotFoundException.d.ts.map +1 -0
  80. package/dist/src/common/exceptions/NotFoundException.js +8 -0
  81. package/dist/src/common/exceptions/NotFoundException.js.map +1 -0
  82. package/dist/src/common/exceptions/ServiceException.d.ts +5 -0
  83. package/dist/src/common/exceptions/ServiceException.d.ts.map +1 -0
  84. package/dist/src/common/exceptions/ServiceException.js +8 -0
  85. package/dist/src/common/exceptions/ServiceException.js.map +1 -0
  86. package/dist/src/common/exceptions/index.d.ts +6 -0
  87. package/dist/src/common/exceptions/index.d.ts.map +1 -0
  88. package/dist/src/common/exceptions/index.js +6 -0
  89. package/dist/src/common/exceptions/index.js.map +1 -0
  90. package/dist/src/common/migrate/index.d.ts +3 -0
  91. package/dist/src/common/migrate/index.d.ts.map +1 -0
  92. package/dist/src/common/migrate/index.js +49 -0
  93. package/dist/src/common/migrate/index.js.map +1 -0
  94. package/dist/src/common/redis/index.d.ts +14 -0
  95. package/dist/src/common/redis/index.d.ts.map +1 -0
  96. package/dist/src/common/redis/index.js +41 -0
  97. package/dist/src/common/redis/index.js.map +1 -0
  98. package/dist/src/common/scanner/auth-factory.d.ts +42 -0
  99. package/dist/src/common/scanner/auth-factory.d.ts.map +1 -0
  100. package/dist/src/common/scanner/auth-factory.js +86 -0
  101. package/dist/src/common/scanner/auth-factory.js.map +1 -0
  102. package/dist/src/common/scanner/decorators.d.ts +123 -0
  103. package/dist/src/common/scanner/decorators.d.ts.map +1 -0
  104. package/dist/src/common/scanner/decorators.js +158 -0
  105. package/dist/src/common/scanner/decorators.js.map +1 -0
  106. package/dist/src/common/scanner/handler-factory.d.ts +38 -0
  107. package/dist/src/common/scanner/handler-factory.d.ts.map +1 -0
  108. package/dist/src/common/scanner/handler-factory.js +76 -0
  109. package/dist/src/common/scanner/handler-factory.js.map +1 -0
  110. package/dist/src/common/scanner/index.d.ts +16 -0
  111. package/dist/src/common/scanner/index.d.ts.map +1 -0
  112. package/dist/src/common/scanner/index.js +157 -0
  113. package/dist/src/common/scanner/index.js.map +1 -0
  114. package/dist/src/common/validation/decorators.d.ts +28 -0
  115. package/dist/src/common/validation/decorators.d.ts.map +1 -0
  116. package/dist/src/common/validation/decorators.js +70 -0
  117. package/dist/src/common/validation/decorators.js.map +1 -0
  118. package/dist/src/common/validation/errorRules.d.ts +5 -0
  119. package/dist/src/common/validation/errorRules.d.ts.map +1 -0
  120. package/dist/src/common/validation/errorRules.js +56 -0
  121. package/dist/src/common/validation/errorRules.js.map +1 -0
  122. package/dist/src/common/validation/index.d.ts +4 -0
  123. package/dist/src/common/validation/index.d.ts.map +1 -0
  124. package/dist/src/common/validation/index.js +3 -0
  125. package/dist/src/common/validation/index.js.map +1 -0
  126. package/dist/src/common/validation/schema.d.ts +35 -0
  127. package/dist/src/common/validation/schema.d.ts.map +1 -0
  128. package/dist/src/common/validation/schema.js +67 -0
  129. package/dist/src/common/validation/schema.js.map +1 -0
  130. package/dist/src/index.d.ts +26 -0
  131. package/dist/src/index.d.ts.map +1 -0
  132. package/dist/src/index.js +293 -0
  133. package/dist/src/index.js.map +1 -0
  134. package/dist/src/main.d.ts +2 -0
  135. package/dist/src/main.d.ts.map +1 -0
  136. package/dist/src/main.js +27 -0
  137. package/dist/src/main.js.map +1 -0
  138. package/dist/src/modules/health/controller/HealthController.d.ts +11 -0
  139. package/dist/src/modules/health/controller/HealthController.d.ts.map +1 -0
  140. package/dist/src/modules/health/controller/HealthController.js +31 -0
  141. package/dist/src/modules/health/controller/HealthController.js.map +1 -0
  142. package/dist/src/modules/health/service/HealthService.d.ts +4 -0
  143. package/dist/src/modules/health/service/HealthService.d.ts.map +1 -0
  144. package/dist/src/modules/health/service/HealthService.js +6 -0
  145. package/dist/src/modules/health/service/HealthService.js.map +1 -0
  146. package/dist/src/types.d.ts +75 -0
  147. package/dist/src/types.d.ts.map +1 -0
  148. package/dist/src/types.js +2 -0
  149. package/dist/src/types.js.map +1 -0
  150. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JwtStrategy.js","sourceRoot":"","sources":["../../../../src/common/auth/JwtStrategy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,OAAO,WAAW;IACd,OAAO,CAAkB;IAEjC,YAAY,OAAwB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAuB,EAAE,MAAoB,EAAE,WAAoB;QACpF,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAY,CAAC;QAElC,4EAA4E;QAC5E,yDAAyD;QACzD,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACzB,MAAM,YAAY,GAAW,GAAG,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,EAAE,EAAE,CAAC;YACjE,IAAI,CAAC;gBACH,MAAM,WAAW,GAAY,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC9D,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,GAAG,GAAoC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;oBAClE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAa,GAA+B,CAAC,UAAU,KAAK,GAAG,CAAC;gBAC3E,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,GAAG,CAAC;gBACZ,CAAC;gBACD,8CAA8C;gBAC9C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,4CAA4C,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ export interface NonceStore {
2
+ /**
3
+ * Atomically check if nonce is new and mark it used.
4
+ * @returns true if nonce is allowed (first use), false if replay.
5
+ */
6
+ checkAndSet(nonce: string, ttlSeconds: number): Promise<boolean>;
7
+ }
8
+ /**
9
+ * In-memory nonce store. Default, single-instance only.
10
+ */
11
+ export declare class MemoryNonceStore implements NonceStore {
12
+ private cache;
13
+ checkAndSet(nonce: string, ttlSeconds: number): Promise<boolean>;
14
+ }
15
+ /**
16
+ * Redis-backed nonce store. Uses SET NX EX for atomic check-and-set.
17
+ * Requires redis module to be initialized (config.redis).
18
+ */
19
+ export declare class RedisNonceStore implements NonceStore {
20
+ checkAndSet(nonce: string, ttlSeconds: number): Promise<boolean>;
21
+ }
22
+ //# sourceMappingURL=NonceStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NonceStore.d.ts","sourceRoot":"","sources":["../../../../src/common/auth/NonceStore.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,KAAK,CAAkC;IAEzC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CASvE;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAC1C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAKvE"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * In-memory nonce store. Default, single-instance only.
3
+ */
4
+ export class MemoryNonceStore {
5
+ cache = new Map();
6
+ async checkAndSet(nonce, ttlSeconds) {
7
+ const now = Date.now();
8
+ const expiry = this.cache.get(nonce);
9
+ if (expiry !== undefined && expiry > now) {
10
+ return false;
11
+ }
12
+ this.cache.set(nonce, now + ttlSeconds * 1000);
13
+ return true;
14
+ }
15
+ }
16
+ /**
17
+ * Redis-backed nonce store. Uses SET NX EX for atomic check-and-set.
18
+ * Requires redis module to be initialized (config.redis).
19
+ */
20
+ export class RedisNonceStore {
21
+ async checkAndSet(nonce, ttlSeconds) {
22
+ // Dynamic import to avoid circular dependency at module load time
23
+ const { redis } = await import('../redis/index');
24
+ return redis.setnx(`nonce:${nonce}`, '1', ttlSeconds);
25
+ }
26
+ }
27
+ //# sourceMappingURL=NonceStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NonceStore.js","sourceRoot":"","sources":["../../../../src/common/auth/NonceStore.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACnB,KAAK,GAAwB,IAAI,GAAG,EAAE,CAAC;IAE/C,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,UAAkB;QACjD,MAAM,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAuB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,eAAe;IAC1B,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,UAAkB;QACjD,kEAAkE;QAClE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,EAAE,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type { SecretResolver } from './SignatureStrategy';
2
+ export interface DbSecretResolverOptions {
3
+ /** Table name. Default: 'api_keys'. */
4
+ tableName?: string;
5
+ /** Column for clientId lookup. Default: 'client_id'. */
6
+ clientIdColumn?: string;
7
+ /** Column for secret key. Default: 'secret_key'. */
8
+ secretColumn?: string;
9
+ /** Column for module name. Default: 'module_name'. */
10
+ moduleNameColumn?: string;
11
+ }
12
+ export declare function createDbSecretResolver(options?: DbSecretResolverOptions): SecretResolver;
13
+ export interface RedisSecretResolverOptions {
14
+ /** Key prefix. Default: 'client:secret:'. Full key = prefix + clientId. */
15
+ keyPrefix?: string;
16
+ }
17
+ export declare function createRedisSecretResolver(options?: RedisSecretResolverOptions): SecretResolver;
18
+ //# sourceMappingURL=SecretResolvers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecretResolvers.d.ts","sourceRoot":"","sources":["../../../../src/common/auth/SecretResolvers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,qBAAqB,CAAC;AAIxE,MAAM,WAAW,uBAAuB;IACtC,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,cAAc,CAoB5F;AAED,MAAM,WAAW,0BAA0B;IACzC,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,0BAA+B,GAAG,cAAc,CAWlG"}
@@ -0,0 +1,30 @@
1
+ import { db } from '../db/index';
2
+ import { redis } from '../redis/index';
3
+ export function createDbSecretResolver(options = {}) {
4
+ const tableName = options.tableName ?? 'api_keys';
5
+ const keyCol = options.clientIdColumn ?? 'client_id';
6
+ const secretCol = options.secretColumn ?? 'secret_key';
7
+ const moduleNameCol = options.moduleNameColumn ?? 'module_name';
8
+ return async (clientId, moduleName) => {
9
+ const row = await db.queryOne(`SELECT ${secretCol}, ${moduleNameCol} FROM ${tableName} WHERE ${keyCol} = ?`, [clientId]);
10
+ if (!row) {
11
+ return null;
12
+ }
13
+ return {
14
+ appSecret: row[secretCol],
15
+ moduleName: row[moduleNameCol],
16
+ };
17
+ };
18
+ }
19
+ export function createRedisSecretResolver(options = {}) {
20
+ const keyPrefix = options.keyPrefix ?? 'client:secret:';
21
+ return async (clientId, moduleName) => {
22
+ const json = await redis.get(`${keyPrefix}${clientId}`);
23
+ if (!json) {
24
+ return null;
25
+ }
26
+ const parsed = JSON.parse(json);
27
+ return parsed;
28
+ };
29
+ }
30
+ //# sourceMappingURL=SecretResolvers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecretResolvers.js","sourceRoot":"","sources":["../../../../src/common/auth/SecretResolvers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAavC,MAAM,UAAU,sBAAsB,CAAC,UAAmC,EAAE;IAC1E,MAAM,SAAS,GAAW,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC;IAC1D,MAAM,MAAM,GAAW,OAAO,CAAC,cAAc,IAAI,WAAW,CAAC;IAC7D,MAAM,SAAS,GAAW,OAAO,CAAC,YAAY,IAAI,YAAY,CAAC;IAC/D,MAAM,aAAa,GAAW,OAAO,CAAC,gBAAgB,IAAI,aAAa,CAAC;IAExE,OAAO,KAAK,EAAE,QAAgB,EAAE,UAAkB,EAAgC,EAAE;QAElF,MAAM,GAAG,GAAe,MAAM,EAAE,CAAC,QAAQ,CACvC,UAAU,SAAS,KAAK,aAAa,SAAS,SAAS,UAAU,MAAM,MAAM,EAC7E,CAAC,QAAQ,CAAC,CACX,CAAC;QACF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,SAAS,CAAW;YACnC,UAAU,EAAE,GAAG,CAAC,aAAa,CAAW;SACzC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,yBAAyB,CAAC,UAAsC,EAAE;IAChF,MAAM,SAAS,GAAW,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC;IAEhE,OAAO,KAAK,EAAE,QAAgB,EAAE,UAAkB,EAAgC,EAAE;QAClF,MAAM,IAAI,GAAkB,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAiB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;QAC9D,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { FastifyRequest, FastifyReply } from 'fastify';
2
+ import type { AuthStrategy } from './AuthStrategy';
3
+ import type { User } from '../../types';
4
+ import { type NonceStore } from './NonceStore';
5
+ export interface SecretResult {
6
+ appSecret: string;
7
+ moduleName?: string;
8
+ }
9
+ export type SecretResolver = (appKey: string, moduleName: string) => Promise<SecretResult | null>;
10
+ export interface SignatureOptions {
11
+ resolveSecret: SecretResolver;
12
+ timestampWindowMs?: number;
13
+ /** Nonce store for replay protection. Default: MemoryNonceStore. */
14
+ nonceStore?: NonceStore;
15
+ }
16
+ export declare class SignatureStrategy implements AuthStrategy {
17
+ private resolveSecret;
18
+ private windowMs;
19
+ private nonceStore;
20
+ constructor(options: SignatureOptions);
21
+ authenticate(request: FastifyRequest, reply: FastifyReply, moduleName?: string): Promise<User>;
22
+ }
23
+ //# sourceMappingURL=SignatureStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignatureStrategy.d.ts","sourceRoot":"","sources":["../../../../src/common/auth/SignatureStrategy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AASjE,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;AAElG,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,cAAc,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oEAAoE;IACpE,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AA0CD,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAa;gBAEnB,OAAO,EAAE,gBAAgB;IAM/B,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmErG"}
@@ -0,0 +1,115 @@
1
+ import { createHmac, timingSafeEqual } from 'node:crypto';
2
+ import { MemoryNonceStore } from './NonceStore';
3
+ const HEADER_KEY = 'x-app-key';
4
+ const HEADER_TIMESTAMP = 'x-timestamp';
5
+ const HEADER_NONCE = 'x-nonce';
6
+ const HEADER_SIGNATURE = 'x-signature';
7
+ const DEFAULT_WINDOW_MS = 5 * 60 * 1000;
8
+ function canonicalBody(body) {
9
+ if (body === null || body === undefined) {
10
+ return '';
11
+ }
12
+ if (typeof body !== 'object') {
13
+ return String(body);
14
+ }
15
+ const keys = Object.keys(body).sort();
16
+ return JSON.stringify(body, keys);
17
+ }
18
+ function computeSignature(secret, stringToSign) {
19
+ return createHmac('sha256', secret).update(stringToSign).digest('base64');
20
+ }
21
+ function constantTimeEqual(a, b) {
22
+ // Treat absent signature the same as empty string
23
+ if (a === undefined && b === undefined)
24
+ return true;
25
+ if (a === undefined || b === undefined)
26
+ return false;
27
+ const bufA = Buffer.from(a);
28
+ const bufB = Buffer.from(b);
29
+ return bufA.length === bufB.length && timingSafeEqual(bufA, bufB);
30
+ }
31
+ function extractBodyForSign(request) {
32
+ const contentType = request.headers['content-type'];
33
+ if (contentType === undefined || !contentType.includes('multipart/form-data')) {
34
+ return request.body;
35
+ }
36
+ if (request.body === undefined || request.body === null) {
37
+ return {};
38
+ }
39
+ const body = request.body;
40
+ const signField = body._sign_body;
41
+ if (signField === undefined || signField.value === undefined) {
42
+ return {};
43
+ }
44
+ return JSON.parse(signField.value);
45
+ }
46
+ export class SignatureStrategy {
47
+ resolveSecret;
48
+ windowMs;
49
+ nonceStore;
50
+ constructor(options) {
51
+ this.resolveSecret = options.resolveSecret;
52
+ this.windowMs = options.timestampWindowMs ?? DEFAULT_WINDOW_MS;
53
+ this.nonceStore = options.nonceStore ?? new MemoryNonceStore();
54
+ }
55
+ async authenticate(request, reply, moduleName) {
56
+ const appKey = request.headers[HEADER_KEY];
57
+ const timestamp = request.headers[HEADER_TIMESTAMP];
58
+ const nonce = request.headers[HEADER_NONCE];
59
+ const clientSignature = request.headers[HEADER_SIGNATURE];
60
+ const clientInfo = { appKey, timestamp, nonce, clientSignature };
61
+ if (!appKey || !timestamp || !nonce || !clientSignature) {
62
+ request.log.warn({ clientInfo }, 'Signature auth: missing headers');
63
+ return reply.status(401).send({ code: 'error', error: '签名验证失败' });
64
+ }
65
+ // Timestamp freshness
66
+ const ts = Number(timestamp);
67
+ if (isNaN(ts)) {
68
+ request.log.warn({ clientInfo }, 'Signature auth: invalid timestamp format');
69
+ return reply.status(401).send({ code: 'error', error: '签名验证失败' });
70
+ }
71
+ const now = Date.now();
72
+ if (Math.abs(now - ts) > this.windowMs) {
73
+ request.log.warn({ clientInfo, now, windowMs: this.windowMs }, 'Signature auth: timestamp expired');
74
+ return reply.status(401).send({ code: 'error', error: '签名验证失败' });
75
+ }
76
+ // Nonce replay check
77
+ const ttlSeconds = Math.ceil(this.windowMs / 1000);
78
+ const isNew = await this.nonceStore.checkAndSet(nonce, ttlSeconds);
79
+ if (!isNew) {
80
+ request.log.warn({ clientInfo }, 'Signature auth: nonce replay detected');
81
+ return reply.status(401).send({ code: 'error', error: '签名验证失败' });
82
+ }
83
+ // Look up secret
84
+ const result = await this.resolveSecret(appKey, moduleName ?? '');
85
+ if (!result) {
86
+ request.log.warn({ appKey }, 'Signature auth: appKey not found or expired');
87
+ return reply.status(401).send({ code: 'retry', error: '凭证无效或已过期' });
88
+ }
89
+ // Compute expected signature
90
+ const method = request.method;
91
+ const path = request.url;
92
+ const bodyStr = canonicalBody(extractBodyForSign(request));
93
+ const stringToSign = `${method}\n${path}\n${timestamp}\n${nonce}\n${bodyStr}`;
94
+ const expectedSignature = computeSignature(result.appSecret, stringToSign);
95
+ if (!constantTimeEqual(expectedSignature, clientSignature)) {
96
+ request.log.warn({
97
+ appKey,
98
+ method,
99
+ path,
100
+ timestamp,
101
+ nonce,
102
+ bodyStr,
103
+ stringToSign,
104
+ expectedSignature,
105
+ clientSignature,
106
+ }, 'Signature auth: signature mismatch');
107
+ return reply.status(401).send({ code: 'error', error: '签名验证失败' });
108
+ }
109
+ const user = {
110
+ id: appKey,
111
+ };
112
+ return user;
113
+ }
114
+ }
115
+ //# sourceMappingURL=SignatureStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignatureStrategy.js","sourceRoot":"","sources":["../../../../src/common/auth/SignatureStrategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { AuthStrategy } from './AuthStrategy';
2
+ export { JwtStrategy } from './JwtStrategy';
3
+ export { signToken, initSignToken } from './signToken';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/common/auth/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { JwtStrategy } from './JwtStrategy';
2
+ export { signToken, initSignToken } from './signToken';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/common/auth/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ export declare function initSignToken(fastify: FastifyInstance): void;
3
+ export declare function signToken(payload: Record<string, unknown>): Promise<string>;
4
+ //# sourceMappingURL=signToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signToken.d.ts","sourceRoot":"","sources":["../../../../src/common/auth/signToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI/C,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAG5D;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAKjF"}
@@ -0,0 +1,11 @@
1
+ let _sign;
2
+ export function initSignToken(fastify) {
3
+ _sign = (payload) => Promise.resolve(fastify.jwt.sign(payload));
4
+ }
5
+ export async function signToken(payload) {
6
+ if (!_sign) {
7
+ throw new Error('signToken not initialized. Ensure JWT plugin is registered.');
8
+ }
9
+ return _sign(payload);
10
+ }
11
+ //# sourceMappingURL=signToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signToken.js","sourceRoot":"","sources":["../../../../src/common/auth/signToken.ts"],"names":[],"mappings":"AAEA,IAAI,KAA0E,CAAC;AAE/E,MAAM,UAAU,aAAa,CAAC,OAAwB;IACpD,KAAK,GAAG,CAAC,OAAgC,EAAE,EAAE,CAC3C,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAgC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { AppConfig } from '../../types';
2
+ /**
3
+ * Load config based on APP_ENV environment variable.
4
+ *
5
+ * APP_ENV=test → config/test.ts
6
+ * APP_ENV=prod → config/production.ts
7
+ * (unset) → config/development.ts
8
+ */
9
+ export declare function loadConfig(): Promise<AppConfig>;
10
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../src/common/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAUrD"}
@@ -0,0 +1,20 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ /**
5
+ * Load config based on APP_ENV environment variable.
6
+ *
7
+ * APP_ENV=test → config/test.ts
8
+ * APP_ENV=prod → config/production.ts
9
+ * (unset) → config/development.ts
10
+ */
11
+ export async function loadConfig() {
12
+ const env = process.env.APP_ENV || 'development';
13
+ const configPath = resolve(process.cwd(), 'config', `${env}.ts`);
14
+ if (!existsSync(configPath)) {
15
+ throw new Error(`Config file not found: ${configPath} (APP_ENV=${env})`);
16
+ }
17
+ const mod = await import(pathToFileURL(configPath).href);
18
+ return mod.default;
19
+ }
20
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../src/common/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,GAAG,GAAW,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,aAAa,CAAC;IACzD,MAAM,UAAU,GAAW,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;IAEzE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,aAAa,GAAG,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare class Container {
2
+ private instances;
3
+ register<T>(token: Function, instance: T): void;
4
+ resolve<T>(token: Function): T;
5
+ }
6
+ export declare const container: Container;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/common/container/index.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAgC;IAEjD,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;IAI/C,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC;CAO/B;AAED,eAAO,MAAM,SAAS,WAAkB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export class Container {
2
+ instances = new Map();
3
+ register(token, instance) {
4
+ this.instances.set(token, instance);
5
+ }
6
+ resolve(token) {
7
+ const instance = this.instances.get(token);
8
+ if (instance === undefined) {
9
+ throw new Error(`No instance registered for ${token.name}`);
10
+ }
11
+ return instance;
12
+ }
13
+ }
14
+ export const container = new Container();
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/common/container/index.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAS;IACZ,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEjD,QAAQ,CAAI,KAAe,EAAE,QAAW;QACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAI,KAAe;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,QAAa,CAAC;IACvB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Knex } from 'knex';
2
+ import type { ResultSetHeader } from 'mysql2';
3
+ export declare function initDb(knex: Knex): void;
4
+ export interface Transaction {
5
+ query<T>(sql: string, params?: unknown[]): Promise<T[]>;
6
+ queryOne<T>(sql: string, params?: unknown[]): Promise<T | null>;
7
+ insert(sql: string, params?: unknown[]): Promise<ResultSetHeader>;
8
+ execute(sql: string, params?: unknown[]): Promise<number>;
9
+ }
10
+ export declare function knex(tableName: string): Knex.QueryBuilder;
11
+ export declare const db: {
12
+ query<T>(sql: string, params?: unknown[]): Promise<T[]>;
13
+ queryOne<T>(sql: string, params?: unknown[]): Promise<T | null>;
14
+ insert(sql: string, params?: unknown[]): Promise<ResultSetHeader>;
15
+ execute(sql: string, params?: unknown[]): Promise<number>;
16
+ /** Runs fn within a single MySQL transaction. Rolls back on error. */
17
+ transaction<T>(fn: (tx: Transaction) => Promise<T>): Promise<T>;
18
+ };
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/common/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAI9C,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAEvC;AASD,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACxD,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAChE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3D;AAED,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,YAAY,CAEzD;AASD,eAAO,MAAM,EAAE;UACD,CAAC,OAAO,MAAM,WAAW,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;aAK9C,CAAC,OAAO,MAAM,WAAW,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;gBAKnD,MAAM,WAAW,OAAO,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;iBAKpD,MAAM,WAAW,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D,sEAAsE;gBACpD,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAwBtE,CAAC"}
@@ -0,0 +1,64 @@
1
+ let _knex = null;
2
+ export function initDb(knex) {
3
+ _knex = knex;
4
+ }
5
+ function getKnex() {
6
+ if (_knex === null) {
7
+ throw new Error('db not initialized — call initDb(knex) during app startup');
8
+ }
9
+ return _knex;
10
+ }
11
+ export function knex(tableName) {
12
+ return getKnex()(tableName);
13
+ }
14
+ function bindings(params) {
15
+ if (!params)
16
+ return [];
17
+ // Replace undefined with null to prevent Knex raw query binding errors.
18
+ // Callers should default optional fields, this is a safety net.
19
+ return params.map((v) => (v === undefined ? null : v));
20
+ }
21
+ export const db = {
22
+ async query(sql, params) {
23
+ const result = await getKnex().raw(sql, bindings(params));
24
+ return result[0];
25
+ },
26
+ async queryOne(sql, params) {
27
+ const rows = await db.query(sql, params);
28
+ return rows.length > 0 ? rows[0] : null;
29
+ },
30
+ async insert(sql, params) {
31
+ const result = await getKnex().raw(sql, bindings(params));
32
+ return result[0];
33
+ },
34
+ async execute(sql, params) {
35
+ const result = await getKnex().raw(sql, bindings(params));
36
+ return result[0].affectedRows;
37
+ },
38
+ /** Runs fn within a single MySQL transaction. Rolls back on error. */
39
+ async transaction(fn) {
40
+ return getKnex().transaction(async (trx) => {
41
+ const tx = {
42
+ async query(sql, params) {
43
+ const r = await trx.raw(sql, bindings(params));
44
+ return r[0];
45
+ },
46
+ async queryOne(sql, params) {
47
+ const r = await trx.raw(sql, bindings(params));
48
+ const arr = r[0];
49
+ return arr.length > 0 ? arr[0] : null;
50
+ },
51
+ async insert(sql, params) {
52
+ const r = await trx.raw(sql, bindings(params));
53
+ return r[0];
54
+ },
55
+ async execute(sql, params) {
56
+ const r = await trx.raw(sql, bindings(params));
57
+ return r[0].affectedRows;
58
+ },
59
+ };
60
+ return fn(tx);
61
+ });
62
+ },
63
+ };
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/common/db/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface PageResult<T> {
2
+ items: T[];
3
+ total: number;
4
+ page: number;
5
+ pageSize: number;
6
+ }
7
+ /** DAO-layer paginated query result — raw rows without page/pageSize context */
8
+ export interface PagedRows<T> {
9
+ rows: T[];
10
+ total: number;
11
+ }
12
+ //# sourceMappingURL=PageResult.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageResult.d.ts","sourceRoot":"","sources":["../../../../src/common/dto/PageResult.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,gFAAgF;AAChF,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PageResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageResult.js","sourceRoot":"","sources":["../../../../src/common/dto/PageResult.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { FastifyError, FastifyReply, FastifyRequest } from 'fastify';
2
+ export declare function errorHandler(error: FastifyError | Error, request: FastifyRequest, reply: FastifyReply): void;
3
+ //# sourceMappingURL=errorHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../../src/common/errorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAO1E,wBAAgB,YAAY,CAC1B,KAAK,EAAE,YAAY,GAAG,KAAK,EAC3B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,GAClB,IAAI,CA8CN"}
@@ -0,0 +1,47 @@
1
+ import { BaseException } from './exceptions/BaseException';
2
+ import { AuthException } from './exceptions/AuthException';
3
+ import { BusinessException } from './exceptions/BusinessException';
4
+ import { NotFoundException } from './exceptions/NotFoundException';
5
+ import { ServiceException } from './exceptions/ServiceException';
6
+ export function errorHandler(error, request, reply) {
7
+ // AuthException → 401 with code:login (key not found, token expired, etc.)
8
+ if (error instanceof AuthException) {
9
+ reply.status(401).send({ code: 'login', error: error.message });
10
+ return;
11
+ }
12
+ // Known business exceptions — 404 is reserved for route-not-found only
13
+ if (error instanceof NotFoundException || error instanceof BusinessException) {
14
+ reply.status(422).send({ error: error.message });
15
+ return;
16
+ }
17
+ if (error instanceof ServiceException) {
18
+ reply.status(500).send({ error: '服务器内部错误' });
19
+ return;
20
+ }
21
+ if (error instanceof BaseException) {
22
+ reply.status(500).send({ error: '服务器内部错误' });
23
+ return;
24
+ }
25
+ // Fastify schema validation error — message already formatted by schemaErrorFormatter
26
+ if ('validation' in error && error.validation) {
27
+ reply.status(422).send({ error: error.message });
28
+ return;
29
+ }
30
+ // Fastify schema validation error
31
+ if (error.name === 'FastifyError' && 'statusCode' in error) {
32
+ const statusCode = error.statusCode;
33
+ if (statusCode !== undefined && statusCode < 500) {
34
+ // JWT auth errors → unified code:login
35
+ if (statusCode === 401) {
36
+ reply.status(401).send({ code: 'login', error: error.message });
37
+ return;
38
+ }
39
+ reply.status(statusCode).send({ error: error.message });
40
+ return;
41
+ }
42
+ }
43
+ // Unknown error → 500, generic message
44
+ request.log.error(error, 'Unhandled error');
45
+ reply.status(500).send({ error: '服务器内部错误' });
46
+ }
47
+ //# sourceMappingURL=errorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../../src/common/errorHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,UAAU,YAAY,CAC1B,KAA2B,EAC3B,OAAuB,EACvB,KAAmB;IAEnB,2EAA2E;IAC3E,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,uEAAuE;IACvE,IAAI,KAAK,YAAY,iBAAiB,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;QAC7E,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;QACtC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,sFAAsF;IACtF,IAAI,YAAY,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9C,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,kCAAkC;IAClC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,YAAY,IAAI,KAAK,EAAE,CAAC;QAC3D,MAAM,UAAU,GAAI,KAAsB,CAAC,UAAU,CAAC;QACtD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;YACjD,uCAAuC;YACvC,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;gBACvB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChE,OAAO;YACT,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC5C,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { BaseException } from './BaseException';
2
+ export declare class AuthException extends BaseException {
3
+ constructor(message: string);
4
+ }
5
+ //# sourceMappingURL=AuthException.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthException.d.ts","sourceRoot":"","sources":["../../../../src/common/exceptions/AuthException.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,qBAAa,aAAc,SAAQ,aAAa;gBAClC,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,8 @@
1
+ import { BaseException } from './BaseException';
2
+ export class AuthException extends BaseException {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = 'AuthException';
6
+ }
7
+ }
8
+ //# sourceMappingURL=AuthException.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthException.js","sourceRoot":"","sources":["../../../../src/common/exceptions/AuthException.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,OAAO,aAAc,SAAQ,aAAa;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export declare class BaseException extends Error {
2
+ constructor(message: string);
3
+ }
4
+ //# sourceMappingURL=BaseException.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseException.d.ts","sourceRoot":"","sources":["../../../../src/common/exceptions/BaseException.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B"}