@saltcorn/server 1.3.0-beta.0 → 1.3.0-beta.10

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 (410) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/app.js +71 -48
  3. package/auth/routes.js +137 -12
  4. package/docs/assets/search.js +1 -1
  5. package/docs/classes/_saltcorn_common_code.Relation.html +10 -10
  6. package/docs/classes/_saltcorn_common_code.RelationsFinder.html +5 -5
  7. package/docs/classes/_saltcorn_data.models.Crash.html +17 -17
  8. package/docs/classes/_saltcorn_data.models.EventLog-1.html +19 -19
  9. package/docs/classes/_saltcorn_data.models.Field.html +90 -73
  10. package/docs/classes/_saltcorn_data.models.FieldRepeat.html +16 -16
  11. package/docs/classes/_saltcorn_data.models.File-1.html +48 -48
  12. package/docs/classes/_saltcorn_data.models.Form-1.html +38 -38
  13. package/docs/classes/_saltcorn_data.models.Library.html +13 -13
  14. package/docs/classes/_saltcorn_data.models.Page.html +24 -24
  15. package/docs/classes/_saltcorn_data.models.PageGroup-1.html +25 -25
  16. package/docs/classes/_saltcorn_data.models.Plugin.html +25 -25
  17. package/docs/classes/_saltcorn_data.models.Role.html +9 -9
  18. package/docs/classes/_saltcorn_data.models.Table-1.html +92 -92
  19. package/docs/classes/_saltcorn_data.models.TableConstraint.html +14 -14
  20. package/docs/classes/_saltcorn_data.models.Trigger.html +39 -39
  21. package/docs/classes/_saltcorn_data.models.User.html +48 -48
  22. package/docs/classes/_saltcorn_data.models.View-1.html +105 -53
  23. package/docs/classes/_saltcorn_data.models.Workflow.html +17 -17
  24. package/docs/classes/_saltcorn_data.models.WorkflowRun.html +35 -35
  25. package/docs/classes/_saltcorn_data.models.WorkflowStep.html +25 -25
  26. package/docs/classes/_saltcorn_data.models.WorkflowTrace.html +18 -18
  27. package/docs/classes/_saltcorn_mobile_builder.MobileBuilder.html +36 -36
  28. package/docs/enums/_saltcorn_common_code.RelationType.html +7 -7
  29. package/docs/enums/_saltcorn_common_code.ViewDisplayType.html +4 -4
  30. package/docs/functions/_saltcorn_admin_models.backup.create_backup.html +1 -1
  31. package/docs/functions/_saltcorn_admin_models.backup.create_csv_from_rows.html +1 -1
  32. package/docs/functions/_saltcorn_admin_models.backup.restore.html +5 -3
  33. package/docs/functions/_saltcorn_admin_models.pack.add_to_menu.html +1 -1
  34. package/docs/functions/_saltcorn_admin_models.pack.can_install_pack.html +1 -1
  35. package/docs/functions/_saltcorn_admin_models.pack.fetch_available_packs.html +1 -1
  36. package/docs/functions/_saltcorn_admin_models.pack.fetch_pack_by_name.html +1 -1
  37. package/docs/functions/_saltcorn_admin_models.pack.install_pack.html +1 -1
  38. package/docs/functions/_saltcorn_admin_models.pack.library_pack.html +1 -1
  39. package/docs/functions/_saltcorn_admin_models.pack.model_instance_pack.html +1 -1
  40. package/docs/functions/_saltcorn_admin_models.pack.model_pack.html +1 -1
  41. package/docs/functions/_saltcorn_admin_models.pack.page_group_pack.html +1 -1
  42. package/docs/functions/_saltcorn_admin_models.pack.page_pack.html +1 -1
  43. package/docs/functions/_saltcorn_admin_models.pack.plugin_pack.html +1 -1
  44. package/docs/functions/_saltcorn_admin_models.pack.role_pack.html +1 -1
  45. package/docs/functions/_saltcorn_admin_models.pack.table_pack.html +1 -1
  46. package/docs/functions/_saltcorn_admin_models.pack.trigger_pack.html +1 -1
  47. package/docs/functions/_saltcorn_admin_models.pack.uninstall_pack.html +1 -1
  48. package/docs/functions/_saltcorn_admin_models.pack.view_pack.html +1 -1
  49. package/docs/functions/_saltcorn_admin_models.tenant.copy_tenant_template.html +1 -1
  50. package/docs/functions/_saltcorn_admin_models.tenant.create_tenant.html +1 -1
  51. package/docs/functions/_saltcorn_admin_models.tenant.deleteTenant.html +1 -1
  52. package/docs/functions/_saltcorn_admin_models.tenant.domain_sanitize.html +1 -1
  53. package/docs/functions/_saltcorn_admin_models.tenant.eachTenant.html +1 -1
  54. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenantRows.html +1 -1
  55. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenants.html +1 -1
  56. package/docs/functions/_saltcorn_admin_models.tenant.insertTenant.html +1 -1
  57. package/docs/functions/_saltcorn_admin_models.tenant.switchToTenant.html +1 -1
  58. package/docs/functions/_saltcorn_common_code.buildTableCaches.html +1 -1
  59. package/docs/functions/_saltcorn_common_code.parseLegacyRelation.html +1 -1
  60. package/docs/functions/_saltcorn_common_code.parseRelationPath.html +1 -1
  61. package/docs/functions/_saltcorn_data.models.config.check_email_mask.html +1 -1
  62. package/docs/functions/_saltcorn_data.models.config.deleteConfig.html +1 -1
  63. package/docs/functions/_saltcorn_data.models.config.getAllConfig.html +1 -1
  64. package/docs/functions/_saltcorn_data.models.config.getConfig.html +1 -1
  65. package/docs/functions/_saltcorn_data.models.config.get_base_url.html +1 -1
  66. package/docs/functions/_saltcorn_data.models.config.get_latest_npm_version.html +1 -1
  67. package/docs/functions/_saltcorn_data.models.config.remove_from_menu.html +1 -1
  68. package/docs/functions/_saltcorn_data.models.config.save_menu_items.html +1 -1
  69. package/docs/functions/_saltcorn_data.models.config.setConfig.html +1 -1
  70. package/docs/functions/_saltcorn_data.models.discovery.discover_tables.html +1 -1
  71. package/docs/functions/_saltcorn_data.models.discovery.discoverable_tables.html +1 -1
  72. package/docs/functions/_saltcorn_data.models.discovery.findType.html +1 -1
  73. package/docs/functions/_saltcorn_data.models.discovery.get_existing_views.html +1 -1
  74. package/docs/functions/_saltcorn_data.models.discovery.implement_discovery.html +1 -1
  75. package/docs/functions/_saltcorn_data.models.email.getMailTransport.html +1 -1
  76. package/docs/functions/_saltcorn_data.models.email.send_verification_email.html +1 -1
  77. package/docs/functions/_saltcorn_data.models.email.viewToEmailHtml.html +1 -1
  78. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields.html +1 -1
  79. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields_stored.html +1 -1
  80. package/docs/functions/_saltcorn_data.models.expression.eval_expression.html +1 -1
  81. package/docs/functions/_saltcorn_data.models.expression.expressionValidator.html +1 -1
  82. package/docs/functions/_saltcorn_data.models.expression.get_async_expression_function.html +1 -1
  83. package/docs/functions/_saltcorn_data.models.expression.get_expression_function.html +1 -1
  84. package/docs/functions/_saltcorn_data.models.expression.jsexprToWhere.html +1 -1
  85. package/docs/functions/_saltcorn_data.models.expression.recalculate_for_stored.html +1 -1
  86. package/docs/functions/_saltcorn_data.models.expression.transform_for_async.html +1 -1
  87. package/docs/functions/_saltcorn_data.models.layout.eachView.html +1 -1
  88. package/docs/functions/_saltcorn_data.models.layout.getStringsForI18n.html +1 -1
  89. package/docs/functions/_saltcorn_data.models.layout.getViews.html +1 -1
  90. package/docs/functions/_saltcorn_data.models.layout.translateLayout.html +1 -1
  91. package/docs/functions/_saltcorn_data.models.layout.traverse.html +1 -1
  92. package/docs/functions/_saltcorn_data.models.layout.traverseSync.html +1 -1
  93. package/docs/functions/_saltcorn_data.models.random.all_views.html +1 -1
  94. package/docs/functions/_saltcorn_data.models.random.fill_table_row.html +1 -1
  95. package/docs/functions/_saltcorn_data.models.random.initial_view.html +1 -1
  96. package/docs/functions/_saltcorn_data.models.random.random_table.html +1 -1
  97. package/docs/functions/_saltcorn_db_common.buildInsertBulkSql.html +1 -1
  98. package/docs/functions/_saltcorn_db_common.buildInsertSql.html +1 -1
  99. package/docs/functions/_saltcorn_db_common.doCount.html +1 -1
  100. package/docs/functions/_saltcorn_db_common.doDeleteWhere.html +1 -1
  101. package/docs/functions/_saltcorn_db_common.doListScTables.html +1 -1
  102. package/docs/functions/_saltcorn_db_common.doListTables.html +1 -1
  103. package/docs/functions/_saltcorn_db_common.doListUserDefinedTables.html +1 -1
  104. package/docs/functions/_saltcorn_db_common.do_add_index.html +1 -1
  105. package/docs/functions/_saltcorn_db_common.do_drop_index.html +1 -1
  106. package/docs/functions/_saltcorn_db_common.ftsFieldsSqlExpr.html +1 -1
  107. package/docs/functions/_saltcorn_db_common.mkSelectOptions.html +1 -1
  108. package/docs/functions/_saltcorn_db_common.mkVal.html +1 -1
  109. package/docs/functions/_saltcorn_db_common.mkWhere.html +1 -1
  110. package/docs/functions/_saltcorn_db_common.multi_tenant.enable_multi_tenant.html +1 -1
  111. package/docs/functions/_saltcorn_db_common.multi_tenant.getRequestContext.html +1 -1
  112. package/docs/functions/_saltcorn_db_common.multi_tenant.getTenantSchema.html +1 -1
  113. package/docs/functions/_saltcorn_db_common.multi_tenant.init.html +1 -1
  114. package/docs/functions/_saltcorn_db_common.multi_tenant.is_it_multi_tenant.html +1 -1
  115. package/docs/functions/_saltcorn_db_common.multi_tenant.runWithTenant.html +1 -1
  116. package/docs/functions/_saltcorn_db_common.orderByIsObject.html +1 -1
  117. package/docs/functions/_saltcorn_db_common.orderByIsOperator.html +1 -1
  118. package/docs/functions/_saltcorn_db_common.prefixFieldsInWhere.html +1 -1
  119. package/docs/functions/_saltcorn_db_common.reprAsJson.html +1 -1
  120. package/docs/functions/_saltcorn_db_common.slugify.html +1 -1
  121. package/docs/functions/_saltcorn_db_common.sqlBinOp.html +1 -1
  122. package/docs/functions/_saltcorn_db_common.sqlFun.html +1 -1
  123. package/docs/functions/_saltcorn_db_common.sqlsanitize.html +1 -1
  124. package/docs/functions/_saltcorn_db_common.sqlsanitizeAllowDots.html +1 -1
  125. package/docs/functions/_saltcorn_db_common.subSelectWhere.html +1 -1
  126. package/docs/functions/_saltcorn_db_common.tryCatchInTransaction.html +1 -1
  127. package/docs/functions/_saltcorn_db_common.withTransaction.html +1 -1
  128. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidFeatures.html +1 -1
  129. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidPermissions.html +1 -1
  130. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.buildTablesFile.html +1 -1
  131. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyPrepopulatedDb.html +1 -1
  132. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyServerFiles.html +1 -1
  133. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyShareExtFiles.html +1 -1
  134. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copySiteLogo.html +1 -1
  135. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyTranslationFiles.html +1 -1
  136. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.createSqliteDb.html +1 -1
  137. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.decodeProvisioningProfile.html +1 -1
  138. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.extractDomain.html +1 -1
  139. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.generateAndroidVersionCode.html +1 -1
  140. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyAndroidManifest.html +1 -1
  141. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyConfigXml.html +1 -1
  142. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyGradleConfig.html +1 -1
  143. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyInfoPlist.html +1 -1
  144. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyXcodeProjectFile.html +1 -1
  145. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepAppIcon.html +1 -1
  146. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareAppIcon.html +1 -1
  147. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareBuildDir.html +1 -1
  148. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareExportOptionsPlist.html +1 -1
  149. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashIcon.html +1 -1
  150. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashPage.html +1 -1
  151. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCapacitorConfig.html +1 -1
  152. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCfgFile.html +1 -1
  153. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeDataExtractionRules.html +1 -1
  154. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeNetworkSecurityConfig.html +1 -1
  155. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePodfile.html +1 -1
  156. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePrivacyInfo.html +1 -1
  157. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundleMobileAppCode.html +1 -1
  158. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundlePackagesAndPlugins.html +1 -1
  159. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyMobileAppDirs.html +1 -1
  160. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyPublicDirs.html +1 -1
  161. package/docs/functions/_saltcorn_sqlite.add_index.html +1 -1
  162. package/docs/functions/_saltcorn_sqlite.add_unique_constraint.html +1 -1
  163. package/docs/functions/_saltcorn_sqlite.begin.html +1 -1
  164. package/docs/functions/_saltcorn_sqlite.changeConnection.html +1 -1
  165. package/docs/functions/_saltcorn_sqlite.close.html +1 -1
  166. package/docs/functions/_saltcorn_sqlite.commit.html +1 -1
  167. package/docs/functions/_saltcorn_sqlite.count.html +1 -1
  168. package/docs/functions/_saltcorn_sqlite.deleteWhere.html +1 -1
  169. package/docs/functions/_saltcorn_sqlite.dropTable.html +1 -1
  170. package/docs/functions/_saltcorn_sqlite.dropTables.html +1 -1
  171. package/docs/functions/_saltcorn_sqlite.drop_index.html +1 -1
  172. package/docs/functions/_saltcorn_sqlite.drop_reset_schema.html +1 -1
  173. package/docs/functions/_saltcorn_sqlite.drop_unique_constraint.html +1 -1
  174. package/docs/functions/_saltcorn_sqlite.getVersion.html +1 -1
  175. package/docs/functions/_saltcorn_sqlite.get_db_filepath.html +1 -1
  176. package/docs/functions/_saltcorn_sqlite.get_sql_logging.html +1 -1
  177. package/docs/functions/_saltcorn_sqlite.init.html +1 -1
  178. package/docs/functions/_saltcorn_sqlite.insert.html +1 -1
  179. package/docs/functions/_saltcorn_sqlite.listScTables.html +1 -1
  180. package/docs/functions/_saltcorn_sqlite.listTables.html +1 -1
  181. package/docs/functions/_saltcorn_sqlite.listUserDefinedTables.html +1 -1
  182. package/docs/functions/_saltcorn_sqlite.query.html +1 -1
  183. package/docs/functions/_saltcorn_sqlite.rollback.html +1 -1
  184. package/docs/functions/_saltcorn_sqlite.select.html +1 -1
  185. package/docs/functions/_saltcorn_sqlite.selectMaybeOne.html +1 -1
  186. package/docs/functions/_saltcorn_sqlite.selectOne.html +1 -1
  187. package/docs/functions/_saltcorn_sqlite.set_sql_logging.html +1 -1
  188. package/docs/functions/_saltcorn_sqlite.sql_log.html +1 -1
  189. package/docs/functions/_saltcorn_sqlite.update.html +1 -1
  190. package/docs/functions/_saltcorn_sqlite.updateWhere.html +1 -1
  191. package/docs/functions/_saltcorn_sqlite_mobile.add_index.html +1 -1
  192. package/docs/functions/_saltcorn_sqlite_mobile.add_unique_constraint.html +1 -1
  193. package/docs/functions/_saltcorn_sqlite_mobile.count.html +1 -1
  194. package/docs/functions/_saltcorn_sqlite_mobile.deleteWhere.html +1 -1
  195. package/docs/functions/_saltcorn_sqlite_mobile.drop_index.html +1 -1
  196. package/docs/functions/_saltcorn_sqlite_mobile.drop_reset_schema.html +1 -1
  197. package/docs/functions/_saltcorn_sqlite_mobile.drop_unique_constraint.html +1 -1
  198. package/docs/functions/_saltcorn_sqlite_mobile.init.html +1 -1
  199. package/docs/functions/_saltcorn_sqlite_mobile.insert.html +1 -1
  200. package/docs/functions/_saltcorn_sqlite_mobile.insertRows.html +1 -1
  201. package/docs/functions/_saltcorn_sqlite_mobile.listScTables.html +1 -1
  202. package/docs/functions/_saltcorn_sqlite_mobile.listTables.html +1 -1
  203. package/docs/functions/_saltcorn_sqlite_mobile.listUserDefinedTables.html +1 -1
  204. package/docs/functions/_saltcorn_sqlite_mobile.query.html +1 -1
  205. package/docs/functions/_saltcorn_sqlite_mobile.select.html +1 -1
  206. package/docs/functions/_saltcorn_sqlite_mobile.selectMaybeOne.html +1 -1
  207. package/docs/functions/_saltcorn_sqlite_mobile.selectOne.html +1 -1
  208. package/docs/functions/_saltcorn_sqlite_mobile.setConnectionObject.html +1 -1
  209. package/docs/functions/_saltcorn_sqlite_mobile.tableExists.html +1 -1
  210. package/docs/functions/_saltcorn_sqlite_mobile.time.html +1 -1
  211. package/docs/functions/_saltcorn_sqlite_mobile.update.html +1 -1
  212. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_field.instanceOfField.html +1 -1
  213. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_page.instanceOfPage.html +1 -1
  214. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_view.instanceOfView.html +1 -1
  215. package/docs/functions/_saltcorn_types.Types.base_types.instanceOWithHtmlFile.html +1 -1
  216. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfErrorMsg.html +1 -1
  217. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfSuccessMsg.html +1 -1
  218. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfType.html +1 -1
  219. package/docs/functions/_saltcorn_types.generators.generateBool.html +1 -1
  220. package/docs/functions/_saltcorn_types.generators.generateString.html +1 -1
  221. package/docs/functions/_saltcorn_types.generators.num_between.html +1 -1
  222. package/docs/functions/_saltcorn_types.generators.oneOf.html +1 -1
  223. package/docs/interfaces/_saltcorn_mobile_builder.common_build_utils.ScCapacitorConfig.html +10 -10
  224. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractField.html +15 -15
  225. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractFieldRepeat.html +3 -3
  226. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_form.AbstractForm.html +26 -26
  227. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_page.AbstractPage.html +7 -7
  228. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_role.AbstractRole.html +3 -3
  229. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_table.AbstractTable.html +11 -11
  230. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_trigger.AbstractTrigger.html +16 -16
  231. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_view.AbstractView.html +10 -10
  232. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_workflow.AbstractWorkflow.html +13 -13
  233. package/docs/modules/_saltcorn_admin_models.backup.html +1 -1
  234. package/docs/modules/_saltcorn_admin_models.html +1 -1
  235. package/docs/modules/_saltcorn_admin_models.pack.html +1 -1
  236. package/docs/modules/_saltcorn_admin_models.tenant.html +1 -1
  237. package/docs/modules/_saltcorn_common_code.html +1 -1
  238. package/docs/modules/_saltcorn_data.html +7 -5
  239. package/docs/modules/_saltcorn_data.models.EventLog.html +2 -2
  240. package/docs/modules/_saltcorn_data.models.File.html +2 -2
  241. package/docs/modules/_saltcorn_data.models.Form.html +2 -2
  242. package/docs/modules/_saltcorn_data.models.PageGroup.html +2 -2
  243. package/docs/modules/_saltcorn_data.models.Table.html +2 -2
  244. package/docs/modules/_saltcorn_data.models.View.html +2 -2
  245. package/docs/modules/_saltcorn_data.models.config.html +1 -1
  246. package/docs/modules/_saltcorn_data.models.discovery.html +1 -1
  247. package/docs/modules/_saltcorn_data.models.email.html +1 -1
  248. package/docs/modules/_saltcorn_data.models.expression.html +1 -1
  249. package/docs/modules/_saltcorn_data.models.html +1 -1
  250. package/docs/modules/_saltcorn_data.models.layout.html +1 -1
  251. package/docs/modules/_saltcorn_data.models.random.html +1 -1
  252. package/docs/modules/_saltcorn_data.models.scheduler.html +1 -1
  253. package/docs/modules/_saltcorn_data.plugin_helper.html +1 -1
  254. package/docs/modules/_saltcorn_data.utils.html +1 -1
  255. package/docs/modules/_saltcorn_db_common.html +2 -2
  256. package/docs/modules/_saltcorn_db_common.multi_tenant.html +1 -1
  257. package/docs/modules/_saltcorn_markup.html +2 -2
  258. package/docs/modules/_saltcorn_mobile_builder.common_build_utils.html +1 -1
  259. package/docs/modules/_saltcorn_mobile_builder.html +1 -1
  260. package/docs/modules/_saltcorn_mobile_builder.package_bundle_utils.html +1 -1
  261. package/docs/modules/_saltcorn_sqlite.html +1 -1
  262. package/docs/modules/_saltcorn_sqlite_mobile.html +1 -1
  263. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_field.html +1 -1
  264. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_form.html +1 -1
  265. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_library.html +1 -1
  266. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_page.html +1 -1
  267. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_plugin.html +1 -1
  268. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_role.html +1 -1
  269. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_table.html +1 -1
  270. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_trigger.html +1 -1
  271. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_view.html +1 -1
  272. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_workflow.html +1 -1
  273. package/docs/modules/_saltcorn_types.ModelAbstracts.html +1 -1
  274. package/docs/modules/_saltcorn_types.Types.base_types.html +1 -1
  275. package/docs/modules/_saltcorn_types.Types.common_types.html +1 -1
  276. package/docs/modules/_saltcorn_types.Types.html +1 -1
  277. package/docs/modules/_saltcorn_types.generators.html +1 -1
  278. package/docs/modules/_saltcorn_types.html +1 -1
  279. package/docs/types/_saltcorn_data.models.EventLog.EventLogCfg.html +1 -1
  280. package/docs/types/_saltcorn_data.models.File.FileCfg.html +1 -1
  281. package/docs/types/_saltcorn_data.models.Form.AdditionalButton.html +1 -1
  282. package/docs/types/_saltcorn_data.models.Form.FormCfg.html +1 -1
  283. package/docs/types/_saltcorn_data.models.PageGroup.ScreenInfoParams.html +1 -1
  284. package/docs/types/_saltcorn_data.models.Table.ChildRelations.html +1 -1
  285. package/docs/types/_saltcorn_data.models.Table.ParentRelations.html +1 -1
  286. package/docs/types/_saltcorn_data.models.Table.RelationData.html +1 -1
  287. package/docs/types/_saltcorn_data.models.View.FindViewsPred.html +1 -1
  288. package/docs/types/_saltcorn_db_common.AggregationOptions.html +4 -2
  289. package/docs/types/_saltcorn_db_common.CoordOpts.html +1 -1
  290. package/docs/types/_saltcorn_db_common.DatabaseClient.html +1 -1
  291. package/docs/types/_saltcorn_db_common.JoinField.html +1 -1
  292. package/docs/types/_saltcorn_db_common.JoinFields.html +1 -1
  293. package/docs/types/_saltcorn_db_common.JoinOptions.html +1 -1
  294. package/docs/types/_saltcorn_db_common.JsonPath.html +1 -1
  295. package/docs/types/_saltcorn_db_common.JsonPathElem.html +1 -1
  296. package/docs/types/_saltcorn_db_common.Operator.html +1 -1
  297. package/docs/types/_saltcorn_db_common.PartialSome.html +1 -1
  298. package/docs/types/_saltcorn_db_common.PrimaryKeyValue.html +1 -1
  299. package/docs/types/_saltcorn_db_common.Row.html +1 -1
  300. package/docs/types/_saltcorn_db_common.SelectOptions.html +3 -3
  301. package/docs/types/_saltcorn_db_common.SqlAndValues.html +1 -1
  302. package/docs/types/_saltcorn_db_common.StrongRow.html +1 -1
  303. package/docs/types/_saltcorn_db_common.SubselectOptions.html +1 -1
  304. package/docs/types/_saltcorn_db_common.Value.html +1 -1
  305. package/docs/types/_saltcorn_db_common.Where.html +1 -1
  306. package/docs/types/_saltcorn_mobile_builder.IosCfg.html +1 -1
  307. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.FieldCfg.html +1 -1
  308. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.InputType.html +1 -1
  309. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_form.AdditionalButton.html +1 -1
  310. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryCfg.html +1 -1
  311. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryPack.html +1 -1
  312. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PageCfg.html +1 -1
  313. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PagePack.html +1 -1
  314. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginCfg.html +1 -1
  315. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginPack.html +1 -1
  316. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RoleCfg.html +1 -1
  317. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RolePack.html +1 -1
  318. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TableCfg.html +1 -1
  319. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TablePack.html +1 -1
  320. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerCfg.html +1 -1
  321. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerPack.html +1 -1
  322. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewCfg.html +1 -1
  323. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewPack.html +1 -1
  324. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.ConfigWorkflowStep.html +1 -1
  325. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.RunResult.html +1 -1
  326. package/docs/types/_saltcorn_types.Types.base_types.Action.html +1 -1
  327. package/docs/types/_saltcorn_types.Types.base_types.AuthenticationMethod.html +1 -1
  328. package/docs/types/_saltcorn_types.Types.base_types.CalcJoinfield.html +1 -1
  329. package/docs/types/_saltcorn_types.Types.base_types.CapacitorPlugin.html +1 -1
  330. package/docs/types/_saltcorn_types.Types.base_types.CodePagePack.html +1 -1
  331. package/docs/types/_saltcorn_types.Types.base_types.Column.html +1 -1
  332. package/docs/types/_saltcorn_types.Types.base_types.ConnectObjType.html +1 -1
  333. package/docs/types/_saltcorn_types.Types.base_types.ConnectedObjects.html +1 -1
  334. package/docs/types/_saltcorn_types.Types.base_types.CopilotSkill.html +1 -1
  335. package/docs/types/_saltcorn_types.Types.base_types.ErrorObj.html +1 -1
  336. package/docs/types/_saltcorn_types.Types.base_types.FieldLike.html +1 -1
  337. package/docs/types/_saltcorn_types.Types.base_types.FieldView.html +1 -1
  338. package/docs/types/_saltcorn_types.Types.base_types.Header.html +1 -1
  339. package/docs/types/_saltcorn_types.Types.base_types.JoinFieldOption.html +1 -1
  340. package/docs/types/_saltcorn_types.Types.base_types.Layout.html +1 -1
  341. package/docs/types/_saltcorn_types.Types.base_types.MobileConfig.html +1 -1
  342. package/docs/types/_saltcorn_types.Types.base_types.ModelPattern.html +1 -1
  343. package/docs/types/_saltcorn_types.Types.base_types.Pack.html +1 -1
  344. package/docs/types/_saltcorn_types.Types.base_types.Plugin.html +1 -1
  345. package/docs/types/_saltcorn_types.Types.base_types.PluginFunction.html +1 -1
  346. package/docs/types/_saltcorn_types.Types.base_types.PluginLayout.html +1 -1
  347. package/docs/types/_saltcorn_types.Types.base_types.PluginRoute.html +4 -4
  348. package/docs/types/_saltcorn_types.Types.base_types.PluginSourceType.html +1 -1
  349. package/docs/types/_saltcorn_types.Types.base_types.PluginType.html +1 -1
  350. package/docs/types/_saltcorn_types.Types.base_types.PluginWrap.html +1 -1
  351. package/docs/types/_saltcorn_types.Types.base_types.PluginWrapArg.html +1 -1
  352. package/docs/types/_saltcorn_types.Types.base_types.RelationOption.html +1 -1
  353. package/docs/types/_saltcorn_types.Types.base_types.Req.html +1 -1
  354. package/docs/types/_saltcorn_types.Types.base_types.Res.html +1 -1
  355. package/docs/types/_saltcorn_types.Types.base_types.ResultType.html +1 -1
  356. package/docs/types/_saltcorn_types.Types.base_types.RouteAction.html +1 -1
  357. package/docs/types/_saltcorn_types.Types.base_types.RunExtra.html +1 -1
  358. package/docs/types/_saltcorn_types.Types.base_types.SlugStepType.html +1 -1
  359. package/docs/types/_saltcorn_types.Types.base_types.StepResType.html +1 -1
  360. package/docs/types/_saltcorn_types.Types.base_types.SubField.html +1 -1
  361. package/docs/types/_saltcorn_types.Types.base_types.TableProvider.html +1 -1
  362. package/docs/types/_saltcorn_types.Types.base_types.TableQuery.html +1 -1
  363. package/docs/types/_saltcorn_types.Types.base_types.Tablely.html +1 -1
  364. package/docs/types/_saltcorn_types.Types.base_types.ViewTemplate.html +1 -1
  365. package/docs/types/_saltcorn_types.Types.common_types.ErrorMessage.html +1 -1
  366. package/docs/types/_saltcorn_types.Types.common_types.GenObj.html +1 -1
  367. package/docs/types/_saltcorn_types.Types.common_types.ReqRes.html +1 -1
  368. package/docs/types/_saltcorn_types.Types.common_types.ResultMessage.html +1 -1
  369. package/docs/types/_saltcorn_types.Types.common_types.SuccessMessage.html +1 -1
  370. package/docs/types/_saltcorn_types.Types.common_types.Type.html +1 -1
  371. package/docs/variables/_saltcorn_data.db.html +1 -1
  372. package/docs/variables/_saltcorn_data.migrations.html +1 -1
  373. package/docs/variables/_saltcorn_data.models.config.available_languages.html +1 -1
  374. package/docs/variables/_saltcorn_data.models.config.configTypes.html +1 -1
  375. package/docs/variables/_saltcorn_data.models.scheduler.runScheduler.html +1 -1
  376. package/docs/variables/_saltcorn_data.plugin_helper.run_action_column.html +1 -1
  377. package/docs/variables/_saltcorn_data.utils.NotAuthorized.html +1 -1
  378. package/docs/variables/_saltcorn_data.utils.sleep.html +1 -1
  379. package/docs/variables/_saltcorn_db_common.multi_tenant.tenantNamespace.html +1 -1
  380. package/help/Template tables.tmd +9 -0
  381. package/locales/en.json +16 -1
  382. package/locales/pt.json +2 -2
  383. package/markup/admin.js +11 -2
  384. package/package.json +9 -9
  385. package/plugin_routes_handler.js +42 -0
  386. package/public/assets/databases/databases.json +3 -0
  387. package/public/assets/databases/prepopulated.db +0 -0
  388. package/public/assets/sql-wasm.wasm +0 -0
  389. package/public/gridedit.js +1 -1
  390. package/public/saltcorn-common.js +114 -42
  391. package/public/saltcorn.css +8 -0
  392. package/public/saltcorn.js +9 -1
  393. package/routes/admin.js +95 -37
  394. package/routes/api.js +53 -0
  395. package/routes/files.js +12 -0
  396. package/routes/homepage.js +23 -1
  397. package/routes/list.js +1 -1
  398. package/routes/menu.js +14 -0
  399. package/routes/notifications.js +12 -0
  400. package/routes/page.js +30 -1
  401. package/routes/registry.js +64 -4
  402. package/routes/search.js +10 -0
  403. package/routes/tables.js +137 -59
  404. package/routes/view.js +37 -1
  405. package/routes/viewedit.js +1 -1
  406. package/s3storage.js +1 -1
  407. package/serve.js +41 -1
  408. package/systemd.js +1 -1
  409. package/tests/api.test.js +51 -0
  410. package/tests/clientjs.test.js +16 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # Notable changes
