@ruiapp/rapid-core 0.9.7 → 0.9.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 (198) hide show
  1. package/CHANGELOG.md +11 -11
  2. package/dist/helpers/entityHelper.d.ts +2 -2
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +163 -53
  5. package/dist/utilities/fsUtility.d.ts +8 -0
  6. package/package.json +1 -1
  7. package/rollup.config.js +16 -16
  8. package/src/bootstrapApplicationConfig.ts +782 -782
  9. package/src/core/actionHandler.ts +23 -23
  10. package/src/core/eventManager.ts +20 -20
  11. package/src/core/facility.ts +7 -7
  12. package/src/core/http/formDataParser.ts +89 -89
  13. package/src/core/http-types.ts +4 -4
  14. package/src/core/pluginManager.ts +193 -193
  15. package/src/core/providers/runtimeProvider.ts +5 -5
  16. package/src/core/request.ts +96 -96
  17. package/src/core/response.ts +79 -79
  18. package/src/core/routeContext.ts +127 -127
  19. package/src/core/routes/healthz.ts +20 -20
  20. package/src/core/routes/index.ts +3 -3
  21. package/src/core/routesBuilder.ts +110 -110
  22. package/src/core/server.ts +156 -156
  23. package/src/dataAccess/columnTypeMapper.ts +22 -22
  24. package/src/dataAccess/dataAccessTypes.ts +165 -165
  25. package/src/dataAccess/dataAccessor.ts +135 -135
  26. package/src/dataAccess/entityManager.ts +1932 -1932
  27. package/src/dataAccess/entityMapper.ts +111 -111
  28. package/src/dataAccess/entityValidator.ts +33 -33
  29. package/src/dataAccess/propertyMapper.ts +28 -28
  30. package/src/deno-std/assert/assert.ts +9 -9
  31. package/src/deno-std/assert/assertion_error.ts +7 -7
  32. package/src/deno-std/datetime/to_imf.ts +32 -32
  33. package/src/deno-std/encoding/base64.ts +141 -141
  34. package/src/deno-std/http/cookie.ts +372 -372
  35. package/src/facilities/cache/CacheFacilityTypes.ts +29 -29
  36. package/src/facilities/cache/CacheFactory.ts +31 -31
  37. package/src/facilities/cache/MemoryCache.ts +58 -58
  38. package/src/facilities/cache/MemoryCacheProvider.ts +15 -15
  39. package/src/facilities/log/LogFacility.ts +35 -35
  40. package/src/helpers/entityHelper.ts +89 -76
  41. package/src/helpers/filterHelper.ts +148 -148
  42. package/src/helpers/inputHelper.ts +11 -11
  43. package/src/helpers/licenseHelper.ts +29 -29
  44. package/src/helpers/metaHelper.ts +111 -111
  45. package/src/helpers/runCollectionEntityActionHandler.ts +58 -58
  46. package/src/index.ts +82 -81
  47. package/src/plugins/auth/AuthPlugin.ts +103 -103
  48. package/src/plugins/auth/AuthPluginTypes.ts +11 -11
  49. package/src/plugins/auth/actionHandlers/changePassword.ts +61 -61
  50. package/src/plugins/auth/actionHandlers/createSession.ts +68 -68
  51. package/src/plugins/auth/actionHandlers/deleteSession.ts +18 -18
  52. package/src/plugins/auth/actionHandlers/getMyProfile.ts +38 -38
  53. package/src/plugins/auth/actionHandlers/index.ts +8 -8
  54. package/src/plugins/auth/actionHandlers/resetPassword.ts +45 -45
  55. package/src/plugins/auth/models/AccessToken.ts +56 -56
  56. package/src/plugins/auth/models/index.ts +3 -3
  57. package/src/plugins/auth/routes/changePassword.ts +15 -15
  58. package/src/plugins/auth/routes/getMyProfile.ts +15 -15
  59. package/src/plugins/auth/routes/index.ts +7 -7
  60. package/src/plugins/auth/routes/resetPassword.ts +15 -15
  61. package/src/plugins/auth/routes/signin.ts +15 -15
  62. package/src/plugins/auth/routes/signout.ts +15 -15
  63. package/src/plugins/auth/services/AuthService.ts +39 -39
  64. package/src/plugins/cronJob/CronJobPlugin.ts +104 -104
  65. package/src/plugins/cronJob/CronJobPluginTypes.ts +44 -44
  66. package/src/plugins/cronJob/actionHandlers/index.ts +4 -4
  67. package/src/plugins/cronJob/actionHandlers/runCronJob.ts +32 -32
  68. package/src/plugins/cronJob/entityWatchers/cronJobEntityWatchers.ts +24 -24
  69. package/src/plugins/cronJob/entityWatchers/index.ts +4 -4
  70. package/src/plugins/cronJob/models/CronJob.ts +129 -129
  71. package/src/plugins/cronJob/models/index.ts +3 -3
  72. package/src/plugins/cronJob/routes/index.ts +3 -3
  73. package/src/plugins/cronJob/routes/runCronJob.ts +15 -15
  74. package/src/plugins/cronJob/services/CronJobService.ts +252 -252
  75. package/src/plugins/dataManage/DataManagePlugin.ts +163 -163
  76. package/src/plugins/dataManage/actionHandlers/addEntityRelations.ts +15 -15
  77. package/src/plugins/dataManage/actionHandlers/countCollectionEntities.ts +17 -17
  78. package/src/plugins/dataManage/actionHandlers/createCollectionEntitiesBatch.ts +81 -81
  79. package/src/plugins/dataManage/actionHandlers/createCollectionEntity.ts +20 -20
  80. package/src/plugins/dataManage/actionHandlers/deleteCollectionEntities.ts +45 -45
  81. package/src/plugins/dataManage/actionHandlers/deleteCollectionEntityById.ts +20 -20
  82. package/src/plugins/dataManage/actionHandlers/findCollectionEntities.ts +27 -27
  83. package/src/plugins/dataManage/actionHandlers/findCollectionEntityById.ts +30 -30
  84. package/src/plugins/dataManage/actionHandlers/queryDatabase.ts +22 -22
  85. package/src/plugins/dataManage/actionHandlers/removeEntityRelations.ts +15 -15
  86. package/src/plugins/dataManage/actionHandlers/updateCollectionEntityById.ts +38 -38
  87. package/src/plugins/entityAccessControl/EntityAccessControlPlugin.ts +146 -146
  88. package/src/plugins/fileManage/FileManagePlugin.ts +52 -52
  89. package/src/plugins/fileManage/actionHandlers/downloadDocument.ts +65 -65
  90. package/src/plugins/fileManage/actionHandlers/downloadFile.ts +44 -44
  91. package/src/plugins/fileManage/actionHandlers/uploadFile.ts +33 -33
  92. package/src/plugins/fileManage/routes/downloadDocument.ts +15 -15
  93. package/src/plugins/fileManage/routes/downloadFile.ts +15 -15
  94. package/src/plugins/fileManage/routes/index.ts +5 -5
  95. package/src/plugins/fileManage/routes/uploadFile.ts +15 -15
  96. package/src/plugins/license/LicensePlugin.ts +79 -79
  97. package/src/plugins/license/LicensePluginTypes.ts +95 -95
  98. package/src/plugins/license/LicenseService.ts +137 -137
  99. package/src/plugins/license/actionHandlers/getLicense.ts +18 -18
  100. package/src/plugins/license/actionHandlers/index.ts +5 -5
  101. package/src/plugins/license/actionHandlers/updateLicense.ts +24 -24
  102. package/src/plugins/license/helpers/certHelper.ts +21 -21
  103. package/src/plugins/license/helpers/cryptoHelper.ts +47 -47
  104. package/src/plugins/license/models/index.ts +1 -1
  105. package/src/plugins/license/routes/getLicense.ts +15 -15
  106. package/src/plugins/license/routes/index.ts +4 -4
  107. package/src/plugins/license/routes/updateLicense.ts +15 -15
  108. package/src/plugins/mail/MailPlugin.ts +74 -74
  109. package/src/plugins/mail/MailPluginTypes.ts +27 -27
  110. package/src/plugins/mail/MailService.ts +38 -38
  111. package/src/plugins/mail/actionHandlers/index.ts +3 -3
  112. package/src/plugins/mail/models/index.ts +1 -1
  113. package/src/plugins/mail/routes/index.ts +1 -1
  114. package/src/plugins/metaManage/MetaManagePlugin.ts +198 -198
  115. package/src/plugins/metaManage/actionHandlers/getMetaModelDetail.ts +10 -10
  116. package/src/plugins/metaManage/actionHandlers/listMetaModels.ts +9 -9
  117. package/src/plugins/metaManage/actionHandlers/listMetaRoutes.ts +9 -9
  118. package/src/plugins/metaManage/services/MetaService.ts +376 -376
  119. package/src/plugins/notification/NotificationPlugin.ts +68 -68
  120. package/src/plugins/notification/NotificationPluginTypes.ts +13 -13
  121. package/src/plugins/notification/NotificationService.ts +25 -25
  122. package/src/plugins/notification/actionHandlers/index.ts +3 -3
  123. package/src/plugins/notification/models/Notification.ts +60 -60
  124. package/src/plugins/notification/models/index.ts +3 -3
  125. package/src/plugins/notification/routes/index.ts +1 -1
  126. package/src/plugins/routeManage/RouteManagePlugin.ts +64 -64
  127. package/src/plugins/routeManage/actionHandlers/httpProxy.ts +13 -13
  128. package/src/plugins/routeManage/actionHandlers/mock.ts +28 -28
  129. package/src/plugins/sequence/SequencePlugin.ts +146 -146
  130. package/src/plugins/sequence/SequencePluginTypes.ts +69 -69
  131. package/src/plugins/sequence/SequenceService.ts +92 -92
  132. package/src/plugins/sequence/actionHandlers/generateSn.ts +32 -32
  133. package/src/plugins/sequence/actionHandlers/index.ts +4 -4
  134. package/src/plugins/sequence/models/SequenceAutoIncrementRecord.ts +49 -49
  135. package/src/plugins/sequence/models/SequenceRule.ts +42 -42
  136. package/src/plugins/sequence/models/index.ts +4 -4
  137. package/src/plugins/sequence/routes/generateSn.ts +15 -15
  138. package/src/plugins/sequence/routes/index.ts +3 -3
  139. package/src/plugins/sequence/segment-utility.ts +11 -11
  140. package/src/plugins/sequence/segments/autoIncrement.ts +90 -90
  141. package/src/plugins/sequence/segments/dayOfMonth.ts +19 -19
  142. package/src/plugins/sequence/segments/index.ts +9 -9
  143. package/src/plugins/sequence/segments/literal.ts +16 -16
  144. package/src/plugins/sequence/segments/month.ts +19 -19
  145. package/src/plugins/sequence/segments/parameter.ts +20 -20
  146. package/src/plugins/sequence/segments/year.ts +19 -19
  147. package/src/plugins/serverOperation/ServerOperationPlugin.ts +91 -91
  148. package/src/plugins/serverOperation/ServerOperationPluginTypes.ts +15 -15
  149. package/src/plugins/serverOperation/actionHandlers/index.ts +4 -4
  150. package/src/plugins/serverOperation/actionHandlers/runServerOperation.ts +15 -15
  151. package/src/plugins/setting/SettingPlugin.ts +68 -68
  152. package/src/plugins/setting/SettingPluginTypes.ts +37 -37
  153. package/src/plugins/setting/SettingService.ts +213 -213
  154. package/src/plugins/setting/actionHandlers/getSystemSettingValues.ts +30 -30
  155. package/src/plugins/setting/actionHandlers/getUserSettingValues.ts +38 -38
  156. package/src/plugins/setting/actionHandlers/index.ts +6 -6
  157. package/src/plugins/setting/actionHandlers/setSystemSettingValues.ts +30 -30
  158. package/src/plugins/setting/models/SystemSettingGroupSetting.ts +57 -57
  159. package/src/plugins/setting/models/SystemSettingItem.ts +48 -48
  160. package/src/plugins/setting/models/SystemSettingItemSetting.ts +73 -73
  161. package/src/plugins/setting/models/UserSettingGroupSetting.ts +57 -57
  162. package/src/plugins/setting/models/UserSettingItem.ts +55 -55
  163. package/src/plugins/setting/models/UserSettingItemSetting.ts +73 -73
  164. package/src/plugins/setting/models/index.ts +8 -8
  165. package/src/plugins/setting/routes/getSystemSettingValues.ts +15 -15
  166. package/src/plugins/setting/routes/getUserSettingValues.ts +15 -15
  167. package/src/plugins/setting/routes/index.ts +5 -5
  168. package/src/plugins/setting/routes/setSystemSettingValues.ts +15 -15
  169. package/src/plugins/stateMachine/StateMachinePlugin.ts +196 -196
  170. package/src/plugins/stateMachine/StateMachinePluginTypes.ts +48 -48
  171. package/src/plugins/stateMachine/actionHandlers/index.ts +4 -4
  172. package/src/plugins/stateMachine/actionHandlers/sendStateMachineEvent.ts +54 -54
  173. package/src/plugins/stateMachine/models/StateMachine.ts +42 -42
  174. package/src/plugins/stateMachine/models/index.ts +3 -3
  175. package/src/plugins/stateMachine/routes/index.ts +3 -3
  176. package/src/plugins/stateMachine/routes/sendStateMachineEvent.ts +15 -15
  177. package/src/plugins/stateMachine/stateMachineHelper.ts +36 -36
  178. package/src/plugins/webhooks/WebhooksPlugin.ts +148 -148
  179. package/src/plugins/webhooks/pluginConfig.ts +75 -75
  180. package/src/polyfill.ts +5 -5
  181. package/src/proxy/mod.ts +38 -38
  182. package/src/proxy/types.ts +21 -21
  183. package/src/queryBuilder/index.ts +1 -1
  184. package/src/queryBuilder/queryBuilder.ts +755 -755
  185. package/src/server.ts +530 -530
  186. package/src/types/cron-job-types.ts +66 -66
  187. package/src/types.ts +856 -856
  188. package/src/utilities/accessControlUtility.ts +33 -33
  189. package/src/utilities/entityUtility.ts +18 -18
  190. package/src/utilities/errorUtility.ts +15 -15
  191. package/src/utilities/fsUtility.ts +137 -61
  192. package/src/utilities/httpUtility.ts +19 -19
  193. package/src/utilities/jwtUtility.ts +26 -26
  194. package/src/utilities/passwordUtility.ts +26 -26
  195. package/src/utilities/pathUtility.ts +14 -14
  196. package/src/utilities/timeUtility.ts +17 -17
  197. package/src/utilities/typeUtility.ts +15 -15
  198. package/tsconfig.json +19 -19
