midway-fatcms 0.0.7 → 0.0.9

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 (159) hide show
  1. package/.qoder/skills/midway-fatcms/01-quick-start.md +231 -0
  2. package/.qoder/skills/midway-fatcms/02-crud-quick.md +375 -0
  3. package/.qoder/skills/midway-fatcms/03-crud-sharding.md +489 -0
  4. package/.qoder/skills/midway-fatcms/04-condition-operators.md +93 -0
  5. package/.qoder/skills/midway-fatcms/05-configuration.md +290 -0
  6. package/.qoder/skills/midway-fatcms/06-builtin-functions.md +241 -0
  7. package/.qoder/skills/midway-fatcms/07-examples.md +504 -0
  8. package/.qoder/skills/midway-fatcms/SKILL.md +96 -0
  9. package/README.md +9 -9
  10. package/dist/configuration.d.ts +10 -0
  11. package/dist/configuration.js +26 -0
  12. package/dist/controller/base/BaseApiController.d.ts +1 -2
  13. package/dist/controller/base/BaseApiController.js +0 -4
  14. package/dist/controller/gateway/DocGatewayController.js +1 -1
  15. package/dist/controller/helpers.controller.d.ts +6 -0
  16. package/dist/controller/helpers.controller.js +19 -0
  17. package/dist/controller/manage/FlowConfigManageApi.js +4 -2
  18. package/dist/controller/manage/SysConfigMangeApi.js +6 -1
  19. package/dist/controller/manage/UserAccountManageApi.js +7 -2
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.js +2 -2
  22. package/dist/libs/crud-pro/CrudPro.d.ts +51 -3
  23. package/dist/libs/crud-pro/CrudPro.js +111 -4
  24. package/dist/libs/crud-pro/exceptions.d.ts +7 -0
  25. package/dist/libs/crud-pro/exceptions.js +7 -0
  26. package/dist/libs/crud-pro/interfaces.d.ts +83 -12
  27. package/dist/libs/crud-pro/models/CrudResult.d.ts +116 -0
  28. package/dist/libs/crud-pro/models/CrudResult.js +126 -0
  29. package/dist/libs/crud-pro/models/RequestModel.d.ts +2 -2
  30. package/dist/libs/crud-pro/models/ServiceHub.d.ts +2 -0
  31. package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.d.ts +70 -2
  32. package/dist/libs/crud-pro/services/CrudProDataTypeConvertService.js +205 -13
  33. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +36 -2
  34. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +8 -4
  35. package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +36 -0
  36. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +97 -4
  37. package/dist/libs/crud-pro/services/CurdProServiceHub.d.ts +2 -0
  38. package/dist/libs/crud-pro/services/CurdProServiceHub.js +6 -0
  39. package/dist/libs/crud-pro-quick/CrudProQuick.d.ts +382 -0
  40. package/dist/libs/crud-pro-quick/CrudProQuick.js +689 -0
  41. package/dist/libs/crud-pro-quick/fixSoftDelete.d.ts +30 -0
  42. package/dist/{service/curd → libs/crud-pro-quick}/fixSoftDelete.js +3 -6
  43. package/dist/libs/crud-pro-quick/index.d.ts +36 -0
  44. package/dist/libs/crud-pro-quick/index.js +49 -0
  45. package/dist/libs/crud-pro-quick/models.d.ts +33 -0
  46. package/dist/libs/crud-pro-quick/models.js +2 -0
  47. package/dist/libs/crud-sharding/ShardingBase.d.ts +78 -0
  48. package/dist/libs/crud-sharding/ShardingBase.js +179 -0
  49. package/dist/libs/crud-sharding/ShardingByCustomCrud.d.ts +35 -0
  50. package/dist/libs/crud-sharding/ShardingByCustomCrud.js +297 -0
  51. package/dist/libs/crud-sharding/ShardingByHashCrud.d.ts +38 -0
  52. package/dist/libs/crud-sharding/ShardingByHashCrud.js +86 -0
  53. package/dist/libs/crud-sharding/ShardingByKeyCrud.d.ts +39 -0
  54. package/dist/libs/crud-sharding/ShardingByKeyCrud.js +74 -0
  55. package/dist/libs/crud-sharding/ShardingByTimeCrud.d.ts +66 -0
  56. package/dist/libs/crud-sharding/ShardingByTimeCrud.js +524 -0
  57. package/dist/libs/crud-sharding/ShardingConfig.d.ts +25 -10
  58. package/dist/libs/crud-sharding/ShardingConfig.js +5 -5
  59. package/dist/libs/crud-sharding/ShardingMerger.d.ts +10 -18
  60. package/dist/libs/crud-sharding/ShardingMerger.js +27 -44
  61. package/dist/libs/crud-sharding/ShardingResult.d.ts +33 -0
  62. package/dist/libs/crud-sharding/ShardingResult.js +16 -0
  63. package/dist/libs/crud-sharding/ShardingTableCreator.d.ts +21 -4
  64. package/dist/libs/crud-sharding/ShardingTableCreator.js +193 -59
  65. package/dist/libs/crud-sharding/ShardingUtils.d.ts +48 -0
  66. package/dist/libs/crud-sharding/ShardingUtils.js +122 -1
  67. package/dist/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  68. package/dist/libs/crud-sharding/index.d.ts +13 -15
  69. package/dist/libs/crud-sharding/index.js +33 -17
  70. package/dist/models/RedisKeys.d.ts +1 -0
  71. package/dist/models/RedisKeys.js +1 -0
  72. package/dist/models/bizmodels.d.ts +2 -6
  73. package/dist/service/SysAppService.d.ts +2 -2
  74. package/dist/service/SysAppService.js +16 -5
  75. package/dist/service/SysConfigService.d.ts +1 -1
  76. package/dist/service/SysConfigService.js +7 -2
  77. package/dist/service/SysDictDataService.js +14 -4
  78. package/dist/service/SysMenuService.js +7 -2
  79. package/dist/service/TableMetaCacheRedisSubscriber.d.ts +31 -0
  80. package/dist/service/TableMetaCacheRedisSubscriber.js +98 -0
  81. package/dist/service/curd/CurdMixService.d.ts +6 -4
  82. package/dist/service/curd/CurdMixService.js +16 -2
  83. package/dist/service/curd/CurdProService.d.ts +149 -29
  84. package/dist/service/curd/CurdProService.js +157 -38
  85. package/dist/service/flow/FlowConfigService.js +7 -2
  86. package/dist/service/flow/FlowInstanceCrudService.js +22 -19
  87. package/package.json +1 -1
  88. package/src/configuration.ts +27 -0
  89. package/src/controller/base/BaseApiController.ts +0 -5
  90. package/src/controller/gateway/DocGatewayController.ts +1 -1
  91. package/src/controller/helpers.controller.ts +15 -0
  92. package/src/controller/manage/CrudStandardDesignApi.ts +4 -3
  93. package/src/controller/manage/FlowConfigManageApi.ts +4 -2
  94. package/src/controller/manage/SysConfigMangeApi.ts +6 -1
  95. package/src/controller/manage/UserAccountManageApi.ts +7 -2
  96. package/src/index.ts +2 -2
  97. package/src/libs/crud-pro/CrudPro.ts +134 -7
  98. package/src/libs/crud-pro/exceptions.ts +8 -0
  99. package/src/libs/crud-pro/interfaces.ts +111 -15
  100. package/src/libs/crud-pro/models/CrudResult.ts +178 -0
  101. package/src/libs/crud-pro/models/RequestModel.ts +2 -2
  102. package/src/libs/crud-pro/models/ServiceHub.ts +4 -0
  103. package/src/libs/crud-pro/services/CrudProDataTypeConvertService.ts +238 -15
  104. package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +41 -2
  105. package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +11 -7
  106. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +110 -3
  107. package/src/libs/crud-pro/services/CurdProServiceHub.ts +8 -0
  108. package/src/libs/crud-pro-quick/CrudProQuick.ts +782 -0
  109. package/src/{service/curd → libs/crud-pro-quick}/fixSoftDelete.ts +23 -13
  110. package/src/libs/crud-pro-quick/index.ts +52 -0
  111. package/src/libs/crud-pro-quick/models.ts +35 -0
  112. package/src/libs/crud-sharding/ShardingBase.ts +256 -0
  113. package/src/libs/crud-sharding/ShardingByCustomCrud.ts +329 -0
  114. package/src/libs/crud-sharding/ShardingByHashCrud.ts +111 -0
  115. package/src/libs/crud-sharding/ShardingByKeyCrud.ts +97 -0
  116. package/src/libs/crud-sharding/ShardingByTimeCrud.ts +628 -0
  117. package/src/libs/crud-sharding/ShardingConfig.ts +28 -10
  118. package/src/libs/crud-sharding/ShardingMerger.ts +35 -63
  119. package/src/libs/crud-sharding/ShardingResult.ts +29 -0
  120. package/src/libs/crud-sharding/ShardingTableCreator.ts +214 -71
  121. package/src/libs/crud-sharding/ShardingUtils.ts +137 -0
  122. package/src/libs/crud-sharding/TIME_COLUMN_CLEAN_SPEC.md +488 -0
  123. package/src/libs/crud-sharding/index.ts +30 -16
  124. package/src/models/RedisKeys.ts +1 -0
  125. package/src/models/bizmodels.ts +4 -7
  126. package/src/service/SysAppService.ts +18 -7
  127. package/src/service/SysConfigService.ts +8 -3
  128. package/src/service/SysDictDataService.ts +14 -4
  129. package/src/service/SysMenuService.ts +7 -2
  130. package/src/service/TableMetaCacheRedisSubscriber.ts +105 -0
  131. package/src/service/crudstd/CrudStdService.ts +2 -2
  132. package/src/service/curd/CurdMixService.ts +26 -5
  133. package/src/service/curd/CurdProService.ts +186 -45
  134. package/src/service/flow/FlowConfigService.ts +7 -2
  135. package/src/service/flow/FlowInstanceCrudService.ts +23 -20
  136. package/.qoder/skills/midway-fatcms-crud/SKILL.md +0 -375
  137. package/.qoder/skills/midway-fatcms-crud/examples.md +0 -990
  138. package/.qoder/skills/midway-fatcms-crud/reference.md +0 -568
  139. package/dist/libs/crud-pro/README.md +0 -809
  140. package/dist/libs/crud-pro/README_FUNC.md +0 -193
  141. package/dist/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  142. package/dist/libs/crud-sharding/ShardingCrudPro.d.ts +0 -363
  143. package/dist/libs/crud-sharding/ShardingCrudPro.js +0 -675
  144. package/dist/libs/crud-sharding/ShardingRouter.d.ts +0 -69
  145. package/dist/libs/crud-sharding/ShardingRouter.js +0 -377
  146. package/dist/models/StandardColumns.d.ts +0 -71
  147. package/dist/models/StandardColumns.js +0 -28
  148. package/dist/service/curd/CrudProQuick.d.ts +0 -190
  149. package/dist/service/curd/CrudProQuick.js +0 -319
  150. package/dist/service/curd/README.md +0 -1100
  151. package/dist/service/curd/fixSoftDelete.d.ts +0 -20
  152. package/src/libs/crud-pro/README.md +0 -809
  153. package/src/libs/crud-pro/README_FUNC.md +0 -193
  154. package/src/libs/crud-sharding/ROUTING_LOGIC.md +0 -944
  155. package/src/libs/crud-sharding/ShardingCrudPro.ts +0 -835
  156. package/src/libs/crud-sharding/ShardingRouter.ts +0 -512
  157. package/src/models/StandardColumns.ts +0 -76
  158. package/src/service/curd/CrudProQuick.ts +0 -360
  159. package/src/service/curd/README.md +0 -1100