2
2
 
3
+ ## 1.3.0 - In beta
4
+
5
+ * Aggregation formulae: In view formulae, you can now use aggregation formulae. The syntax for this is `{inbound_table}${inboundkey_field}${target_field}${aggrgation}` The aggregation (which should be lower case) can be ommitted and defaults to `array_agg`. Examples: `patients$favbook$id$count` or `patients$favbook$id`. This is useful if you want a count in a view link label without creating a stored calculated field.
6
+
7
+ * Builder:
8
+ - List columns can have containers in columns, and multiple elements in each column
9
+
10
+ * Template generation: generate basic views from template tables.
11
+
12
+ * Login and signup from any edit view on users. Login respond to trigger results (goto URL, toast notifications).
13
+
14
+ * Real-time collaboration foundations. Views patterns must be adapted to take advantage of this.
15
+
16
+ * View embeddings in Edit are now live and respond to changes in Key field values if embedded views are based on this relations.
17
+
18
+ * S3 automated backup destination
19
+
20
+ * refresh_user_session action: run then the sessions user variable needs to be
21
+ updated because the users table row has changed.
22
+
23
+ ### Fixes
24
+
25
+ * Restore partial matches with full text search
26
+ * Several mobile builder fixes
27
+
3
28
  ## 1.2.0 - Released 21 May 2025