package/CHANGELOG.md CHANGED
@@ -1,11 +1,11 @@
1
- # @ruiapp/rapid-core
2
-
3
- ## 0.7.0
4
-
5
- - feature: added server.registerCronJob to allow plugins register cron jobs.
6
-
7
- ## 0.2.4
8
-
9
- ### Patch Changes
10
-
11
- - 146a99d: add between filterMode, range is deprecated
1
+ # @ruiapp/rapid-core
2
+
3
+ ## 0.7.0
4
+
5
+ - feature: added server.registerCronJob to allow plugins register cron jobs.
6
+
7
+ ## 0.2.4
8
+
9
+ ### Patch Changes
10
+
11
+ - 146a99d: add between filterMode, range is deprecated
@@ -1,3 +1,3 @@
1
1
  import { IRpdServer } from "../core/server";
2
- import { RpdDataModel } from "../types";
3
- export declare function detectChangedFieldsOfEntity(server: IRpdServer, model: RpdDataModel, before: any, after: any): Record<string, any> | null;
2
+ import { RpdDataModel, UpdateEntityByIdOptions } from "../types";
3
+ export declare function detectChangedFieldsOfEntity(server: IRpdServer, model: RpdDataModel, before: any, after: any, relationPropertiesToUpdate: UpdateEntityByIdOptions["relationPropertiesToUpdate"]): Record<string, any> | null;
package/dist/index.d.ts CHANGED
@@ -13,6 +13,7 @@ export { default as EntityManager } from "./dataAccess/entityManager";
13
13
  export * from "./dataAccess/entityManager";
