@harperfast/harper 5.0.0-alpha.10 → 5.0.0-beta.3

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 (446) hide show
  1. package/bin/BinObjects.js +17 -0
  2. package/bin/cliOperations.js +157 -0
  3. package/bin/copyDb.ts +280 -0
  4. package/bin/harper.js +156 -0
  5. package/bin/install.js +15 -0
  6. package/bin/lite.js +5 -0
  7. package/bin/restart.js +201 -0
  8. package/bin/run.js +409 -0
  9. package/bin/status.js +65 -0
  10. package/bin/stop.js +22 -0
  11. package/bin/upgrade.js +134 -0
  12. package/components/Application.ts +646 -0
  13. package/components/ApplicationScope.ts +49 -0
  14. package/components/Component.ts +53 -0
  15. package/components/ComponentV1.ts +342 -0
  16. package/components/DEFAULT_CONFIG.ts +18 -0
  17. package/components/EntryHandler.ts +227 -0
  18. package/components/Logger.ts +14 -0
  19. package/components/OptionsWatcher.ts +354 -0
  20. package/components/PluginModule.ts +6 -0
  21. package/components/Scope.ts +329 -0
  22. package/components/componentLoader.ts +529 -0
  23. package/components/deriveCommonPatternBase.ts +31 -0
  24. package/components/deriveGlobOptions.ts +44 -0
  25. package/components/deriveURLPath.ts +57 -0
  26. package/components/operations.js +658 -0
  27. package/components/operationsValidation.js +246 -0
  28. package/components/packageComponent.ts +39 -0
  29. package/components/requestRestart.ts +26 -0
  30. package/components/resolveBaseURLPath.ts +38 -0
  31. package/components/status/ComponentStatus.ts +110 -0
  32. package/components/status/ComponentStatusRegistry.ts +251 -0
  33. package/components/status/api.ts +153 -0
  34. package/components/status/crossThread.ts +405 -0
  35. package/components/status/errors.ts +152 -0
  36. package/components/status/index.ts +44 -0
  37. package/components/status/internal.ts +65 -0
  38. package/components/status/registry.ts +12 -0
  39. package/components/status/types.ts +96 -0
  40. package/config/RootConfigWatcher.ts +59 -0
  41. package/config/configHelpers.ts +11 -0
  42. package/config/configUtils.js +967 -0
  43. package/config/harperConfigEnvVars.ts +641 -0
  44. package/dataLayer/CreateAttributeObject.js +25 -0
  45. package/dataLayer/CreateTableObject.js +11 -0
  46. package/dataLayer/DataLayerObjects.js +43 -0
  47. package/dataLayer/DeleteBeforeObject.js +22 -0
  48. package/dataLayer/DeleteObject.js +25 -0
  49. package/dataLayer/DropAttributeObject.js +11 -0
  50. package/dataLayer/GetBackupObject.js +22 -0
  51. package/dataLayer/InsertObject.js +24 -0
  52. package/dataLayer/ReadAuditLogObject.js +24 -0
  53. package/dataLayer/SQLSearch.js +1335 -0
  54. package/dataLayer/SearchByConditionsObject.js +61 -0
  55. package/dataLayer/SearchByHashObject.js +21 -0
  56. package/dataLayer/SearchObject.js +45 -0
  57. package/dataLayer/SqlSearchObject.js +14 -0
  58. package/dataLayer/UpdateObject.js +23 -0
  59. package/dataLayer/UpsertObject.js +23 -0
  60. package/dataLayer/bulkLoad.js +813 -0
  61. package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
  62. package/dataLayer/dataObjects/UpsertObject.js +23 -0
  63. package/dataLayer/delete.js +164 -0
  64. package/dataLayer/export.js +381 -0
  65. package/dataLayer/getBackup.js +40 -0
  66. package/dataLayer/harperBridge/BridgeMethods.js +81 -0
  67. package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
  68. package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
  69. package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
  70. package/dataLayer/harperBridge/harperBridge.js +21 -0
  71. package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
  72. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
  73. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
  74. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
  75. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
  76. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
  77. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
  78. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
  79. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
  80. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
  81. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
  82. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
  83. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
  84. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
  85. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
  86. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
  87. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
  88. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
  89. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
  90. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
  91. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
  92. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
  93. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
  94. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
  95. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
  96. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
  97. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
  98. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
  99. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
  100. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
  101. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
  102. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
  103. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
  104. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
  105. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
  106. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
  107. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
  108. package/dataLayer/hdbInfoController.js +254 -0
  109. package/dataLayer/insert.js +266 -0
  110. package/dataLayer/readAuditLog.js +59 -0
  111. package/dataLayer/schema.js +366 -0
  112. package/dataLayer/schemaDescribe.js +289 -0
  113. package/dataLayer/search.js +60 -0
  114. package/dataLayer/transaction.js +17 -0
  115. package/dataLayer/update.js +124 -0
  116. package/dist/components/Logger.d.ts +12 -0
  117. package/dist/{resources/ResourceInterfaceV2.js → components/Logger.js} +1 -1
  118. package/dist/components/Logger.js.map +1 -0
  119. package/dist/components/Scope.d.ts +14 -4
  120. package/dist/components/Scope.js +18 -10
  121. package/dist/components/Scope.js.map +1 -1
  122. package/dist/components/componentLoader.js +17 -10
  123. package/dist/components/componentLoader.js.map +1 -1
  124. package/dist/components/operations.js +2 -2
  125. package/dist/components/operations.js.map +1 -1
  126. package/dist/config/configUtils.d.ts +1 -1
  127. package/dist/config/configUtils.js +1 -1
  128. package/dist/config/configUtils.js.map +1 -1
  129. package/dist/dataLayer/CreateTableObject.d.ts +2 -2
  130. package/dist/dataLayer/CreateTableObject.js +2 -2
  131. package/dist/dataLayer/CreateTableObject.js.map +1 -1
  132. package/dist/dataLayer/delete.d.ts +1 -1
  133. package/dist/dataLayer/schema.js +6 -5
  134. package/dist/dataLayer/schema.js.map +1 -1
  135. package/dist/dataLayer/schemaDescribe.js +1 -1
  136. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +2 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/resources/DatabaseTransaction.d.ts +1 -1
  141. package/dist/resources/IterableEventQueue.d.ts +1 -1
  142. package/dist/resources/LMDBTransaction.d.ts +5 -1
  143. package/dist/resources/Resource.d.ts +1 -1
  144. package/dist/resources/ResourceInterface.d.ts +1 -1
  145. package/dist/resources/RocksIndexStore.d.ts +3 -3
  146. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  147. package/dist/resources/Table.d.ts +15 -6
  148. package/dist/resources/Table.js +12 -4
  149. package/dist/resources/Table.js.map +1 -1
  150. package/dist/resources/analytics/read.js +32 -22
  151. package/dist/resources/analytics/read.js.map +1 -1
  152. package/dist/resources/analytics/write.js +3 -6
  153. package/dist/resources/analytics/write.js.map +1 -1
  154. package/dist/resources/auditStore.d.ts +3 -3
  155. package/dist/resources/blob.d.ts +25 -2
  156. package/dist/resources/databases.d.ts +12 -2
  157. package/dist/resources/databases.js +22 -19
  158. package/dist/resources/databases.js.map +1 -1
  159. package/dist/resources/search.js +11 -5
  160. package/dist/resources/search.js.map +1 -1
  161. package/dist/resources/transaction.d.ts +2 -1
  162. package/dist/security/auth.js +1 -1
  163. package/dist/security/auth.js.map +1 -1
  164. package/dist/security/cryptoHash.d.ts +2 -2
  165. package/dist/security/jsLoader.js +265 -73
  166. package/dist/security/jsLoader.js.map +1 -1
  167. package/dist/security/keys.js +11 -12
  168. package/dist/security/keys.js.map +1 -1
  169. package/dist/security/user.js +3 -3
  170. package/dist/security/user.js.map +1 -1
  171. package/dist/server/REST.js +16 -2
  172. package/dist/server/REST.js.map +1 -1
  173. package/dist/server/Server.d.ts +2 -1
  174. package/dist/server/Server.js.map +1 -1
  175. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  176. package/dist/server/fastifyRoutes.js +2 -0
  177. package/dist/server/fastifyRoutes.js.map +1 -1
  178. package/dist/server/http.js +12 -6
  179. package/dist/server/http.js.map +1 -1
  180. package/dist/server/jobs/JobObject.d.ts +3 -3
  181. package/dist/server/loadRootComponents.js +1 -0
  182. package/dist/server/loadRootComponents.js.map +1 -1
  183. package/dist/server/operationsServer.js +3 -1
  184. package/dist/server/operationsServer.js.map +1 -1
  185. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  186. package/dist/server/serverHelpers/Request.d.ts +5 -5
  187. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  188. package/dist/server/threads/manageThreads.d.ts +2 -2
  189. package/dist/server/threads/manageThreads.js +52 -35
  190. package/dist/server/threads/manageThreads.js.map +1 -1
  191. package/dist/server/threads/socketRouter.d.ts +1 -1
  192. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  193. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  194. package/dist/utility/common_utils.d.ts +3 -3
  195. package/dist/utility/environment/systemInformation.d.ts +1 -0
  196. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  197. package/dist/utility/globalSchema.d.ts +1 -1
  198. package/dist/utility/hdbTerms.d.ts +3 -0
  199. package/dist/utility/hdbTerms.js +3 -0
  200. package/dist/utility/hdbTerms.js.map +1 -1
  201. package/dist/utility/installation.d.ts +2 -4
  202. package/dist/utility/installation.js.map +1 -1
  203. package/dist/utility/lmdb/commonUtility.d.ts +2 -1
  204. package/dist/utility/lmdb/commonUtility.js +20 -13
  205. package/dist/utility/lmdb/commonUtility.js.map +1 -1
  206. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  207. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  208. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  209. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  210. package/dist/utility/logging/harper_logger.d.ts +6 -6
  211. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  212. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  213. package/dist/validation/common_validators.d.ts +4 -3
  214. package/dist/validation/configValidator.d.ts +3 -2
  215. package/index.d.ts +56 -0
  216. package/index.js +41 -0
  217. package/json/systemSchema.json +373 -0
  218. package/launchServiceScripts/launchHarperDB.js +3 -0
  219. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  220. package/package.json +35 -16
  221. package/resources/DatabaseTransaction.ts +378 -0
  222. package/resources/ErrorResource.ts +57 -0
  223. package/resources/IterableEventQueue.ts +94 -0
  224. package/resources/LMDBTransaction.ts +349 -0
  225. package/resources/RecordEncoder.ts +702 -0
  226. package/resources/RequestTarget.ts +134 -0
  227. package/resources/Resource.ts +789 -0
  228. package/resources/ResourceInterface.ts +221 -0
  229. package/resources/Resources.ts +162 -0
  230. package/resources/RocksIndexStore.ts +70 -0
  231. package/resources/RocksTransactionLogStore.ts +352 -0
  232. package/resources/Table.ts +4531 -0
  233. package/resources/analytics/hostnames.ts +72 -0
  234. package/resources/analytics/metadata.ts +10 -0
  235. package/resources/analytics/read.ts +252 -0
  236. package/resources/analytics/write.ts +803 -0
  237. package/resources/auditStore.ts +556 -0
  238. package/resources/blob.ts +1268 -0
  239. package/resources/crdt.ts +125 -0
  240. package/resources/dataLoader.ts +527 -0
  241. package/resources/databases.ts +1290 -0
  242. package/resources/graphql.ts +221 -0
  243. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  244. package/resources/indexes/customIndexes.ts +7 -0
  245. package/resources/indexes/vector.ts +38 -0
  246. package/resources/jsResource.ts +86 -0
  247. package/resources/loadEnv.ts +22 -0
  248. package/resources/login.ts +18 -0
  249. package/resources/openApi.ts +409 -0
  250. package/resources/registrationDeprecated.ts +8 -0
  251. package/resources/replayLogs.ts +136 -0
  252. package/resources/roles.ts +98 -0
  253. package/resources/search.ts +1301 -0
  254. package/resources/tracked.ts +584 -0
  255. package/resources/transaction.ts +89 -0
  256. package/resources/transactionBroadcast.ts +258 -0
  257. package/security/auth.ts +376 -0
  258. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  259. package/security/certificateVerification/configValidation.ts +107 -0
  260. package/security/certificateVerification/crlVerification.ts +623 -0
  261. package/security/certificateVerification/index.ts +121 -0
  262. package/security/certificateVerification/ocspVerification.ts +148 -0
  263. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  264. package/security/certificateVerification/types.ts +128 -0
  265. package/security/certificateVerification/verificationConfig.ts +138 -0
  266. package/security/certificateVerification/verificationUtils.ts +447 -0
  267. package/security/cryptoHash.js +42 -0
  268. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  269. package/security/data_objects/PermissionResponseObject.js +115 -0
  270. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  271. package/security/fastifyAuth.js +169 -0
  272. package/security/impersonation.ts +160 -0
  273. package/security/jsLoader.ts +733 -0
  274. package/security/keys.js +948 -0
  275. package/security/permissionsTranslator.js +300 -0
  276. package/security/role.js +218 -0
  277. package/security/tokenAuthentication.ts +228 -0
  278. package/security/user.ts +449 -0
  279. package/server/DurableSubscriptionsSession.ts +503 -0
  280. package/server/REST.ts +407 -0
  281. package/server/Server.ts +89 -0
  282. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  283. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  284. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  285. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  286. package/server/fastifyRoutes.ts +205 -0
  287. package/server/graphqlQuerying.ts +700 -0
  288. package/server/http.ts +640 -0
  289. package/server/itc/serverHandlers.js +161 -0
  290. package/server/itc/utility/ITCEventObject.js +10 -0
  291. package/server/jobs/JobObject.js +24 -0
  292. package/server/jobs/jobProcess.js +69 -0
  293. package/server/jobs/jobRunner.js +162 -0
  294. package/server/jobs/jobs.js +304 -0
  295. package/server/loadRootComponents.js +44 -0
  296. package/server/mqtt.ts +485 -0
  297. package/server/nodeName.ts +75 -0
  298. package/server/operationsServer.ts +313 -0
  299. package/server/serverHelpers/Headers.ts +108 -0
  300. package/server/serverHelpers/JSONStream.ts +269 -0
  301. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  302. package/server/serverHelpers/Request.ts +158 -0
  303. package/server/serverHelpers/contentTypes.ts +637 -0
  304. package/server/serverHelpers/requestTimePlugin.js +57 -0
  305. package/server/serverHelpers/serverHandlers.js +148 -0
  306. package/server/serverHelpers/serverUtilities.ts +473 -0
  307. package/server/serverRegistry.ts +8 -0
  308. package/server/static.ts +187 -0
  309. package/server/status/definitions.ts +37 -0
  310. package/server/status/index.ts +125 -0
  311. package/server/storageReclamation.ts +93 -0
  312. package/server/threads/itc.js +89 -0
  313. package/server/threads/manageThreads.js +596 -0
  314. package/server/threads/socketRouter.ts +360 -0
  315. package/server/threads/threadServer.js +279 -0
  316. package/server/throttle.ts +73 -0
  317. package/sqlTranslator/SelectValidator.js +330 -0
  318. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  319. package/sqlTranslator/deleteTranslator.js +67 -0
  320. package/sqlTranslator/index.js +242 -0
  321. package/sqlTranslator/sql_statement_bucket.js +472 -0
  322. package/static/defaultConfig.yaml +3 -0
  323. package/studio/web/HDBDogOnly.svg +78 -0
  324. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  326. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  327. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  328. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  329. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  330. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  331. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  332. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  333. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  334. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  335. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  336. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  337. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  338. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  339. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  340. package/studio/web/assets/index-C1G-Jo6n.js +37 -0
  341. package/studio/web/assets/index-C1G-Jo6n.js.map +1 -0
  342. package/studio/web/assets/index-D-CahN0-.js +2 -0
  343. package/studio/web/assets/index-D-CahN0-.js.map +1 -0
  344. package/studio/web/assets/index-DxlZI0PX.js +235 -0
  345. package/studio/web/assets/index-DxlZI0PX.js.map +1 -0
  346. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  347. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  348. package/studio/web/assets/index.lazy-BUXDDqq9.js +266 -0
  349. package/studio/web/assets/index.lazy-BUXDDqq9.js.map +1 -0
  350. package/studio/web/assets/profiler-CU93QiSW.js +2 -0
  351. package/studio/web/assets/profiler-CU93QiSW.js.map +1 -0
  352. package/studio/web/assets/react-redux-B8k9Ep7e.js +6 -0
  353. package/studio/web/assets/react-redux-B8k9Ep7e.js.map +1 -0
  354. package/studio/web/assets/startRecording-DFeBXGk6.js +3 -0
  355. package/studio/web/assets/startRecording-DFeBXGk6.js.map +1 -0
  356. package/studio/web/fabric-signup-background.webp +0 -0
  357. package/studio/web/fabric-signup-text.png +0 -0
  358. package/studio/web/favicon_purple.png +0 -0
  359. package/studio/web/github-icon.svg +15 -0
  360. package/studio/web/harper-fabric_black.png +0 -0
  361. package/studio/web/harper-fabric_white.png +0 -0
  362. package/studio/web/harper-studio_white.png +0 -0
  363. package/studio/web/index.html +16 -0
  364. package/studio/web/running.css +148 -0
  365. package/studio/web/running.html +147 -0
  366. package/studio/web/running.js +111 -0
  367. package/upgrade/UpgradeObjects.js +13 -0
  368. package/upgrade/directives/directivesController.js +90 -0
  369. package/upgrade/directivesManager.js +139 -0
  370. package/upgrade/upgradePrompt.js +124 -0
  371. package/upgrade/upgradeUtilities.js +28 -0
  372. package/utility/AWS/AWSConnector.js +29 -0
  373. package/utility/OperationFunctionCaller.js +63 -0
  374. package/utility/assignCmdEnvVariables.js +62 -0
  375. package/utility/common_utils.js +867 -0
  376. package/utility/environment/environmentManager.js +208 -0
  377. package/utility/environment/systemInformation.js +355 -0
  378. package/utility/errors/commonErrors.js +267 -0
  379. package/utility/errors/hdbError.js +146 -0
  380. package/utility/functions/date/dateFunctions.js +65 -0
  381. package/utility/functions/geo.js +355 -0
  382. package/utility/functions/sql/alaSQLExtension.js +104 -0
  383. package/utility/globalSchema.js +35 -0
  384. package/utility/hdbTerms.ts +819 -0
  385. package/utility/install/checkJWTTokensExist.js +62 -0
  386. package/utility/install/harperdb.conf +15 -0
  387. package/utility/install/harperdb.service +14 -0
  388. package/utility/install/installer.js +635 -0
  389. package/utility/installation.ts +30 -0
  390. package/utility/lmdb/DBIDefinition.js +20 -0
  391. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  392. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  393. package/utility/lmdb/OpenDBIObject.js +31 -0
  394. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  395. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  396. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  397. package/utility/lmdb/cleanLMDBMap.js +65 -0
  398. package/utility/lmdb/commonUtility.js +130 -0
  399. package/utility/lmdb/deleteUtility.js +128 -0
  400. package/utility/lmdb/environmentUtility.js +477 -0
  401. package/utility/lmdb/searchCursorFunctions.js +187 -0
  402. package/utility/lmdb/searchUtility.js +918 -0
  403. package/utility/lmdb/terms.js +57 -0
  404. package/utility/lmdb/writeUtility.js +407 -0
  405. package/utility/logging/harper_logger.js +876 -0
  406. package/utility/logging/logRotator.js +157 -0
  407. package/utility/logging/logger.ts +24 -0
  408. package/utility/logging/readLog.js +355 -0
  409. package/utility/logging/transactionLog.js +57 -0
  410. package/utility/mount_hdb.js +59 -0
  411. package/utility/npmUtilities.js +102 -0
  412. package/utility/operationPermissions.ts +112 -0
  413. package/utility/operation_authorization.js +836 -0
  414. package/utility/packageUtils.js +55 -0
  415. package/utility/password.ts +99 -0
  416. package/utility/processManagement/processManagement.js +187 -0
  417. package/utility/processManagement/servicesConfig.js +56 -0
  418. package/utility/scripts/restartHdb.js +24 -0
  419. package/utility/scripts/user_data.sh +13 -0
  420. package/utility/signalling.js +36 -0
  421. package/utility/terms/certificates.js +81 -0
  422. package/utility/when.ts +20 -0
  423. package/validation/bulkDeleteValidator.js +24 -0
  424. package/validation/check_permissions.js +19 -0
  425. package/validation/common_validators.js +95 -0
  426. package/validation/configValidator.js +331 -0
  427. package/validation/deleteValidator.js +15 -0
  428. package/validation/fileLoadValidator.js +153 -0
  429. package/validation/insertValidator.js +40 -0
  430. package/validation/installValidator.js +37 -0
  431. package/validation/readLogValidator.js +64 -0
  432. package/validation/role_validation.js +320 -0
  433. package/validation/schemaMetadataValidator.js +42 -0
  434. package/validation/searchValidator.js +166 -0
  435. package/validation/statusValidator.ts +66 -0
  436. package/validation/transactionLogValidator.js +33 -0
  437. package/validation/user_validation.js +55 -0
  438. package/validation/validationWrapper.js +105 -0
  439. package/dist/resources/ResourceInterfaceV2.d.ts +0 -21
  440. package/dist/resources/ResourceInterfaceV2.js.map +0 -1
  441. package/dist/resources/ResourceV2.d.ts +0 -30
  442. package/dist/resources/ResourceV2.js +0 -27
  443. package/dist/resources/ResourceV2.js.map +0 -1
  444. package/dist/resources/analytics/profile.d.ts +0 -2
  445. package/dist/resources/analytics/profile.js +0 -144
  446. package/dist/resources/analytics/profile.js.map +0 -1