4
29
 
5
30
  * Create Table by CSV upload now accepts String and UUID primary keys and
package/app.js CHANGED
@@ -7,7 +7,11 @@
7
7
  const express = require("express");
8
8
  const mountRoutes = require("./routes");
9
9
 
10
- const { getState, init_multi_tenant } = require("@saltcorn/data/db/state");
10
+ const {
11
+ getState,
12
+ getRootState,
13
+ init_multi_tenant,
14
+ } = require("@saltcorn/data/db/state");
11
15
  const db = require("@saltcorn/data/db");
12
16
  const passport = require("passport");
13
17
  const CustomStrategy = require("passport-custom").Strategy;
@@ -28,7 +32,10 @@ const {
28
32
  getSessionStore,
29
33
  setTenant,
30
34
  } = require("./routes/utils.js");
31
- const { getAllTenants } = require("@saltcorn/admin-models/models/tenant");
35
+ const {
36
+ getAllTenants,
37
+ eachTenant,
38
+ } = require("@saltcorn/admin-models/models/tenant");
32
39
  const path = require("path");
33
40
  const helmet = require("helmet");
34
41
  const wrapper = require("./wrapper");
@@ -45,6 +52,7 @@ const cors = require("cors");
45
52
  const api = require("./routes/api");
46
53
  const scapi = require("./routes/scapi");
