@restforgejs/platform 5.0.8 → 5.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 (172) hide show
  1. package/build-info.json +2 -2
  2. package/cli/consumer-deploy.js +1 -1
  3. package/cli/consumer.js +1 -1
  4. package/generators/cli/fast-track.js +963 -0
  5. package/generators/cli/payload/sync.js +18 -2
  6. package/generators/lib/dbschema-kit/connection.js +17 -2
  7. package/generators/lib/migrate/field-type-resolver.js +18 -5
  8. package/generators/lib/payload/payload-runner.js +724 -39
  9. package/generators/lib/templates/dashboard-catalog.js +1 -1
  10. package/generators/lib/templates/db-connection-env.js +1 -1
  11. package/generators/lib/templates/dbschema-catalog.js +1 -1
  12. package/generators/lib/templates/field-validation-catalog.js +1 -1
  13. package/generators/lib/templates/mysql-template.js +1 -1
  14. package/generators/lib/templates/oracle-template.js +1 -1
  15. package/generators/lib/templates/postgres-template.js +1 -1
  16. package/generators/lib/templates/query-declarative-catalog.js +1 -1
  17. package/generators/lib/templates/sqlite-template.js +1 -1
  18. package/generators/lib/utils/database-introspector.js +4 -1
  19. package/integrity-manifest.json +18 -18
  20. package/package.json +1 -1
  21. package/scripts/verify-integrity.js +1 -1
  22. package/server.js +1 -1
  23. package/src/components/handlers/adjust_handler.js +1 -1
  24. package/src/components/handlers/audit_handler.js +1 -1
  25. package/src/components/handlers/delete_handler.js +1 -1
  26. package/src/components/handlers/export_handler.js +1 -1
  27. package/src/components/handlers/import_handler.js +1 -1
  28. package/src/components/handlers/insert_handler.js +1 -1
  29. package/src/components/handlers/update_handler.js +1 -1
  30. package/src/components/handlers/upload_handler.js +1 -1
  31. package/src/components/handlers/workflow_handler.js +1 -1
  32. package/src/components/integrations/webhook.js +1 -1
  33. package/src/consumers/baseConsumer.js +1 -1
  34. package/src/consumers/declarativeMapper.js +1 -1
  35. package/src/consumers/handlers/apiHandler.js +1 -1
  36. package/src/consumers/handlers/consoleHandler.js +1 -1
  37. package/src/consumers/handlers/databaseHandler.js +1 -1
  38. package/src/consumers/handlers/index.js +1 -1
  39. package/src/consumers/handlers/kafkaHandler.js +1 -1
  40. package/src/consumers/index.js +1 -1
  41. package/src/consumers/messageTransformer.js +1 -1
  42. package/src/consumers/validator.js +1 -1
  43. package/src/core/db/dialect/base-dialect.js +1 -1
  44. package/src/core/db/dialect/index.js +1 -1
  45. package/src/core/db/dialect/mysql-dialect.js +1 -1
  46. package/src/core/db/dialect/oracle-dialect.js +1 -1
  47. package/src/core/db/dialect/postgres-dialect.js +1 -1
  48. package/src/core/db/dialect/sqlite-dialect.js +1 -1
  49. package/src/core/db/flatten-helper.js +1 -1
  50. package/src/core/db/query-builder-error.js +1 -1
  51. package/src/core/db/query-builder.js +1 -1
  52. package/src/core/db/relation-helper.js +1 -1
  53. package/src/core/handlers/delete_handler.js +1 -1
  54. package/src/core/handlers/insert_handler.js +1 -1
  55. package/src/core/handlers/update_handler.js +1 -1
  56. package/src/core/models/base-model.js +1 -1
  57. package/src/core/utils/cache-manager.js +1 -1
  58. package/src/core/utils/component-engine.js +1 -1
  59. package/src/core/utils/context-builder.js +1 -1
  60. package/src/core/utils/datetime-formatter.js +1 -1
  61. package/src/core/utils/datetime-parser.js +1 -1
  62. package/src/core/utils/db.js +1 -1
  63. package/src/core/utils/logger.js +1 -1
  64. package/src/core/utils/payload-loader.js +1 -1
  65. package/src/core/utils/security-checks.js +1 -1
  66. package/src/middleware/body-options.js +1 -1
  67. package/src/middleware/cors.js +1 -1
  68. package/src/middleware/idempotency.js +1 -1
  69. package/src/middleware/rate-limiter.js +1 -1
  70. package/src/middleware/request-logger.js +1 -1
  71. package/src/middleware/security-headers.js +1 -1
  72. package/src/models/base-model-mysql.js +1 -1
  73. package/src/models/base-model-oracle.js +1 -1
  74. package/src/models/base-model-sqlite.js +1 -1
  75. package/src/models/base-model.js +1 -1
  76. package/src/pro/caching/redis-client.js +1 -1
  77. package/src/pro/caching/redis-helper.js +1 -1
  78. package/src/pro/consumers/baseConsumer.js +1 -1
  79. package/src/pro/consumers/declarativeMapper.js +1 -1
  80. package/src/pro/consumers/handlers/apiHandler.js +1 -1
  81. package/src/pro/consumers/handlers/consoleHandler.js +1 -1
  82. package/src/pro/consumers/handlers/databaseHandler.js +1 -1
  83. package/src/pro/consumers/handlers/index.js +1 -1
  84. package/src/pro/consumers/handlers/kafkaHandler.js +1 -1
  85. package/src/pro/consumers/index.js +1 -1
  86. package/src/pro/consumers/messageTransformer.js +1 -1
  87. package/src/pro/consumers/validator.js +1 -1
  88. package/src/pro/database/base-model-mysql.js +1 -1
  89. package/src/pro/database/base-model-oracle.js +1 -1
  90. package/src/pro/database/base-model-sqlite.js +1 -1
  91. package/src/pro/database/db-mysql.js +1 -1
  92. package/src/pro/database/db-oracle.js +1 -1
  93. package/src/pro/database/db-sqlite.js +1 -1
  94. package/src/pro/excel/excel-generator.js +1 -1
  95. package/src/pro/excel/excel-parser.js +1 -1
  96. package/src/pro/excel/export-service.js +1 -1
  97. package/src/pro/excel/export_handler.js +1 -1
  98. package/src/pro/excel/import-service.js +1 -1
  99. package/src/pro/excel/import-validator.js +1 -1
  100. package/src/pro/excel/import_handler.js +1 -1
  101. package/src/pro/excel/upsert-builder.js +1 -1
  102. package/src/pro/idgen/idgen-routes.js +1 -1
  103. package/src/pro/integrations/lookup-resolver.js +1 -1
  104. package/src/pro/integrations/upload-handler-v2.js +1 -1
  105. package/src/pro/integrations/upload-handler.js +1 -1
  106. package/src/pro/integrations/webhook.js +1 -1
  107. package/src/pro/locking/lock-routes.js +1 -1
  108. package/src/pro/locking/resource-lock-manager.js +1 -1
  109. package/src/pro/messaging/kafkaConsumerService.js +1 -1
  110. package/src/pro/messaging/kafkaService.js +1 -1
  111. package/src/pro/messaging/messagehubService.js +1 -1
  112. package/src/pro/messaging/rabbitmqService.js +1 -1
  113. package/src/pro/scheduler/job-manager.js +1 -1
  114. package/src/pro/scheduler/job-routes.js +1 -1
  115. package/src/pro/scheduler/job-validator.js +1 -1
  116. package/src/pro/storage/base-storage-provider.js +1 -1
  117. package/src/pro/storage/file-metadata-helper.js +1 -1
  118. package/src/pro/storage/index.js +1 -1
  119. package/src/pro/storage/local-storage-provider.js +1 -1
  120. package/src/pro/storage/s3-storage-provider.js +1 -1
  121. package/src/pro/storage/upload-cleanup-job.js +1 -1
  122. package/src/pro/storage/upload-cleanup-scheduler.js +1 -1
  123. package/src/pro/storage/upload-pending-tracker.js +1 -1
  124. package/src/pro/websocket/broadcast-helper.js +1 -1
  125. package/src/pro/websocket/index.js +1 -1
  126. package/src/pro/websocket/livesync-server.js +1 -1
  127. package/src/pro/websocket/ws-broadcaster.js +1 -1
  128. package/src/services/export-service.js +1 -1
  129. package/src/services/import-service.js +1 -1
  130. package/src/services/kafkaConsumerService.js +1 -1
  131. package/src/services/kafkaService.js +1 -1
  132. package/src/services/messagehubService.js +1 -1
  133. package/src/services/rabbitmqService.js +1 -1
  134. package/src/utils/cache-invalidation-registry.js +1 -1
  135. package/src/utils/cache-manager.js +1 -1
  136. package/src/utils/component-engine.js +1 -1
  137. package/src/utils/config-extractor.js +1 -1
  138. package/src/utils/consumerLogger.js +1 -1
  139. package/src/utils/context-builder.js +1 -1
  140. package/src/utils/dashboard-helpers.js +1 -1
  141. package/src/utils/dateHelper.js +1 -1
  142. package/src/utils/datetime-formatter.js +1 -1
  143. package/src/utils/datetime-parser.js +1 -1
  144. package/src/utils/db-bootstrap.js +1 -1
  145. package/src/utils/db-mysql.js +1 -1
  146. package/src/utils/db-oracle.js +1 -1
  147. package/src/utils/db-sqlite.js +1 -1
  148. package/src/utils/db.js +1 -1
  149. package/src/utils/demo-generator.js +1 -1
  150. package/src/utils/excel-generator.js +1 -1
  151. package/src/utils/excel-parser.js +1 -1
  152. package/src/utils/file-watcher.js +1 -1
  153. package/src/utils/id-generator.js +1 -1
  154. package/src/utils/idempotency-manager.js +1 -1
  155. package/src/utils/import-validator.js +1 -1
  156. package/src/utils/license-client.js +1 -1
  157. package/src/utils/lock-manager.js +1 -1
  158. package/src/utils/logger.js +1 -1
  159. package/src/utils/lookup-resolver.js +1 -1
  160. package/src/utils/payload-loader.js +1 -1
  161. package/src/utils/processor-response.js +1 -1
  162. package/src/utils/rabbitmq.js +1 -1
  163. package/src/utils/redis-client.js +1 -1
  164. package/src/utils/redis-helper.js +1 -1
  165. package/src/utils/request-scope.js +1 -1
  166. package/src/utils/security-checks.js +1 -1
  167. package/src/utils/service-resolver.js +1 -1
  168. package/src/utils/shutdown-coordinator.js +1 -1
  169. package/src/utils/trusted-keys.js +1 -1
  170. package/src/utils/upload-handler.js +1 -1
  171. package/src/utils/upsert-builder.js +1 -1
  172. package/src/utils/workflow-hook-executor.js +1 -1