@@ -39,6 +39,24 @@ class CrudProTableMetaCache {
39
39
  expiredTime: Date.now() + cacheTime,
40
40
  };
41
41
  }
42
+
43
+ /**
44
+ * 清空所有缓存
45
+ */
46
+ public clearAll(): void {
47
+ this.cacheMap = {};
48
+ this.tableInfoCacheMap = {};
49
+ }
50
+
51
+ /**
52
+ * 获取缓存统计信息
53
+ */
54
+ public getCacheStats(): { metaCacheCount: number; tableInfoCacheCount: number } {
55
+ return {
56
+ metaCacheCount: Object.keys(this.cacheMap).length,
57
+ tableInfoCacheCount: Object.keys(this.tableInfoCacheMap).length,
58
+ };
59
+ }
42
60
  }
43
61
 
44
62
  const metaCache = new CrudProTableMetaCache();
@@ -53,6 +71,40 @@ class CrudProTableMetaService extends CrudProServiceBase {
53
71
  return obj;
54
72
  }
55
73
 
74
+ /**
75
+ * 清空所有表元数据缓存
76
+ *
77
+ * 清空后,下次请求会自动从数据库重新加载。
78
+ * 适用于定时刷新或手动触发缓存失效的场景。
79
+ */
80
+ public clearAllCache(): void {
81
+ metaCache.clearAll();
82
+ }
83
+
84
+ /**
85
+ * 获取缓存统计信息
86
+ */
87
+ public getCacheStats(): { metaCacheCount: number; tableInfoCacheCount: number } {
88
+ return metaCache.getCacheStats();
89
+ }
90
+
91
+ /**
92
+ * 获取表的主键列名列表
93
+ *
94
+ * 复用 getTableMeta 的缓存机制,从 columnDetails 中筛选 isPrimaryKey 的列,
95
+ * 避免重复查询数据库。
96
+ *
97
+ * @param query 表元数据查询参数
98
+ * @returns 主键列名数组
99
+ */
100
+ public async getPrimaryKeyColumns(query: ITableMetaQuery): Promise<string[]> {
101
+ const meta = await this.getTableMeta(query);
102
+ const pks = (meta.columnDetails || [])
103
+ .filter(col => col.isPrimaryKey)
104
+ .map(col => col.name);
105
+ return pks;
106
+ }
107
+
56
108
  // ============ 获取表和视图信息(带类型) ============