14
14
  export * from "./utilities/accessControlUtility";
15
15
  export * from "./utilities/entityUtility";
16
+ export * from "./utilities/fsUtility";
16
17
  export * from "./utilities/jwtUtility";
17
18
  export * from "./utilities/timeUtility";
18
19
  export * from "./utilities/passwordUtility";
package/dist/index.js CHANGED
@@ -7,11 +7,11 @@ var events = require('events');
7
7
  var Router = require('koa-tree-router');
8
8
  var qs = require('qs');
9
9
  var dayjs = require('dayjs');
10
+ var fs = require('fs');
11
+ var path = require('path');
10
12
  var jsonwebtoken = require('jsonwebtoken');
11
13
  var crypto = require('crypto');
12
14
  var bcrypt = require('bcryptjs');
13
- var path = require('path');
14
- var fs = require('fs');
15
15
  var uuid = require('uuid');
16
16
  var nodemailer = require('nodemailer');
17
17
  var cron = require('cron');
@@ -22,10 +22,10 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
22
22
  var Router__default = /*#__PURE__*/_interopDefaultLegacy(Router);
23
23
  var qs__default = /*#__PURE__*/_interopDefaultLegacy(qs);
24
24
  var dayjs__default = /*#__PURE__*/_interopDefaultLegacy(dayjs);