@@ -30,18 +30,34 @@ module.exports = {
30
30
  required: false,
31
31
  default: null,
32
32
  description: 'Sync hanya satu tabel spesifik (default: semua)'
33
+ },
34
+ 'expand-fk': {
35
+ type: 'boolean',
36
+ required: false,
37
+ default: false,
38
+ description: 'Generate konfigurasi JOIN dari foreign key: buat file SQL query/<table>-join.sql dan set datatablesQuery/viewQuery ke file tersebut. Opt-in; tanpa flag ini perilaku sync tidak berubah. Butuh --table. Bila --fk-columns tidak diisi, kolom display per FK dipilih otomatis (name/nama -> code/kode -> primary key)'
39
+ },
40
+ 'fk-columns': {
41
+ type: 'string',
42
+ required: false,
43
+ default: null,
44
+ description: 'Opsional. Daftar kolom tabel referensi yang di-surface lewat JOIN. Setiap entri WAJIB berbentuk `table.column` (qualified), dipisah koma. Contoh: visitor_categories.category_code,visitor_categories.category_name. Bila dikosongkan, di-resolve otomatis per FK'
33
45
  }
34
46
  },
35
47
  examples: [
36
48
  'npx restforge payload sync --config=db.env',
37
- 'npx restforge payload sync --config=db.env --table=users'
49
+ 'npx restforge payload sync --config=db.env --table=users',
50
+ 'npx restforge payload sync --table=visitors --expand-fk',
51
+ 'npx restforge payload sync --table=visitors --expand-fk --fk-columns=visitor_categories.category_code,visitor_categories.category_name'
38
52
  ],