47
54
  const fs = require("fs");
55
+ const PluginRoutesHandler = require("./plugin_routes_handler");
48
56
 
49
57
  const locales = Object.keys(available_languages);
50
58
  // jwt config
@@ -65,39 +73,14 @@ const disabledCsurf = (req, res, next) => {
65
73
  next();
66
74
  };
67
75
 
68
- const noCsrfLookup = (state) => {
76
+ const noCsrfLookup = (state, pluginRoutesHandler) => {
69
77
  const disable_csrf_routes = state.getConfig("disable_csrf_routes", "");
70
78
  const result = new Set(disable_csrf_routes.split(",").map((s) => s.trim()));
71
79
 
72
- if (!state.plugin_routes) return result;
73
- else {
74
- for (const routes of Object.values(state.plugin_routes)) {
75
- for (const url of routes
76
- .filter((r) => r.noCsrf === true)
77
- .map((r) => r.url)) {
78
- result.add(url);
79
- }
80
- }
81
- return result;
80
+ for (const url of pluginRoutesHandler.noCsrfUrls) {
81
+ result.add(url);
82
82
  }
83
- };
84
-
85
- const prepPluginRouter = (pluginRoutes) => {
86
- const router = express.Router();
87
- for (const routes of Object.values(pluginRoutes)) {
88
- for (const route of routes) {
89
- switch (route.method) {
90
- case "post":
91
- router.post(route.url, error_catcher(route.callback));
92
- break;
93
- case "get":
94
- default:
95
- router.get(route.url, error_catcher(route.callback));
96
- break;
97
- }
98
- }
99
- }
100
- return router;
83
+ return result;
101
84
  };
102
85
 
103
86
  // todo console.log app instance info when app stxarts - avoid to show secrets (password, etc)
@@ -237,9 +220,13 @@ const getApp = async (opts = {}) => {
237
220
 
238
221
  app.use(passport.initialize());
239
222
  app.use(passport.authenticate(["jwt", "session"]));
223
+ const isPlaywright = process.env.SALTCORN_SERVE_MOBILE_TEST_BUILD?.length > 0;
240
224
  app.use((req, res, next) => {
241
225
  // no jwt and session id at the same time
242
- if (!(jwt_extractor(req) && req.cookies && req.cookies["connect.sid"]))
226
+ if (
227
+ !(jwt_extractor(req) && req.cookies && req.cookies["connect.sid"]) ||
228
+ isPlaywright
229
+ )
243
230
  next();
244
231
  });
245
232
  app.use(flash());
@@ -249,14 +236,14 @@ const getApp = async (opts = {}) => {
249
236
  //legacy
250
237
  app.use(
251
238
  express.static(__dirname + "/public", {
252
- maxAge: development_mode ? 0 : 1000 * 60 * 15,
239
+ maxAge: 1000 * 60 * 60 * 24,
253
240
  })
254
241
  );
255
242
  app.use(
256
243
  express.static(
257
244
  path.dirname(require.resolve("@saltcorn/builder/package.json")) + "/dist",
258
245
  {
259
- maxAge: development_mode ? 0 : 1000 * 60 * 30,
246
+ maxAge: 1000 * 60 * 60 * 24,
260
247
  }
261
248
  )
262
249
  );
@@ -264,15 +251,24 @@ const getApp = async (opts = {}) => {
264
251
  if (process.env.SALTCORN_SERVE_ADDITIONAL_DIR)
265
252
  app.use(
266
253
  express.static(process.env.SALTCORN_SERVE_ADDITIONAL_DIR, {
267
- maxAge: development_mode ? 0 : 1000 * 60 * 15,
254
+ maxAge: 1000 * 60 * 60 * 24,
268
255
  })
269
256
  );
270
257
  let version_tag = db.connectObj.version_tag;
271
258
 
259
+ if (process.env.SALTCORN_SERVE_MOBILE_TEST_BUILD) {
260
+ app.use(
261
+ "/mobile_test_build",
262
+ express.static(process.env.SALTCORN_SERVE_MOBILE_TEST_BUILD, {
263
+ maxAge: "100d",
264
+ })
265
+ );
266
+ }
267
+
272
268
  app.use(
273
269
  `/static_assets/${version_tag}`,
274
270
  express.static(__dirname + "/public", {
275
- maxAge: development_mode ? 0 : "100d",
271
+ maxAge: "100d",
276
272
  })
277
273
  );
278
274
  app.use(
@@ -280,7 +276,7 @@ const getApp = async (opts = {}) => {
280
276
  express.static(
281
277
  path.dirname(require.resolve("@saltcorn/builder/package.json")) + "/dist",
282
278
  {
283
- maxAge: development_mode ? 0 : "100d",
279
+ maxAge: "100d",
284
280
  }
285
281
  )
286
282
  );
@@ -290,7 +286,7 @@ const getApp = async (opts = {}) => {
290
286
  path.dirname(require.resolve("@saltcorn/filemanager/package.json")) +
291
287
  "/public/build",
292
288
  {
293
- maxAge: development_mode ? 0 : "100d",
289
+ maxAge: "100d",
294
290
  }
295
291
  )
296
292
  );
@@ -412,10 +408,25 @@ const getApp = async (opts = {}) => {
412
408
  app.use("/api", api);
413
409
  app.use("/scapi", scapi);
414
410
 
411
+ const pluginRoutesHandler = new PluginRoutesHandler();
412
+ await eachTenant(async () => {
413
+ pluginRoutesHandler.initTenantRouter(
414
+ db.getTenantSchema(),
415
+ getState().plugin_routes || {}
416
+ );
417
+ getState().routesChangedCb = () => {
418
+ pluginRoutesHandler.initTenantRouter(
419
+ db.getTenantSchema(),
420
+ getState().plugin_routes || {}
421
+ );
422
+ noCsrf = noCsrfLookup(getRootState(), pluginRoutesHandler);
423
+ };
424
+ });
425
+
415
426
  const csurf = csrf();
416
427
  let noCsrf = null;
417
428
  if (!opts.disableCsrf) {
418
- noCsrf = noCsrfLookup(getState());
429
+ noCsrf = noCsrfLookup(getState(), pluginRoutesHandler);
419
430
  app.use(function (req, res, next) {
420
431
  if (
421
432
  noCsrf?.has(req.url) ||
@@ -434,17 +445,29 @@ const getApp = async (opts = {}) => {
434
445
  } else app.use(disabledCsurf);
435
446
 
436
447
  mountRoutes(app);
437
- // mount plugin router with a callback for changes
438
- let pluginRouter = prepPluginRouter(getState().plugin_routes || {});
439
- getState().routesChangedCb = () => {
440
- pluginRouter = prepPluginRouter(getState().plugin_routes || {});
441
- noCsrf = noCsrfLookup(getState());
442
- };
443
- app.use((req, res, next) => {
444
- pluginRouter(req, res, next);
445
- });
446
448
  // set tenant homepage as / root
447
449
  app.get("/", error_catcher(homepage));
450
+
451
+ app.use((req, res, next) => {
452
+ const tenant = db.getTenantSchema();
453
+ if (!pluginRoutesHandler.tenantRouters[tenant]) {
454
+ // if tenant router is not initialized, try to initialize it
455
+ pluginRoutesHandler.initTenantRouter(
456
+ tenant,
457
+ getState().plugin_routes || {}
458
+ );
459
+ getState().routesChangedCb = () => {
460
+ pluginRoutesHandler.initTenantRouter(
461
+ tenant,
462
+ getState().plugin_routes || {}
463
+ );
464
+ noCsrf = noCsrfLookup(getRootState(), pluginRoutesHandler);
465
+ };
466
+ }
467
+ if (pluginRoutesHandler.tenantRouters[tenant])
468
+ pluginRoutesHandler.tenantRouters[tenant](req, res, next);
469
+ else next();
470
+ });
448
471
  // /robots.txt
449
472
  app.get(
450
473
  "/robots.txt",
package/auth/routes.js CHANGED
@@ -195,6 +195,30 @@ const resetForm = (body, req) => {
195
195
  return form;
196
196
  };
197
197
 
198
+ /**
199
+ * Restore System Backup Password Form
200
+ * @param {object} req
201
+ * @param {string} fileId
202
+ * @returns {Form}
203
+ */
204
+ const restoreBackupPasswordForm = (req) =>
205
+ new Form({
206
+ blurb: req.__(
207
+ "To restore a system backup, please enter the password you set when you created the backup."
208
+ ),
209
+ fields: [
210
+ new Field({
211
+ label: req.__("Password"),
212
+ name: "password",
213
+ type: "String",
214
+ attributes: { input_type: "password" },
215
+ validator: (s) => s.length > 0,
216
+ }),
217
+ ],
218
+ action: "/auth/restore_backup_password",
219
+ submitLabel: req.__("Restore system backup"),
220
+ });
221
+
198
222
  /**
199
223
  * get Auth Links
200
224
  * @param {string} current
@@ -635,22 +659,42 @@ router.post(
635
659
  setTenant, // TODO why is this needed?????
636
660
  error_catcher(async (req, res) => {
637
661
  const hasUsers = await User.nonEmpty();
638
- if (!hasUsers) {
639
- const newPath = File.get_new_path();
640
- await req.files.file.mv(newPath);
662
+ if (hasUsers) {
663
+ req.flash("danger", req.__("Users already present"));
664
+ return res.redirect("/auth/login");
665
+ }
666
+
667
+ if (!req.files?.file) {
668
+ req.flash("danger", req.__("No backup file uploaded"));
669
+ return res.redirect("/auth/create_first_user");
670
+ }
671
+
672
+ const newPath = File.get_new_path();
673
+ await req.files.file.mv(newPath);
674
+
675
+ try {
641
676
  const err = await restore(
642
677
  newPath,
643
678
  (p) => load_plugins.loadAndSaveNewPlugin(p),
644
679
  true
645
680
  );
681
+
646
682
  if (err) req.flash("error", err);
647
683
  else req.flash("success", req.__("Successfully restored backup"));
648
- fs.unlink(newPath, function () {});
684
+
685
+ fs.unlink(newPath, () => {});
649
686
  await getState().refresh_plugins();
650
- res.redirect(`/auth/login`);
651
- } else {
652
- req.flash("danger", req.__("Users already present"));
653
- res.redirect("/auth/login");
687
+ return res.redirect("/auth/login");
688
+ } catch (error) {
689
+ if (error.requiresPassword) {
690
+ // Storing the file path in session
691
+ req.session.restoreBackupPath = newPath;
692
+ return res.redirect("/auth/restore_backup_password");
693
+ }
694
+
695
+ fs.unlink(newPath, () => {});
696
+ req.flash("danger", error.message);
697
+ return res.redirect("/auth/create_first_user");
654
698
  }
655
699
  })
656
700
  );
@@ -702,6 +746,70 @@ router.post(
702
746
  })
703
747
  );
704
748
 
749
+ /**
750
+ * @name get/restore_backup_password
751
+ * @function
752
+ * @memberof module:auth/routes~routesRouter
753
+ */
754
+ router.get(
755
+ "/restore_backup_password",
756
+ error_catcher(async (req, res) => {
757
+ if (!req.session.restoreBackupPath) {
758
+ req.flash("danger", req.__("Backup session expired"));
759
+ return res.redirect("/auth/create_first_user");
760
+ }
761
+
762
+ res.sendAuthWrap(
763
+ req.__("Restore system backup"),
764
+ restoreBackupPasswordForm(req),
765
+ {}
766
+ );
767
+ })
768
+ );
769
+
770
+ /**
771
+ * @name post/restore_backup_password
772
+ * @function
773
+ * @memberof module:auth/routes~routesRouter
774
+ */
775
+ router.post(
776
+ "/restore_backup_password",
777
+ error_catcher(async (req, res) => {
778
+ const { password } = req.body;
779
+ const backupPath = req.session.restoreBackupPath;
780
+
781
+ if (!backupPath) {
782
+ req.flash("danger", req.__("Backup session expired"));
783
+ return res.redirect("/auth/create_first_user");
784
+ }
785
+
786
+ try {
787
+ const err = await restore(
788
+ backupPath,
789
+ (p) => load_plugins.loadAndSaveNewPlugin(p),
790
+ true,
791
+ password
792
+ );
793
+
794
+ // Cleanup
795
+ fs.unlink(backupPath, () => {});
796
+ delete req.session.restoreBackupPath;
797
+
798
+ if (err) req.flash("error", err);
799
+ else req.flash("success", req.__("Successfully restored backup"));
800
+
801
+ await getState().refresh_plugins();
802
+ return res.redirect("/auth/login");
803
+ } catch (error) {
804
+ req.flash(
805
+ "danger",
806
+ error.message || req.__("Incorrect backup password, try again")
807
+ );
808
+ return res.redirect("/auth/restore_backup_password");
809
+ }
810
+ })
811
+ );
812
+
705
813
  /**
706
814
  * @param {string} new_user_view_name
707
815
  * @param {object} req
@@ -1192,10 +1300,27 @@ router.post(
1192
1300
  }
1193
1301
  const session_id = getSessionId(req);
1194
1302
 
1195
- Trigger.emitEvent("Login", null, req.user, {
1196
- session_id,
1197
- old_session_id: req.old_session_id,
1198
- });
1303
+ const resultCollector = {};
1304
+ await Trigger.runTableTriggers(
1305
+ "Login",
1306
+ null,
1307
+ req.user,
1308
+ resultCollector,
1309
+ req.user
1310
+ );
1311
+ if (resultCollector.notify) {
1312
+ req.flash("warning", resultCollector.notify);
1313
+ }
1314
+ if (resultCollector.error) {
1315
+ req.flash("error", resultCollector.error);
1316
+ }
1317
+ if (resultCollector.notify_success) {
1318
+ req.flash("success", resultCollector.notify_success);
1319
+ }
1320
+ if (resultCollector.goto) {
1321
+ res.redirect(resultCollector.goto);
1322
+ return;
1323
+ }
1199
1324
  res?.cookie?.("loggedin", "true", maxAge ? { maxAge } : undefined);
1200
1325
  req.flash("success", req.__("Welcome, %s!", req.user.email));
1201
1326
  if (req.smr) {