@@ -0,0 +1,64 @@
1
+ 'use strict';
2
+
3
+ const envMangr = require('../utility/environment/environmentManager.js');
4
+ const Joi = require('joi');
5
+ const validator = require('./validationWrapper.js');
6
+ const moment = require('moment');
7
+ const fs = require('fs-extra');
8
+ const path = require('path');
9
+ const _ = require('lodash');
10
+ const hdbTerms = require('../utility/hdbTerms.ts');
11
+ const { LOG_LEVELS } = require('../utility/hdbTerms.ts');
12
+
13
+ const LOG_DATE_FORMAT = 'YYYY-MM-DD hh:mm:ss';
14
+ const INSTALL_LOG_LOCATION = path.resolve(__dirname, `../logs`);
15
+
16
+ module.exports = function (object) {
17
+ return validator.validateBySchema(object, readLogSchema);
18
+ };
19
+
20
+ const readLogSchema = Joi.object({
21
+ from: Joi.custom(validateDatetime),
22
+ until: Joi.custom(validateDatetime),
23
+ to: Joi.custom(validateDatetime),
24
+ level: Joi.valid(
25
+ LOG_LEVELS.NOTIFY,
26
+ LOG_LEVELS.FATAL,
27
+ LOG_LEVELS.ERROR,
28
+ LOG_LEVELS.WARN,
29
+ LOG_LEVELS.INFO,
30
+ LOG_LEVELS.DEBUG,
31
+ LOG_LEVELS.TRACE
32
+ ),
33
+ order: Joi.valid('asc', 'desc'),
34
+ limit: Joi.number().min(1),
35
+ start: Joi.number().min(0),
36
+ log_name: Joi.custom(validateReadLogPath),
37
+ filter: Joi.string(),
38
+ });
39
+
40
+ function validateDatetime(value, helpers) {
41
+ if (moment(value, moment.ISO_8601).format(LOG_DATE_FORMAT) === 'Invalid date') {
42
+ return helpers.message(`'${helpers.state.path[0]}' date '${value}' is invalid.`);
43
+ }
44
+ }
45
+
46
+ function validateReadLogPath(value, helpers) {
47
+ const processLogName = _.invert(hdbTerms.LOG_NAMES);
48
+ if (processLogName[value] === undefined) {
49
+ return helpers.message(`'log_name' '${value}' is invalid.`);
50
+ }
51
+
52
+ const logPath = envMangr.get(hdbTerms.HDB_SETTINGS_NAMES.LOG_PATH_KEY);
53
+ const logName = value === undefined ? hdbTerms.LOG_NAMES.HDB : value;
54
+ const readLogPath =
55
+ logName === hdbTerms.LOG_NAMES.INSTALL
56
+ ? path.join(INSTALL_LOG_LOCATION, hdbTerms.LOG_NAMES.INSTALL)
57
+ : path.join(logPath, logName);
58
+
59
+ let exists = fs.existsSync(readLogPath);
60
+ if (exists) {
61
+ return null;
62
+ }
63
+ return helpers.message(`'log_name' '${value}' does not exist.`);
64
+ }
@@ -0,0 +1,320 @@
1
+ const validate = require('validate.js'),
2
+ validator = require('./validationWrapper.js'),
3
+ terms = require('../utility/hdbTerms.ts'),
4
+ { validateOperations } = require('../utility/operationPermissions.ts'),
5
+ { handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
6
+
7
+ const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
8
+
9
+ const constraintsTemplate = () => ({
10
+ role: {
11
+ presence: true,
12
+ format: '[\\w\\-\\_]+',
13
+ },
14
+ id: {
15
+ presence: true,
16
+ format: '[\\w\\-\\_]+',
17
+ },
18
+ permission: {
19
+ presence: true,
20
+ },
21
+ });
22
+
23
+ const STRUCTURE_USER_ENUM = {
24
+ STRUCTURE_USER: 'structure_user',
25
+ };
26
+
27
+ const OPERATIONS_KEY = 'operations';
28
+
29
+ const ROLE_TYPES = Object.values(terms.ROLE_TYPES_ENUM);
30
+ const ATTR_PERMS_KEY = 'attribute_permissions';
31
+ const ATTR_NAME_KEY = 'attribute_name';
32
+ const { PERMS_CRUD_ENUM } = terms;
33
+ const TABLE_PERM_KEYS = [ATTR_PERMS_KEY, ...Object.values(PERMS_CRUD_ENUM)];
34
+ const ATTR_CRU_KEYS = [PERMS_CRUD_ENUM.READ, PERMS_CRUD_ENUM.INSERT, PERMS_CRUD_ENUM.UPDATE];
35
+ const ATTR_PERMS_KEYS = [ATTR_NAME_KEY, ...ATTR_CRU_KEYS];
36
+
37
+ function addRoleValidation(object) {
38
+ const constraints = constraintsTemplate();
39
+ constraints.role.presence = true;
40
+ constraints.id.presence = false;
41
+ constraints.permission.presence = true;
42
+ return customValidate(object, constraints);
43
+ }
44
+
45
+ function alterRoleValidation(object) {
46
+ const constraints = constraintsTemplate();
47
+ constraints.role.presence = false;
48
+ constraints.id.presence = true;
49
+ constraints.permission.presence = true;
50
+ return customValidate(object, constraints);
51
+ }
52
+
53
+ function dropRoleValidation(object) {
54
+ const constraints = constraintsTemplate();
55
+ constraints.role.presence = false;
56
+ constraints.id.presence = true;
57
+ constraints.permission.presence = false;
58
+ return validator.validateObject(object, constraints);
59
+ }
60
+
61
+ const ALLOWED_JSON_KEYS = ['operation', 'role', 'id', 'permission', 'hdb_user', 'access'];
62
+
63
+ function customValidate(object, constraints) {
64
+ let validationErrors = {
65
+ main_permissions: [],
66
+ schema_permissions: {},
67
+ };
68
+
69
+ const jsonMsgKeys = Object.keys(object);
70
+
71
+ //Check to confirm that keys in JSON body are valid
72
+ const invalidKeys = [];
73
+ for (let i = 0, arrLength = jsonMsgKeys.length; i < arrLength; i++) {
74
+ if (!ALLOWED_JSON_KEYS.includes(jsonMsgKeys[i])) {
75
+ invalidKeys.push(jsonMsgKeys[i]);
76
+ }
77
+ }
78
+ if (invalidKeys.length > 0) {
79
+ addPermError(HDB_ERROR_MSGS.INVALID_ROLE_JSON_KEYS(invalidKeys), validationErrors);
80
+ }
81
+
82
+ let validateResult = validator.validateObject(object, constraints);
83
+ if (validateResult) {
84
+ validateResult.message.split(',').forEach((validationErr) => {
85
+ addPermError(validationErr, validationErrors);
86
+ });
87
+ }
88
+
89
+ //need this check to avoid unexpected errors if someone doesn't have permissions key included in request
90
+ if (object.permission) {
91
+ //check if role is SU or CU and has perms included
92
+ const suPermsError = validateNoSUPerms(object);
93
+ if (suPermsError) {
94
+ addPermError(suPermsError, validationErrors);
95
+ }
96
+ //check if cu or su values, if included, are booleans
97
+ ROLE_TYPES.forEach((role) => {
98
+ if (object.permission[role] && !validate.isBoolean(object.permission[role])) {
99
+ addPermError(HDB_ERROR_MSGS.SU_CU_ROLE_BOOLEAN_ERROR(role), validationErrors);
100
+ }
101
+ });
102
+ }
103
+
104
+ for (let item in object.permission) {
105
+ if (ROLE_TYPES.indexOf(item) < 0) {
106
+ //validate the user type 'structure_user'. acceptable data type is boolean or array of strings (this would be array of accepted schemas to interact with)
107
+ if (item === STRUCTURE_USER_ENUM.STRUCTURE_USER) {
108
+ let structureUserPerm = object.permission[item];
109
+
110
+ //boolean is valid, move on
111
+ if (typeof structureUserPerm === 'boolean') {
112
+ continue;
113
+ }
114
+
115
+ //array is valid check to make sure each entry is actually a schema.
116
+ if (Array.isArray(structureUserPerm)) {
117
+ for (let k = 0, length = structureUserPerm.length; k < length; k++) {
118
+ let schemaPerm = structureUserPerm[k];
119
+ if (!global.hdb_schema[schemaPerm]) {
120
+ addPermError(HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(schemaPerm), validationErrors);
121
+ }
122
+ }
123
+ continue;
124
+ }
125
+
126
+ //if we end up here then this is an invalid data type
127
+ addPermError(HDB_ERROR_MSGS.STRUCTURE_USER_ROLE_TYPE_ERROR(item), validationErrors);
128
+ continue;
129
+ }
130
+
131
+ // validate operations: must be an array of valid operation names and/or group names
132
+ if (item === OPERATIONS_KEY) {
133
+ const opUserPerm = object.permission[item];
134
+
135
+ if (!Array.isArray(opUserPerm)) {
136
+ addPermError(HDB_ERROR_MSGS.OPERATIONS_MUST_BE_ARRAY, validationErrors);
137
+ continue;
138
+ }
139
+
140
+ const invalidOp = validateOperations(opUserPerm);
141
+ if (invalidOp !== null) {
142
+ addPermError(HDB_ERROR_MSGS.INVALID_OPERATIONS_OP(invalidOp), validationErrors);
143
+ }
144
+ continue;
145
+ }
146
+
147
+ let schema = object.permission[item];
148
+ //validate that schema exists
149
+ if (!item || !global.hdb_schema[item]) {
150
+ addPermError(HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(item), validationErrors);
151
+ continue;
152
+ }
153
+ if (schema.tables) {
154
+ for (let t in schema.tables) {
155
+ let table = schema.tables[t];
156
+ //validate that table exists in schema
157
+ if (!t || !global.hdb_schema[item][t]) {
158
+ addPermError(HDB_ERROR_MSGS.TABLE_NOT_FOUND(item, t), validationErrors);
159
+ continue;
160
+ }
161
+
162
+ //validate all table perm keys are valid
163
+ Object.keys(table).forEach((tableKey) => {
164
+ if (!TABLE_PERM_KEYS.includes(tableKey)) {
165
+ addPermError(HDB_ERROR_MSGS.INVALID_PERM_KEY(tableKey), validationErrors, item, t);
166
+ }
167
+ });
168
+
169
+ //validate table CRUD perms
170
+ Object.values(PERMS_CRUD_ENUM).forEach((permKey) => {
171
+ if (!validate.isDefined(table[permKey])) {
172
+ addPermError(HDB_ERROR_MSGS.TABLE_PERM_MISSING(permKey), validationErrors, item, t);
173
+ } else if (!validate.isBoolean(table[permKey])) {
174
+ addPermError(HDB_ERROR_MSGS.TABLE_PERM_NOT_BOOLEAN(permKey), validationErrors, item, t);
175
+ }
176
+ });
177
+
178
+ //validate table ATTRIBUTE_PERMISSIONS perm
179
+ if (table.attribute_permissions === undefined) {
180
+ addPermError(HDB_ERROR_MSGS.ATTR_PERMS_ARRAY_MISSING, validationErrors, item, t);
181
+ continue;
182
+ } else if (!(Array.isArray(table.attribute_permissions) || table.attribute_permissions === null)) {
183
+ addPermError(HDB_ERROR_MSGS.ATTR_PERMS_NOT_ARRAY, validationErrors, item, t);
184
+ continue;
185
+ }
186
+
187
+ //need this check here to ensure no unexpected errors if key is missing in table perms obj
188
+ if (table.attribute_permissions) {
189
+ let tableAttributeNames = global.hdb_schema[item][t].attributes.map(({ attribute }) => attribute);
190
+ const attrPermsCheck = {
191
+ read: false,
192
+ insert: false,
193
+ update: false,
194
+ };
195
+
196
+ for (let r in table.attribute_permissions) {
197
+ let permission = table.attribute_permissions[r];
198
+
199
+ Object.keys(permission).forEach((key) => {
200
+ //Leaving this second check for "DELETE" in for now since we've decided to silently
201
+ // allow it to remain in the attr permission object even though we do not use it
202
+ if (!ATTR_PERMS_KEYS.includes(key) && key !== PERMS_CRUD_ENUM.DELETE) {
203
+ addPermError(HDB_ERROR_MSGS.INVALID_ATTR_PERM_KEY(key), validationErrors, item, t);
204
+ }
205
+ });
206
+
207
+ //validate that attribute_name is included
208
+ if (!validate.isDefined(permission.attribute_name)) {
209
+ addPermError(HDB_ERROR_MSGS.ATTR_PERM_MISSING_NAME, validationErrors, item, t);
210
+ continue;
211
+ }
212
+
213
+ const attrName = permission.attribute_name;
214
+ //validate that attr exists in schema for table
215
+ if (!tableAttributeNames.includes(attrName)) {
216
+ addPermError(HDB_ERROR_MSGS.INVALID_ATTRIBUTE_IN_PERMS(attrName), validationErrors, item, t);
217
+ continue;
218
+ }
219
+
220
+ //validate table attribute CRU perms
221
+ ATTR_CRU_KEYS.forEach((permKey) => {
222
+ if (!validate.isDefined(permission[permKey])) {
223
+ addPermError(HDB_ERROR_MSGS.ATTR_PERM_MISSING(permKey, attrName), validationErrors, item, t);
224
+ } else if (!validate.isBoolean(permission[permKey])) {
225
+ addPermError(HDB_ERROR_MSGS.ATTR_PERM_NOT_BOOLEAN(permKey, attrName), validationErrors, item, t);
226
+ }
227
+ });
228
+
229
+ //confirm that false table perms are not set to true for an attribute
230
+ if (!attrPermsCheck.read && permission.read === true) {
231
+ attrPermsCheck.read = true;
232
+ }
233
+ if (!attrPermsCheck.insert && permission.insert === true) {
234
+ attrPermsCheck.insert = true;
235
+ }
236
+ if (!attrPermsCheck.update && permission.update === true) {
237
+ attrPermsCheck.update = true;
238
+ }
239
+ }
240
+ //validate that there is no mismatching perms between table and attrs
241
+ if (
242
+ (table.read === false && attrPermsCheck.read === true) ||
243
+ (table.insert === false && attrPermsCheck.insert === true) ||
244
+ (table.update === false && attrPermsCheck.update === true)
245
+ ) {
246
+ const schemaName = `${item}.${t}`;
247
+ addPermError(HDB_ERROR_MSGS.MISMATCHED_TABLE_ATTR_PERMS(schemaName), validationErrors, item, t);
248
+ }
249
+ }
250
+ }
251
+ }
252
+ }
253
+ }
254
+
255
+ return generateRolePermResponse(validationErrors);
256
+ }
257
+
258
+ module.exports = {
259
+ addRoleValidation,
260
+ alterRoleValidation,
261
+ dropRoleValidation,
262
+ };
263
+
264
+ /**
265
+ * Validates that permissions object for CU or SU roles do not also include permissions
266
+ * @param obj
267
+ * @returns {string|null}
268
+ */
269
+ function validateNoSUPerms(obj) {
270
+ const { operation, permission } = obj;
271
+ if (operation === terms.OPERATIONS_ENUM.ADD_ROLE || operation === terms.OPERATIONS_ENUM.ALTER_ROLE) {
272
+ //Check if role type is super user
273
+ const isSuRole = permission.super_user === true;
274
+ const hasPerms = Object.keys(permission).length > 1;
275
+ if (hasPerms && isSuRole) {
276
+ return HDB_ERROR_MSGS.SU_CU_ROLE_NO_PERMS_ALLOWED(terms.ROLE_TYPES_ENUM.SUPER_USER);
277
+ }
278
+ }
279
+ return null;
280
+ }
281
+
282
+ /**
283
+ * Builds final permissions object error response to return if validation fails
284
+ *
285
+ * @param validationErrors
286
+ * @returns {null|HdbError}
287
+ */
288
+ function generateRolePermResponse(validationErrors) {
289
+ const { main_permissions, schema_permissions } = validationErrors;
290
+ if (main_permissions.length > 0 || Object.keys(schema_permissions).length > 0) {
291
+ let validationMessage = {
292
+ error: HDB_ERROR_MSGS.ROLE_PERMS_ERROR,
293
+ ...validationErrors,
294
+ };
295
+
296
+ return handleHDBError(new Error(), validationMessage, HTTP_STATUS_CODES.BAD_REQUEST);
297
+ } else {
298
+ return null;
299
+ }
300
+ }
301
+
302
+ /**
303
+ * Adds perm validation error to the correct category for the final validation error response
304
+ * @param err
305
+ * @param invalidPermsObj
306
+ * @param schema
307
+ * @param table
308
+ */
309
+ function addPermError(err, invalidPermsObj, schema, table) {
310
+ if (!schema) {
311
+ invalidPermsObj.main_permissions.push(err);
312
+ } else {
313
+ const schemaKey = table ? schema + '_' + table : schema;
314
+ if (!invalidPermsObj.schema_permissions[schemaKey]) {
315
+ invalidPermsObj.schema_permissions[schemaKey] = [err];
316
+ } else {
317
+ invalidPermsObj.schema_permissions[schemaKey].push(err);
318
+ }
319
+ }
320
+ }
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ const schemaDescribe = require('../dataLayer/schemaDescribe.js');
4
+ const { hdbErrors } = require('../utility/errors/hdbError.js');
5
+ const { getDatabases } = require('../resources/databases.ts');
6
+
7
+ module.exports = {
8
+ checkSchemaExists,
9
+ checkSchemaTableExists,
10
+ schemaDescribe,
11
+ };
12
+
13
+ /**
14
+ * Checks the global hdbSchema for a schema and table
15
+ * @param schemaName
16
+ * @param tableName
17
+ * @returns string returns a thrown message if schema and or table does not exist
18
+ */
19
+ async function checkSchemaExists(schemaName) {
20
+ let databases = getDatabases();
21
+ if (!databases[schemaName]) {
22
+ return hdbErrors.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(schemaName);
23
+ }
24
+ }
25
+
26
+ /**
27
+ * Checks the global hdbSchema for a schema and table
28
+ * @param schemaName
29
+ * @param tableName
30
+ * @returns string returns a thrown message if schema and or table does not exist
31
+ */
32
+ async function checkSchemaTableExists(schemaName, tableName) {
33
+ let invalidSchema = await checkSchemaExists(schemaName);
34
+ if (invalidSchema) {
35
+ return invalidSchema;
36
+ }
37
+ let databases = getDatabases();
38
+
39
+ if (!databases[schemaName][tableName]) {
40
+ return hdbErrors.HDB_ERROR_MSGS.TABLE_NOT_FOUND(schemaName, tableName);
41
+ }
42
+ }
@@ -0,0 +1,166 @@
1
+ const _ = require('lodash'),
2
+ validator = require('./validationWrapper.js');
3
+ const Joi = require('joi');
4
+ const hdbUtils = require('../utility/common_utils.js');
5
+ const { hdbSchemaTable, checkValidTable, hdbTable, hdbDatabase } = require('./common_validators.js');
6
+ const { handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
7
+ const { getDatabases } = require('../resources/databases.ts');
8
+ const { HTTP_STATUS_CODES } = hdbErrors;
9
+
10
+ const searchByValueSchema = Joi.object({
11
+ database: hdbDatabase,
12
+ schema: hdbDatabase,
13
+ table: hdbTable,
14
+ attribute: hdbSchemaTable,
15
+ value: Joi.any().required(),
16
+ get_attributes: Joi.array().min(1).items(Joi.alternatives(hdbSchemaTable, Joi.object())).optional(),
17
+ desc: Joi.bool(),
18
+ limit: Joi.number().integer().min(1),
19
+ offset: Joi.number().integer().min(0),
20
+ });
21
+
22
+ const searchByConditionsSchema = Joi.object({
23
+ database: hdbDatabase,
24
+ schema: hdbDatabase,
25
+ table: hdbTable,
26
+ operator: Joi.string().valid('and', 'or').default('and').lowercase(),
27
+ offset: Joi.number().integer().min(0),
28
+ limit: Joi.number().integer().min(1),
29
+ get_attributes: Joi.array().min(1).items(Joi.alternatives(hdbSchemaTable, Joi.object())).optional(),
30
+ sort: Joi.object({
31
+ attribute: Joi.alternatives(hdbSchemaTable, Joi.array().min(1)),
32
+ descending: Joi.bool().optional(),
33
+ }).optional(),
34
+ conditions: Joi.array()
35
+ .min(1)
36
+ .items(
37
+ Joi.alternatives(
38
+ Joi.object({ operator: Joi.string().valid('and', 'or').default('and').lowercase(), conditions: Joi.array() }),
39
+ Joi.object({
40
+ attribute: Joi.alternatives(hdbSchemaTable, Joi.array().min(1)),
41
+ comparator: Joi.string()
42
+ .valid(
43
+ 'equals',
44
+ 'contains',
45
+ 'starts_with',
46
+ 'ends_with',
47
+ 'greater_than',
48
+ 'greater_than_equal',
49
+ 'less_than',
50
+ 'less_than_equal',
51
+ 'between',
52
+ 'not_equal'
53
+ )
54
+ .optional(),
55
+ value: Joi.when('comparator', {
56
+ switch: [
57
+ { is: 'equals', then: Joi.any() },
58
+ {
59
+ is: 'between',
60
+ then: Joi.array()
61
+ .items(Joi.alternatives([Joi.string(), Joi.number()]))
62
+ .length(2),
63
+ },
64
+ ],
65
+ otherwise: Joi.alternatives(Joi.string(), Joi.number()),
66
+ }).required(),
67
+ })
68
+ )
69
+ )
70
+ .required(),
71
+ });
72
+
73
+ module.exports = function (searchObject, type) {
74
+ let validationError = null;
75
+ switch (type) {
76
+ case 'value':
77
+ validationError = validator.validateBySchema(searchObject, searchByValueSchema);
78
+ break;
79
+ case 'hashes':
80
+ let errors;
81
+ addError(checkValidTable('database', searchObject.schema));
82
+ addError(checkValidTable('table', searchObject.table));
83
+ if (!searchObject.hash_values) addError(`'hash_values' is required`);
84
+ else if (!Array.isArray(searchObject.hash_values)) addError(`'hash_values' must be an array`);
85
+ else if (!searchObject.hash_values.every((value) => typeof value === 'string' || typeof value === 'number'))
86
+ addError(`'hash_values' must be strings or numbers`);
87
+ if (!searchObject.get_attributes) addError(`'get_attributes' is required`);
88
+ else if (!Array.isArray(searchObject.get_attributes)) addError(`'get_attributes' must be an array`);
89
+ else if (searchObject.get_attributes.length === 0) addError(`'get_attributes' must contain at least 1 item`);
90
+ else if (!searchObject.get_attributes.every((value) => typeof value === 'string' || typeof value === 'number'))
91
+ addError(`'get_attributes' must be strings or numbers`);
92
+ function addError(error) {
93
+ if (errors) errors += '. ' + error;
94
+ else errors = error;
95
+ }
96
+ if (errors) validationError = new Error(errors.trim());
97
+ break;
98
+ case 'conditions':
99
+ validationError = validator.validateBySchema(searchObject, searchByConditionsSchema);
100
+ break;
101
+ default:
102
+ throw new Error(`Error validating search, unknown type: ${type}`);
103
+ }
104
+
105
+ // validate table and attribute if format validation is valid
106
+ if (!validationError && searchObject.schema !== 'system') {
107
+ // skip validation for system schema
108
+ //check if schema.table does not exist throw error
109
+ let checkSchemaTable = hdbUtils.checkGlobalSchemaTable(searchObject.schema, searchObject.table);
110
+ if (checkSchemaTable) {
111
+ return handleHDBError(new Error(), checkSchemaTable, HTTP_STATUS_CODES.NOT_FOUND);
112
+ }
113
+
114
+ let tableSchema = getDatabases()[searchObject.schema][searchObject.table];
115
+ let allTableAttributes = tableSchema.attributes;
116
+
117
+ //this clones the get_attributes array
118
+ let checkAttributes = searchObject.get_attributes ? [...searchObject.get_attributes] : [];
119
+
120
+ if (type === 'value') {
121
+ checkAttributes.push(searchObject.attribute);
122
+ }
123
+
124
+ //if search type is conditions add conditions fields to see if the fields exist
125
+ const addConditions = (searchObject) => {
126
+ //this is used to validate condition attributes exist in the schema
127
+ for (const condition of searchObject.conditions) {
128
+ if (condition.conditions) addConditions(condition);
129
+ else checkAttributes.push(condition.attribute);
130
+ }
131
+ };
132
+ if (type === 'conditions') {
133
+ addConditions(searchObject);
134
+ }
135
+
136
+ let unknownAttributes = _.filter(
137
+ checkAttributes,
138
+ (attribute) =>
139
+ attribute !== '*' &&
140
+ !attribute.startsWith?.('$') && // meta attributes
141
+ attribute.attribute !== '*' && // skip check for asterisk attribute
142
+ !Array.isArray(attribute) &&
143
+ !attribute.name && // nested attribute
144
+ !_.some(
145
+ allTableAttributes,
146
+ (
147
+ tableAttribute // attribute should match one of the attribute in global
148
+ ) =>
149
+ tableAttribute === attribute ||
150
+ tableAttribute.attribute === attribute ||
151
+ tableAttribute.attribute === attribute.attribute
152
+ )
153
+ );
154
+
155
+ // if any unknown attributes present in the search request then list all indicated as unknown attribute to error message at once split in well format
156
+ // for instance "unknown attribute a, b and c" or "unknown attribute a"
157
+ if (unknownAttributes && unknownAttributes.length > 0) {
158
+ // return error with proper message - replace last comma with and
159
+ let errorMsg = unknownAttributes.join(', ');
160
+ errorMsg = errorMsg.replace(/,([^,]*)$/, ' and$1');
161
+ return new Error(`unknown attribute '${errorMsg}'`);
162
+ }
163
+ }
164
+
165
+ return validationError;
166
+ };
@@ -0,0 +1,66 @@
1
+ import Joi from 'joi';
2
+ import * as validator from './validationWrapper.js';
3
+ import { STATUS_DEFINITIONS, STATUS_IDS, DEFAULT_STATUS_ID, type StatusId } from '../server/status/definitions.ts';
4
+
5
+ // Re-export constants for backward compatibility
6
+ export const STATUS_SCHEMAS = STATUS_DEFINITIONS;
7
+ export const STATUS_ALLOWED = STATUS_IDS;
8
+ export const STATUS_DEFAULT = DEFAULT_STATUS_ID;
9
+
10
+ /**
11
+ * Pregenerate error messages to avoid repeated string concatenation
12
+ */
13
+ const ERROR_MESSAGES = Object.entries(STATUS_DEFINITIONS).reduce(
14
+ (messages, [id, definition]) => {
15
+ if (definition.allowedValues) {
16
+ messages[id] = `Status "${id}" only accepts these values: ${definition.allowedValues.join(', ')}`;
17
+ }
18
+ return messages;
19
+ },
20
+ {} as Record<string, string>
21
+ );
22
+
23
+ /**
24
+ * Creates the status validation schema using the STATUS_DEFINITIONS
25
+ */
26
+ const createStatusValidationSchema = () => {
27
+ // Start with base schema
28
+ let statusSchema = Joi.string().min(1).max(512);
29
+
30
+ // Add conditional validations for each status type that has allowedValues
31
+ (Object.entries(STATUS_DEFINITIONS) as [StatusId, (typeof STATUS_DEFINITIONS)[StatusId]][]).forEach(
32
+ ([id, definition]) => {
33
+ if (definition.allowedValues) {
34
+ statusSchema = statusSchema.when('id', {
35
+ is: id,
36
+ then: Joi.string()
37
+ .valid(...definition.allowedValues)
38
+ .messages({
39
+ 'any.only': ERROR_MESSAGES[id],
40
+ }),
41
+ });
42
+ }
43
+ }
44
+ );
45
+
46
+ return statusSchema.required();
47
+ };
48
+
49
+ /**
50
+ * Joi schema for validating status operations
51
+ */
52
+ const setStatusSchema = Joi.object({
53
+ id: Joi.string()
54
+ .valid(...STATUS_ALLOWED)
55
+ .required(),
56
+ status: createStatusValidationSchema(),
57
+ });
58
+
59
+ /**
60
+ * Validates the status operation parameters
61
+ * @param obj The status operation parameters to validate
62
+ * @returns Error if validation fails, null otherwise
63
+ */
64
+ export function validateStatus(obj: any) {
65
+ return validator.validateBySchema(obj, setStatusSchema);
66
+ }
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ const Joi = require('joi');
4
+ const validator = require('./validationWrapper.js');
5
+
6
+ module.exports = {
7
+ readTransactionLogValidator,
8
+ deleteTransactionLogsBeforeValidator,
9
+ };
10
+
11
+ function readTransactionLogValidator(req) {
12
+ const schema = Joi.object({
13
+ schema: Joi.string(),
14
+ database: Joi.string(),
15
+ table: Joi.string().required(),
16
+ from: Joi.date().timestamp(),
17
+ to: Joi.date().timestamp(),
18
+ limit: Joi.number().min(1),
19
+ });
20
+
21
+ return validator.validateBySchema(req, schema);
22
+ }
23
+
24
+ function deleteTransactionLogsBeforeValidator(req) {
25
+ const schema = Joi.object({
26
+ schema: Joi.string(),
27
+ database: Joi.string(),
28
+ table: Joi.string().required(),
29
+ timestamp: Joi.date().timestamp().required(),
30
+ });
31
+
32
+ return validator.validateBySchema(req, schema);
33
+ }