39
53
  async handler(args) {
40
54
  const generator = new PayloadGenerator();
41
55
  await generator.run({
42
56
  config: args.config,
43
57
  table: args.table || null,
44
- sync: true
58
+ sync: true,
59
+ expandFk: args['expand-fk'] === true,
60
+ fkColumns: args['fk-columns'] || null
45
61
  });
46
62
  }
47
63
  };
@@ -14,7 +14,10 @@ const DB_TYPE_TO_DIALECT = {
14
14
  const REQUIRED_FIELDS = {
15
15
  postgresql: ['DB_HOST', 'DB_PORT', 'DB_NAME', 'DB_USER', 'DB_PASSWORD'],
16
16
  mysql: ['DB_HOST', 'DB_PORT', 'DB_NAME', 'DB_USER', 'DB_PASSWORD'],
17
- oracle: ['DB_HOST', 'DB_PORT', 'DB_SERVICE_NAME', 'DB_USER', 'DB_PASSWORD'],
17
+ // Oracle: service name dicek terpisah di bawah karena boleh DB_SERVICE_NAME
18
+ // ATAU DB_NAME (selaras dengan runtime + introspector legacy yang memakai
19
+ // DB_NAME sebagai service name pada connect string //host:port/<service>).
20
+ oracle: ['DB_HOST', 'DB_PORT', 'DB_USER', 'DB_PASSWORD'],
18
21
  sqlite: ['DB_FILE']
19
22
  };
20
23
 
@@ -85,6 +88,13 @@ function loadConfig(filePath) {
85
88
  );
86
89
  }
