@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.
- package/build-info.json +2 -2
- package/cli/consumer-deploy.js +1 -1
- package/cli/consumer.js +1 -1
- package/generators/cli/fast-track.js +963 -0
- package/generators/cli/payload/sync.js +18 -2
- package/generators/lib/dbschema-kit/connection.js +17 -2
- package/generators/lib/migrate/field-type-resolver.js +18 -5
- package/generators/lib/payload/payload-runner.js +724 -39
- package/generators/lib/templates/dashboard-catalog.js +1 -1
- package/generators/lib/templates/db-connection-env.js +1 -1
- package/generators/lib/templates/dbschema-catalog.js +1 -1
- package/generators/lib/templates/field-validation-catalog.js +1 -1
- package/generators/lib/templates/mysql-template.js +1 -1
- package/generators/lib/templates/oracle-template.js +1 -1
- package/generators/lib/templates/postgres-template.js +1 -1
- package/generators/lib/templates/query-declarative-catalog.js +1 -1
- package/generators/lib/templates/sqlite-template.js +1 -1
- package/generators/lib/utils/database-introspector.js +4 -1
- package/integrity-manifest.json +18 -18
- package/package.json +1 -1
- package/scripts/verify-integrity.js +1 -1
- package/server.js +1 -1
- package/src/components/handlers/adjust_handler.js +1 -1
- package/src/components/handlers/audit_handler.js +1 -1
- package/src/components/handlers/delete_handler.js +1 -1
- package/src/components/handlers/export_handler.js +1 -1
- package/src/components/handlers/import_handler.js +1 -1
- package/src/components/handlers/insert_handler.js +1 -1
- package/src/components/handlers/update_handler.js +1 -1
- package/src/components/handlers/upload_handler.js +1 -1
- package/src/components/handlers/workflow_handler.js +1 -1
- package/src/components/integrations/webhook.js +1 -1
- package/src/consumers/baseConsumer.js +1 -1
- package/src/consumers/declarativeMapper.js +1 -1
- package/src/consumers/handlers/apiHandler.js +1 -1
- package/src/consumers/handlers/consoleHandler.js +1 -1
- package/src/consumers/handlers/databaseHandler.js +1 -1
- package/src/consumers/handlers/index.js +1 -1
- package/src/consumers/handlers/kafkaHandler.js +1 -1
- package/src/consumers/index.js +1 -1
- package/src/consumers/messageTransformer.js +1 -1
- package/src/consumers/validator.js +1 -1
- package/src/core/db/dialect/base-dialect.js +1 -1
- package/src/core/db/dialect/index.js +1 -1
- package/src/core/db/dialect/mysql-dialect.js +1 -1
- package/src/core/db/dialect/oracle-dialect.js +1 -1
- package/src/core/db/dialect/postgres-dialect.js +1 -1
- package/src/core/db/dialect/sqlite-dialect.js +1 -1
- package/src/core/db/flatten-helper.js +1 -1
- package/src/core/db/query-builder-error.js +1 -1
- package/src/core/db/query-builder.js +1 -1
- package/src/core/db/relation-helper.js +1 -1
- package/src/core/handlers/delete_handler.js +1 -1
- package/src/core/handlers/insert_handler.js +1 -1
- package/src/core/handlers/update_handler.js +1 -1
- package/src/core/models/base-model.js +1 -1
- package/src/core/utils/cache-manager.js +1 -1
- package/src/core/utils/component-engine.js +1 -1
- package/src/core/utils/context-builder.js +1 -1
- package/src/core/utils/datetime-formatter.js +1 -1
- package/src/core/utils/datetime-parser.js +1 -1
- package/src/core/utils/db.js +1 -1
- package/src/core/utils/logger.js +1 -1
- package/src/core/utils/payload-loader.js +1 -1
- package/src/core/utils/security-checks.js +1 -1
- package/src/middleware/body-options.js +1 -1
- package/src/middleware/cors.js +1 -1
- package/src/middleware/idempotency.js +1 -1
- package/src/middleware/rate-limiter.js +1 -1
- package/src/middleware/request-logger.js +1 -1
- package/src/middleware/security-headers.js +1 -1
- package/src/models/base-model-mysql.js +1 -1
- package/src/models/base-model-oracle.js +1 -1
- package/src/models/base-model-sqlite.js +1 -1
- package/src/models/base-model.js +1 -1
- package/src/pro/caching/redis-client.js +1 -1
- package/src/pro/caching/redis-helper.js +1 -1
- package/src/pro/consumers/baseConsumer.js +1 -1
- package/src/pro/consumers/declarativeMapper.js +1 -1
- package/src/pro/consumers/handlers/apiHandler.js +1 -1
- package/src/pro/consumers/handlers/consoleHandler.js +1 -1
- package/src/pro/consumers/handlers/databaseHandler.js +1 -1
- package/src/pro/consumers/handlers/index.js +1 -1
- package/src/pro/consumers/handlers/kafkaHandler.js +1 -1
- package/src/pro/consumers/index.js +1 -1
- package/src/pro/consumers/messageTransformer.js +1 -1
- package/src/pro/consumers/validator.js +1 -1
- package/src/pro/database/base-model-mysql.js +1 -1
- package/src/pro/database/base-model-oracle.js +1 -1
- package/src/pro/database/base-model-sqlite.js +1 -1
- package/src/pro/database/db-mysql.js +1 -1
- package/src/pro/database/db-oracle.js +1 -1
- package/src/pro/database/db-sqlite.js +1 -1
- package/src/pro/excel/excel-generator.js +1 -1
- package/src/pro/excel/excel-parser.js +1 -1
- package/src/pro/excel/export-service.js +1 -1
- package/src/pro/excel/export_handler.js +1 -1
- package/src/pro/excel/import-service.js +1 -1
- package/src/pro/excel/import-validator.js +1 -1
- package/src/pro/excel/import_handler.js +1 -1
- package/src/pro/excel/upsert-builder.js +1 -1
- package/src/pro/idgen/idgen-routes.js +1 -1
- package/src/pro/integrations/lookup-resolver.js +1 -1
- package/src/pro/integrations/upload-handler-v2.js +1 -1
- package/src/pro/integrations/upload-handler.js +1 -1
- package/src/pro/integrations/webhook.js +1 -1
- package/src/pro/locking/lock-routes.js +1 -1
- package/src/pro/locking/resource-lock-manager.js +1 -1
- package/src/pro/messaging/kafkaConsumerService.js +1 -1
- package/src/pro/messaging/kafkaService.js +1 -1
- package/src/pro/messaging/messagehubService.js +1 -1
- package/src/pro/messaging/rabbitmqService.js +1 -1
- package/src/pro/scheduler/job-manager.js +1 -1
- package/src/pro/scheduler/job-routes.js +1 -1
- package/src/pro/scheduler/job-validator.js +1 -1
- package/src/pro/storage/base-storage-provider.js +1 -1
- package/src/pro/storage/file-metadata-helper.js +1 -1
- package/src/pro/storage/index.js +1 -1
- package/src/pro/storage/local-storage-provider.js +1 -1
- package/src/pro/storage/s3-storage-provider.js +1 -1
- package/src/pro/storage/upload-cleanup-job.js +1 -1
- package/src/pro/storage/upload-cleanup-scheduler.js +1 -1
- package/src/pro/storage/upload-pending-tracker.js +1 -1
- package/src/pro/websocket/broadcast-helper.js +1 -1
- package/src/pro/websocket/index.js +1 -1
- package/src/pro/websocket/livesync-server.js +1 -1
- package/src/pro/websocket/ws-broadcaster.js +1 -1
- package/src/services/export-service.js +1 -1
- package/src/services/import-service.js +1 -1
- package/src/services/kafkaConsumerService.js +1 -1
- package/src/services/kafkaService.js +1 -1
- package/src/services/messagehubService.js +1 -1
- package/src/services/rabbitmqService.js +1 -1
- package/src/utils/cache-invalidation-registry.js +1 -1
- package/src/utils/cache-manager.js +1 -1
- package/src/utils/component-engine.js +1 -1
- package/src/utils/config-extractor.js +1 -1
- package/src/utils/consumerLogger.js +1 -1
- package/src/utils/context-builder.js +1 -1
- package/src/utils/dashboard-helpers.js +1 -1
- package/src/utils/dateHelper.js +1 -1
- package/src/utils/datetime-formatter.js +1 -1
- package/src/utils/datetime-parser.js +1 -1
- package/src/utils/db-bootstrap.js +1 -1
- package/src/utils/db-mysql.js +1 -1
- package/src/utils/db-oracle.js +1 -1
- package/src/utils/db-sqlite.js +1 -1
- package/src/utils/db.js +1 -1
- package/src/utils/demo-generator.js +1 -1
- package/src/utils/excel-generator.js +1 -1
- package/src/utils/excel-parser.js +1 -1
- package/src/utils/file-watcher.js +1 -1
- package/src/utils/id-generator.js +1 -1
- package/src/utils/idempotency-manager.js +1 -1
- package/src/utils/import-validator.js +1 -1
- package/src/utils/license-client.js +1 -1
- package/src/utils/lock-manager.js +1 -1
- package/src/utils/logger.js +1 -1
- package/src/utils/lookup-resolver.js +1 -1
- package/src/utils/payload-loader.js +1 -1
- package/src/utils/processor-response.js +1 -1
- package/src/utils/rabbitmq.js +1 -1
- package/src/utils/redis-client.js +1 -1
- package/src/utils/redis-helper.js +1 -1
- package/src/utils/request-scope.js +1 -1
- package/src/utils/security-checks.js +1 -1
- package/src/utils/service-resolver.js +1 -1
- package/src/utils/shutdown-coordinator.js +1 -1
- package/src/utils/trusted-keys.js +1 -1
- package/src/utils/upload-handler.js +1 -1
- package/src/utils/upsert-builder.js +1 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
332
|
+
defaultValue: extractDefault(constraints),
|
|
320
333
|
extra
|
|
321
334
|
};
|
|
322
335
|
}
|