25
+ var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
26
+ var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
25
27
  var crypto__default = /*#__PURE__*/_interopDefaultLegacy(crypto);
26
28
  var bcrypt__default = /*#__PURE__*/_interopDefaultLegacy(bcrypt);
27
- var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
28
- var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
29
29
  var nodemailer__default = /*#__PURE__*/_interopDefaultLegacy(nodemailer);
30
30
 
31
31
  function fixBigIntJSONSerialize() {
@@ -2246,7 +2246,7 @@ function mapPropertyNameToColumnName(server, model, propertyName) {
2246
2246
  return property.columnName || property.code;
2247
2247
  }
2248
2248
 
2249
- function detectChangedFieldsOfEntity(server, model, before, after) {
2249
+ function detectChangedFieldsOfEntity(server, model, before, after, relationPropertiesToUpdate) {
2250
2250
  if (!before) {
2251
2251
  throw new Error("Argument 'before' can not be null.");
2252
2252
  }
@@ -2261,6 +2261,11 @@ function detectChangedFieldsOfEntity(server, model, before, after) {
2261
2261
  const afterValue = after[key];
2262
2262
  const beforeValue = before[key] || before[property.targetIdColumnName];
2263
2263
  if (afterValue) {
2264
+ if (relationPropertiesToUpdate && relationPropertiesToUpdate[property.code]) {
2265
+ changed = true;
2266
+ changes[key] = afterValue;
2267
+ continue;
2268
+ }
2264
2269
  if (lodash.isNumber(afterValue)) {
2265
2270
  if (beforeValue) {
2266
2271
  if (lodash.isNumber(beforeValue)) {
@@ -2863,8 +2868,8 @@ async function findManyRelationLinksViaLinkTable(options) {
2863
2868
  const command = `SELECT * FROM ${server.queryBuilder.quoteTable({
2864
2869
  schema: relationProperty.linkSchema,
2865
2870
  tableName: relationProperty.linkTableName,
2866
- })} WHERE ${server.queryBuilder.quoteObject(relationProperty.selfIdColumnName)} = ANY($1::int[])
2867
- ORDER BY id
2871
+ })} WHERE ${server.queryBuilder.quoteObject(relationProperty.selfIdColumnName)} = ANY($1::int[])
2872
+ ORDER BY id
2868
2873
  `;
2869
2874
  const params = [mainEntityIds];
2870
2875
  const relationLinks = await server.queryDatabaseObject(command, params, routeContext?.getDbTransactionClient());
@@ -3251,7 +3256,7 @@ async function updateEntityById(server, dataAccessor, options, plugin) {
3251
3256
  if (!entity) {
3252
3257
  throw new Error(`${model.namespace}.${model.singularCode} with id "${id}" was not found.`);
3253
3258
  }
3254
- let changes = detectChangedFieldsOfEntity(server, model, entity, entityToSave);
3259
+ let changes = detectChangedFieldsOfEntity(server, model, entity, entityToSave, options.relationPropertiesToUpdate);
3255
3260
  if (!changes && !options.operation) {
3256
3261
  return entity;
3257
3262
  }
@@ -3281,7 +3286,7 @@ async function updateEntityById(server, dataAccessor, options, plugin) {
3281
3286
  sender: plugin,
3282
3287
  routeContext: options.routeContext,
3283
3288
  });
3284
- changes = detectChangedFieldsOfEntity(server, model, entity, entityToSave);
3289
+ changes = detectChangedFieldsOfEntity(server, model, entity, entityToSave, options.relationPropertiesToUpdate);
3285
3290
  // check readonly properties
3286
3291
  Object.keys(changes).forEach((propertyName) => {
3287
3292
  let isReadonlyProperty = false;
@@ -3495,7 +3500,7 @@ async function updateEntityById(server, dataAccessor, options, plugin) {
3495
3500
  await server.queryDatabaseObject(`DELETE FROM ${server.queryBuilder.quoteTable({
3496
3501
  schema: property.linkSchema,
3497
3502
  tableName: property.linkTableName,
3498
- })} WHERE ${server.queryBuilder.quoteObject(property.selfIdColumnName)} = $1
3503
+ })} WHERE ${server.queryBuilder.quoteObject(property.selfIdColumnName)} = $1
3499
3504
  AND ${server.queryBuilder.quoteObject(property.targetIdColumnName)} <> ALL($2::int[])`, [id, targetIdsToKeep], routeContext?.getDbTransactionClient());
3500
3505
  }
3501
3506
  else {
@@ -3524,8 +3529,8 @@ async function updateEntityById(server, dataAccessor, options, plugin) {
3524
3529
  await server.queryDatabaseObject(`UPDATE ${server.queryBuilder.quoteTable({
3525
3530
  schema: relationModel.schema,
3526
3531
  tableName: relationModel.tableName,
3527
- })}
3528
- SET ${server.queryBuilder.quoteObject(property.selfIdColumnName)} = null
3532
+ })}
3533
+ SET ${server.queryBuilder.quoteObject(property.selfIdColumnName)} = null
3529
3534
  WHERE id = ANY($1::int[])`, [targetIdsToRemove], routeContext?.getDbTransactionClient());
3530
3535
  }
3531
3536
  else {
@@ -3810,7 +3815,7 @@ async function deleteEntityById(server, dataAccessor, options, plugin) {
3810
3815
  await server.queryDatabaseObject(`DELETE FROM ${server.queryBuilder.quoteTable({
3811
3816
  schema: relationProperty.linkSchema,
3812
3817
  tableName: relationProperty.linkTableName,
3813
- })}
3818
+ })}
3814
3819
  WHERE ${server.queryBuilder.quoteObject(relationProperty.selfIdColumnName)} = $1`, [id], routeContext?.getDbTransactionClient());
3815
3820
  }
3816
3821
  else {
@@ -3820,8 +3825,8 @@ async function deleteEntityById(server, dataAccessor, options, plugin) {
3820
3825
  await server.queryDatabaseObject(`UPDATE ${server.queryBuilder.quoteTable({
3821
3826
  schema: relationModel.schema,
3822
3827
  tableName: relationModel.tableName,
3823
- })}
3824
- SET ${server.queryBuilder.quoteObject(relationProperty.selfIdColumnName)} = null
3828
+ })}
3829
+ SET ${server.queryBuilder.quoteObject(relationProperty.selfIdColumnName)} = null
3825
3830
  WHERE ${server.queryBuilder.quoteObject(relationProperty.selfIdColumnName)} = $1`, [id], routeContext?.getDbTransactionClient());
3826
3831
  }
3827
3832
  }
@@ -3918,11 +3923,11 @@ class EntityManager {
3918
3923
  const command = `INSERT INTO ${queryBuilder.quoteTable({
3919
3924
  schema: relationProperty.linkSchema,
3920
3925
  tableName: relationProperty.linkTableName,
3921
- })} (${queryBuilder.quoteObject(relationProperty.selfIdColumnName)}, ${queryBuilder.quoteObject(relationProperty.targetIdColumnName)})
3922
- SELECT $1, $2 WHERE NOT EXISTS (
3923
- SELECT ${queryBuilder.quoteObject(relationProperty.selfIdColumnName)}, ${queryBuilder.quoteObject(relationProperty.targetIdColumnName)}
3924
- FROM ${queryBuilder.quoteTable({ schema: relationProperty.linkSchema, tableName: relationProperty.linkTableName })}
3925
- WHERE ${queryBuilder.quoteObject(relationProperty.selfIdColumnName)}=$1 AND ${queryBuilder.quoteObject(relationProperty.targetIdColumnName)}=$2
3926
+ })} (${queryBuilder.quoteObject(relationProperty.selfIdColumnName)}, ${queryBuilder.quoteObject(relationProperty.targetIdColumnName)})
3927
+ SELECT $1, $2 WHERE NOT EXISTS (
3928
+ SELECT ${queryBuilder.quoteObject(relationProperty.selfIdColumnName)}, ${queryBuilder.quoteObject(relationProperty.targetIdColumnName)}
3929
+ FROM ${queryBuilder.quoteTable({ schema: relationProperty.linkSchema, tableName: relationProperty.linkTableName })}
3930
+ WHERE ${queryBuilder.quoteObject(relationProperty.selfIdColumnName)}=$1 AND ${queryBuilder.quoteObject(relationProperty.targetIdColumnName)}=$2
3926
3931
  )`;
3927
3932
  const params = [id, relation.id];
3928
3933
  await server.queryDatabaseObject(command, params, routeContext?.getDbTransactionClient());
@@ -3962,7 +3967,7 @@ class EntityManager {
3962
3967
  const { queryBuilder } = server;
3963
3968
  if (relationProperty.linkTableName) {
3964
3969
  for (const relation of relations) {
3965
- const command = `DELETE FROM ${queryBuilder.quoteTable({ schema: relationProperty.linkSchema, tableName: relationProperty.linkTableName })}
3970
+ const command = `DELETE FROM ${queryBuilder.quoteTable({ schema: relationProperty.linkSchema, tableName: relationProperty.linkTableName })}
3966
3971
  WHERE ${queryBuilder.quoteObject(relationProperty.selfIdColumnName)}=$1 AND ${queryBuilder.quoteObject(relationProperty.targetIdColumnName)}=$2;`;
3967
3972
  const params = [id, relation.id];
3968
3973
  await server.queryDatabaseObject(command, params, routeContext?.getDbTransactionClient());
@@ -4941,6 +4946,128 @@ function getEntityRelationTargetId(entity, propName, targetColumnName) {
4941
4946
  }
4942
4947
  }
4943
4948
 
4949
+ async function readFile(path) {
4950
+ return new Promise((resolve, reject) => {
4951
+ fs__default["default"].readFile(path, null, (err, data) => {
4952
+ if (err) {
4953
+ reject(err);
4954
+ }
4955
+ else {
4956
+ resolve(data);
4957
+ }
4958
+ });
4959
+ });
4960
+ }
4961
+ async function copyFile(fromPath, toPath) {
4962
+ return new Promise((resolve, reject) => {
4963
+ fs__default["default"].copyFile(fromPath, toPath, (err) => {
4964
+ if (err) {
4965
+ reject(err);
4966
+ }
4967
+ else {
4968
+ resolve();
4969
+ }
4970
+ });
4971
+ });
4972
+ }
4973
+ async function removeFile(path) {
4974
+ return new Promise((resolve, reject) => {
4975
+ fs__default["default"].rm(path, (err) => {
4976
+ if (err) {
4977
+ reject(err);
4978
+ }
4979
+ else {
4980
+ resolve();
4981
+ }
4982
+ });
4983
+ });
4984
+ }
4985
+ async function moveFile(fromPath, toPath) {
4986
+ return new Promise((resolve, reject) => {
4987
+ fs__default["default"].rename(fromPath, toPath, (err) => {
4988
+ if (err) {
4989
+ reject(err);
4990
+ }
4991
+ else {
4992
+ resolve();
4993
+ }
4994
+ });
4995
+ });
4996
+ }
4997
+ async function appendFile(path, data) {
4998
+ return new Promise((resolve, reject) => {
4999
+ fs__default["default"].appendFile(path, Buffer.from(data), (err) => {
5000
+ if (err) {
5001
+ reject(err);
5002
+ }
5003
+ else {
5004
+ resolve();
5005
+ }
5006
+ });
5007
+ });
5008
+ }
5009
+ async function writeFile(path, data) {
5010
+ return new Promise((resolve, reject) => {
5011
+ fs__default["default"].writeFile(path, Buffer.from(data), (err) => {
5012
+ if (err) {
5013
+ reject(err);
5014
+ }
5015
+ else {
5016
+ resolve();
5017
+ }
5018
+ });
5019
+ });
5020
+ }
5021
+ function ensureDirectoryExists(dirPath) {
5022
+ if (!fs__default["default"].existsSync(dirPath)) {
5023
+ const parentDirPath = path__default["default"].dirname(dirPath);
5024
+ if (parentDirPath == dirPath) {
5025
+ return;
5026
+ }
5027
+ ensureDirectoryExists(parentDirPath);
5028
+ fs__default["default"].mkdirSync(dirPath);
5029
+ }
5030
+ }
5031
+ function enumFileBaseNamesInDirectory(options) {
5032
+ const { dirPath, prefix, fileNameFilter } = options;
5033
+ let fileNames = [];
5034
+ let resolvedDirPath = dirPath;
5035
+ const isRelative = dirPath.startsWith(".") || dirPath.startsWith("..");
5036
+ if (isRelative) {
5037
+ resolvedDirPath = path__default["default"].join(process.cwd(), dirPath);
5038
+ }
5039
+ if (!fs__default["default"].existsSync(resolvedDirPath)) {
5040
+ console.warn(`Directory '${resolvedDirPath}' not found.`);
5041
+ return [];
5042
+ }
5043
+ const files = fs__default["default"].readdirSync(resolvedDirPath);
5044
+ for (const fileName of files) {
5045
+ const filePathName = path__default["default"].join(resolvedDirPath, fileName);
5046
+ const fileStat = fs__default["default"].statSync(filePathName);
5047
+ if (fileStat.isDirectory()) {
5048
+ fileNames = fileNames.concat(enumFileBaseNamesInDirectory({
5049
+ dirPath: filePathName,
5050
+ prefix: prefix ? `${prefix}/${fileName}` : fileName,
5051
+ fileNameFilter,
5052
+ }));
5053
+ }
5054
+ else if (fileStat.isFile()) {
5055
+ if (fileNameFilter && !fileNameFilter(fileName)) {
5056
+ continue;
5057
+ }
5058
+ const baseName = path__default["default"].parse(fileName).name;
5059
+ if (prefix) {
5060
+ fileNames.push(`${prefix}/${baseName}`);
5061
+ }
5062
+ else {
5063
+ fileNames.push(baseName);
5064
+ }
5065
+ }
5066
+ }
5067
+ fileNames.sort();
5068
+ return fileNames;
5069
+ }
5070
+
4944
5071
  // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
4945
5072
  // This module is browser compatible.
4946
5073
  /**
@@ -5471,9 +5598,9 @@ class MetaService {
5471
5598
  await server.tryQueryDatabaseObject(`COMMENT ON TABLE ${queryBuilder.quoteTable(model)} IS ${queryBuilder.formatValueToSqlLiteral(model.name)};`, []);
5472
5599
  }
5473
5600
  }
5474
- const sqlQueryColumnInformations = `SELECT c.table_schema, c.table_name, c.column_name, c.ordinal_position, d.description, c.data_type, c.udt_name, c.is_nullable, c.column_default, c.character_maximum_length, c.numeric_precision, c.numeric_scale
5475
- FROM information_schema.columns c
5476
- INNER JOIN pg_catalog.pg_statio_all_tables st ON (st.schemaname = c.table_schema and st.relname = c.table_name)
5601
+ const sqlQueryColumnInformations = `SELECT c.table_schema, c.table_name, c.column_name, c.ordinal_position, d.description, c.data_type, c.udt_name, c.is_nullable, c.column_default, c.character_maximum_length, c.numeric_precision, c.numeric_scale
5602
+ FROM information_schema.columns c
5603
+ INNER JOIN pg_catalog.pg_statio_all_tables st ON (st.schemaname = c.table_schema and st.relname = c.table_name)
5477
5604
  LEFT JOIN pg_catalog.pg_description d ON (d.objoid = st.relid and d.objsubid = c.ordinal_position);`;
5478
5605
  const columnsInDb = await server.queryDatabaseObject(sqlQueryColumnInformations, []);
5479
5606
  for (const model of applicationConfig.models) {
@@ -7373,31 +7500,6 @@ class AuthPlugin {
7373
7500
  }
7374
7501
  }
7375
7502
 
7376
- async function readFile(path) {
7377
- return new Promise((resolve, reject) => {
7378
- fs__default["default"].readFile(path, null, (err, data) => {
7379
- if (err) {
7380
- reject(err);
7381
- }
7382
- else {
7383
- resolve(data);
7384
- }
7385
- });
7386
- });
7387
- }
7388
- async function appendFile(path, data) {
7389
- return new Promise((resolve, reject) => {
7390
- fs__default["default"].appendFile(path, Buffer.from(data), (err) => {
7391
- if (err) {
7392
- reject(err);
7393
- }
7394
- else {
7395
- resolve();
7396
- }
7397
- });
7398
- });
7399
- }
7400
-
7401
7503
  function getFileBaseName(pathname) {
7402
7504
  const extName = path__default["default"].extname(pathname);
7403
7505
  return path__default["default"].basename(pathname, extName);
@@ -7511,7 +7613,7 @@ async function handler$8(plugin, ctx, options) {
7511
7613
  const fileKey = `${uuid.v1()}${extName}`;
7512
7614
  const filePathName = path__default["default"].join(server.config.localFileStoragePath, fileKey);
7513
7615
  const fileBuffer = await file.arrayBuffer();
7514
- await appendFile(filePathName, fileBuffer);
7616
+ await writeFile(filePathName, fileBuffer);
7515
7617
  ctx.output = { ok: true, fileKey };
7516
7618
  }
7517
7619
 
@@ -9661,9 +9763,9 @@ class EntityAccessControlPlugin {
9661
9763
  if (!userId) {
9662
9764
  return;
9663
9765
  }
9664
- const actions = await server.queryDatabaseObject(`select distinct a.* from sys_actions a
9665
- inner join oc_role_sys_action_links ra on a.id = ra.action_id
9666
- inner join oc_role_user_links ru on ru.role_id = ra.role_id
9766
+ const actions = await server.queryDatabaseObject(`select distinct a.* from sys_actions a
9767
+ inner join oc_role_sys_action_links ra on a.id = ra.action_id
9768
+ inner join oc_role_user_links ru on ru.role_id = ra.role_id
9667
9769
  where ru.user_id = $1;`, [userId]);
9668
9770
  routeContext.state.allowedActions = actions.map((item) => item.code);
9669
9771
  }
@@ -9706,12 +9808,16 @@ exports.ServerOperationPlugin = ServerOperationPlugin;
9706
9808
  exports.SettingPlugin = SettingPlugin;
9707
9809
  exports.StateMachinePlugin = StateMachinePlugin;
9708
9810
  exports.WebhooksPlugin = WebhooksPlugin;
9811
+ exports.appendFile = appendFile;
9709
9812
  exports.bootstrapApplicationConfig = bootstrapApplicationConfig$1;
9813
+ exports.copyFile = copyFile;
9710
9814
  exports.createJwt = createJwt;
9711
9815
  exports.decodeJwt = decodeJwt;
9712
9816
  exports.deleteCookie = deleteCookie;
9713
9817
  exports.detectChangedFieldsOfEntity = detectChangedFieldsOfEntity;
9818
+ exports.ensureDirectoryExists = ensureDirectoryExists;
9714
9819
  exports.entityHelper = entityHelper;
9820
+ exports.enumFileBaseNamesInDirectory = enumFileBaseNamesInDirectory;
9715
9821
  exports.formatDateTimeWithTimezone = formatDateTimeWithTimezone;
9716
9822
  exports.generateJwtSecretKey = generateJwtSecretKey;
9717
9823
  exports.generatePasswordHash = generatePasswordHash;
@@ -9725,8 +9831,12 @@ exports.isAccessAllowed = isAccessAllowed;
9725
9831
  exports.licenseHelper = licenseHelper;
9726
9832
  exports.mapDbRowToEntity = mapDbRowToEntity;
9727
9833
  exports.metaHelper = metaHelper;
9834
+ exports.moveFile = moveFile;
9835
+ exports.readFile = readFile;
9836
+ exports.removeFile = removeFile;
9728
9837
  exports.setCookie = setCookie;
9729
9838
  exports.tryValidateLicense = tryValidateLicense;
9730
9839
  exports.validateLicense = validateLicense;
9731
9840
  exports.validatePassword = validatePassword;
9732
9841
  exports.verifyJwt = verifyJwt;
9842
+ exports.writeFile = writeFile;
@@ -4,3 +4,11 @@ export declare function copyFile(fromPath: string, toPath: string): Promise<void
4
4
  export declare function removeFile(path: string): Promise<void>;
5
5
  export declare function moveFile(fromPath: string, toPath: string): Promise<void>;
6
6
  export declare function appendFile(path: string, data: ArrayBuffer): Promise<void>;
7
+ export declare function writeFile(path: string, data: ArrayBuffer): Promise<void>;
8
+ export declare function ensureDirectoryExists(dirPath: string): void;
9
+ export type EnumFileBaseNamesOptions = {
10
+ dirPath: string;
11
+ prefix?: string;
12
+ fileNameFilter?: (fileName: string) => boolean;
13
+ };
14
+ export declare function enumFileBaseNamesInDirectory(options: EnumFileBaseNamesOptions): string[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ruiapp/rapid-core",
3
- "version": "0.9.7",
3
+ "version": "0.9.9",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/rollup.config.js CHANGED
@@ -1,16 +1,16 @@
1
- import typescript from "rollup-plugin-typescript2";
2
- import tscAlias from "rollup-plugin-tsc-alias";
3
-
4
- export default {
5
- input: ["src/index.ts"],
6
- output: [
7
- {
8
- dir: "dist",
9
- entryFileNames: "[name].js",
10
- format: "cjs",
11
- exports: "named",
12
- },
13
- ],
14
- plugins: [typescript(), tscAlias()],
15
- external: [],
16
- };
1
+ import typescript from "rollup-plugin-typescript2";
2
+ import tscAlias from "rollup-plugin-tsc-alias";
3
+
4
+ export default {
5
+ input: ["src/index.ts"],
6
+ output: [
7
+ {
8
+ dir: "dist",
9
+ entryFileNames: "[name].js",
10
+ format: "cjs",
11
+ exports: "named",
12
+ },
13
+ ],
14
+ plugins: [typescript(), tscAlias()],
15
+ external: [],
16
+ };