87
90
 
91
+ // Oracle service name boleh datang dari DB_SERVICE_NAME atau DB_NAME.
92
+ if (dbType === 'oracle' && !raw.DB_SERVICE_NAME && !raw.DB_NAME) {
93
+ throw new Error(
94
+ `Config file '${filePath}' missing required fields for oracle: DB_SERVICE_NAME (atau DB_NAME)`
95
+ );
96
+ }
97
+
88
98
  const dialect = DB_TYPE_TO_DIALECT[dbType];
89
99
  const config = { dialect };
90
100
 
@@ -101,7 +111,12 @@ function loadConfig(filePath) {
101
111
  if (raw.DB_NAME !== undefined) config.database = raw.DB_NAME;
102
112
  if (raw.DB_USER !== undefined) config.user = raw.DB_USER;
103
113
  if (raw.DB_PASSWORD !== undefined) config.password = raw.DB_PASSWORD;
104
- if (raw.DB_SERVICE_NAME !== undefined) config.serviceName = raw.DB_SERVICE_NAME;
114
+ // serviceName: utamakan DB_SERVICE_NAME, fallback ke DB_NAME (Oracle).
115
+ if (raw.DB_SERVICE_NAME !== undefined) {
116
+ config.serviceName = raw.DB_SERVICE_NAME;
117
+ } else if (dbType === 'oracle' && raw.DB_NAME !== undefined) {
118
+ config.serviceName = raw.DB_NAME;
119
+ }
105
120
  if (raw.DB_FILE !== undefined) config.file = raw.DB_FILE;
106
121
 
107
122
  return config;
@@ -24,6 +24,19 @@ const AUDIT_FIELDS = ['created_at', 'created_by', 'updated_at', 'updated_by'];
24
24
  const TEXTAREA_FIELDS = ['address', 'description', 'notes'];
25
25
  const TEXTAREA_PREFIXES = ['remark'];
26
26
 
27
+ // Tipe numerik kanonik RDF (lihat handbook catalogs/rdf/field-validation.md).
28
+ // Ketiganya dipetakan ke form input `number` di UDF.
29
+ const NUMERIC_TYPES = ['integer', 'decimal', 'number'];
30
+
31
+ // Mengambil nilai `constraints.default` apa adanya bila ada. Constraint `default`
32
+ // berlaku universal untuk semua tipe field (handbook field-validation.md), sehingga
33
+ // nilai default dari SDF/RDF harus terbawa ke `defaultValue` UDF.
34
+ function extractDefault(constraints) {
35
+ return Object.prototype.hasOwnProperty.call(constraints, 'default')
36
+ ? constraints.default
37
+ : undefined;
38
+ }
39
+
27
40
  const CHECKBOX_TEXT_DEFAULT = { checked: 'Yes', unchecked: 'No' };
28
41
  const CHECKBOX_TEXT_MAP = {
29
42
  is_active: { checked: 'Active', unchecked: 'Inactive' },
@@ -202,8 +215,8 @@ class FieldTypeResolver {
202
215
  };
203
216
  }
204
217
 
205
- // Rule 4: Number
206
- if (valType === 'number') {
218
+ // Rule 4: Number (integer / decimal / number)
219
+ if (NUMERIC_TYPES.includes(valType)) {
207
220
  const extra = {};
208
221
  for (const key of ['min', 'max', 'step']) {
209
222
  if (Object.prototype.hasOwnProperty.call(constraints, key)) {
@@ -219,7 +232,7 @@ class FieldTypeResolver {
219
232
  inTable,
220
233
  tableOrder,
221
234
  tableField: null,
222
- defaultValue: undefined,
235
+ defaultValue: extractDefault(constraints),
223
236
  extra
224
237
  };
225
238
  }
@@ -293,7 +306,7 @@ class FieldTypeResolver {
293
306
  inTable,
294
307
  tableOrder,
295
308
  tableField: null,
296
- defaultValue: undefined,
309
+ defaultValue: extractDefault(constraints),
297
310
  extra: { rows: 3, maxlength: maxlen }
298
311
  };
299
312
  }
@@ -316,7 +329,7 @@ class FieldTypeResolver {
316
329
  inTable,
317
330
  tableOrder,
318
331
  tableField: null,
319
- defaultValue: undefined,
332
+ defaultValue: extractDefault(constraints),
320
333
  extra
321
334
  };
322
335
  }