57
109
 
58
110
 
@@ -84,8 +136,7 @@ class CrudProTableMetaService extends CrudProServiceBase {
84
136
 
85
137
  // 3. 更新缓存
86
138
  if (!skipCache || refreshCache) {
87
- const { tableMetaCacheTime } = this.getContextCfg();
88
- metaCache.setTableInfos(cacheKey, result, tableMetaCacheTime || 3600000);
139
+ metaCache.setTableInfos(cacheKey, result, 1000 * 3600 * 24 * 365);
89
140
  }
90
141
 
91
142
  return result;
@@ -245,12 +296,16 @@ class CrudProTableMetaService extends CrudProServiceBase {
245
296
  // 获取字段注释
246
297
  const commentMap = await this.loadPostgreSQLColumnComments(baseInfo, schemaname);
247
298
 
299
+ // 获取主键列
300
+ const pkSet = await this.loadPostgreSQLPrimaryKeys(baseInfo, schemaname);
301
+
248
302
  return columnArray.map((columnObj: any) => {
249
303
  const { column_name, data_type, is_nullable, column_default, character_maximum_length } = columnObj;
250
304
  return {
251
305
  name: column_name,
252
306
  type: data_type,
253
307
  isNullable: is_nullable === 'YES',
308
+ isPrimaryKey: pkSet.has(column_name),
254
309
  defaultValue: column_default,
255
310
  maxLength: character_maximum_length,
256
311
  comment: commentMap[column_name],
@@ -288,6 +343,27 @@ class CrudProTableMetaService extends CrudProServiceBase {
288
343
  return map;
289
344
  }
290
345
 
346
+ private async loadPostgreSQLPrimaryKeys(
347
+ baseInfo: IExecuteUnsafeQueryCtx,
348
+ schemaname: string
349
+ ): Promise<Set<string>> {
350
+ const pkSql = `
351
+ SELECT a.attname
352
+ FROM pg_index i
353
+ JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
354
+ JOIN pg_class c ON c.oid = i.indrelid
355
+ JOIN pg_namespace n ON n.oid = c.relnamespace
356
+ WHERE n.nspname = '${schemaname}'
357
+ AND c.relname = '${baseInfo.sqlTable}'
358
+ AND i.indisprimary
359
+ ORDER BY array_position(i.indkey, a.attnum);
360
+ `.trim();
361
+
362
+ const queryRes = await this.executeUnsafeQuery(baseInfo, pkSql);
363
+ const pkRows = queryRes.rows || [];
364
+ return new Set(pkRows.map((row: any) => row.attname));
365
+ }
366
+
291
367
  private async loadSQLServerColumnDetails(baseInfo: IExecuteUnsafeQueryCtx): Promise<ITableColumn[]> {
292
368
  const columnArraySql = `
293
369
  SELECT
@@ -311,19 +387,50 @@ class CrudProTableMetaService extends CrudProServiceBase {
311
387
  const queryRes = await this.executeUnsafeQuery(baseInfo, columnArraySql);
312
388
  const columnArray = queryRes.rows || [];
313
389
 
390
+ // 获取主键列
391
+ const pkSet = await this.loadSQLServerPrimaryKeys(baseInfo);
392
+
314
393
  return columnArray.map((columnObj: any) => {
315
394
  const { column_name, data_type, is_nullable, column_default, column_comment, max_length, is_identity } = columnObj;
316
395
  return {
317
396
  name: column_name,
318
397
  type: data_type,
319
398
  isNullable: is_nullable,
399
+ isPrimaryKey: pkSet.has(column_name),
320
400
  defaultValue: column_default,
321
401
  comment: column_comment,
322
402
  maxLength: max_length,
323
- isPrimaryKey: is_identity,
403
+ isIdentity: is_identity,
324
404
  };
325
405
  });
326
406
  }
407
+
408
+ private async loadSQLServerPrimaryKeys(baseInfo: IExecuteUnsafeQueryCtx): Promise<Set<string>> {
409
+ const pkSql = `
410
+ SELECT COL_NAME(ic.object_id, ic.column_id) AS column_name
411
+ FROM sys.indexes i
412
+ INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
413
+ WHERE i.object_id = OBJECT_ID('${baseInfo.sqlTable}')
414
+ AND i.is_primary_key = 1
415
+ ORDER BY ic.key_ordinal;
416
+ `.trim();
417
+
418
+ const queryRes = await this.executeUnsafeQuery(baseInfo, pkSql);
419
+ const pkRows = queryRes.rows || [];
420
+ return new Set(pkRows.map((row: any) => row.column_name));
421
+ }
327
422
  }
328
423
 
329
424
  export { CrudProTableMetaService };
425
+
426
+ /**
427
+ * 清空所有表元数据缓存(独立函数,无需实例化 Service 即可调用)
428
+ *
429
+ * 适用于定时任务等无法通过 Service 实例访问的场景。
430
+ * 清空后,下次请求会自动从数据库重新加载(懒加载刷新)。
431
+ */
432
+ export function clearTableMetaCache(): { metaCacheCount: number; tableInfoCacheCount: number } {
433
+ const stats = metaCache.getCacheStats();
434
+ metaCache.clearAll();
435
+ return stats;
436
+ }
@@ -98,6 +98,10 @@ class CurdProServiceHub implements ICurdProServiceHub {
98
98
  return await this.tableMetaService.getTableMeta(query);
99
99
  }
100
100
 
101
+ async getPrimaryKeyColumns(query: ITableMetaQuery): Promise<string[]> {
102
+ return await this.tableMetaService.getPrimaryKeyColumns(query);
103
+ }
104
+
101
105
  async getAllTableInfos(query: ITableNamesQuery, options?: ITableNamesOptions): Promise<ITableListResult> {
102
106
  return await this.tableMetaService.getAllTableInfos(query, options);
103
107
  }
@@ -109,6 +113,10 @@ class CurdProServiceHub implements ICurdProServiceHub {
109
113
  async convertDataTypeByTableMeta(reqModel: RequestModel, cfgModel: RequestCfgModel): Promise<void> {
110
114
  return await this.dataTypeConvertService.convertDataTypeByTableMeta(reqModel, cfgModel);
111
115
  }
116
+
117
+ async convertConditionTypeByTableMeta(reqModel: RequestModel, cfgModel: RequestCfgModel): Promise<void> {
118
+ return await this.dataTypeConvertService.convertConditionTypeByTableMeta(reqModel, cfgModel);
119
+ }
112
120
  }
113
121
 
114
122
  export { CurdProServiceHub };