@joystick.js/node-canary 0.0.0-canary.47 → 0.0.0-canary.471
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.build/getFilesToBuild.js +26 -0
- package/.build/getPlatformSafeFilePath.js +6 -0
- package/.build/getPlatformSafePath.js +6 -0
- package/.build/index.js +88 -0
- package/.build/isWindows.js +3 -0
- package/dist/action/class.js +1 -82
- package/dist/action/index.js +1 -8
- package/dist/app/accounts/default_user_output_fields.js +1 -0
- package/dist/app/accounts/delete_user.js +1 -0
- package/dist/app/accounts/generate_account_session.js +1 -0
- package/dist/app/accounts/generate_password_reset_token.js +1 -0
- package/dist/app/accounts/get_browser_safe_user.js +1 -0
- package/dist/app/accounts/has_login_token_expired.js +1 -0
- package/dist/app/accounts/index.js +1 -29
- package/dist/app/accounts/login.js +1 -59
- package/dist/app/accounts/recover_password.js +1 -0
- package/dist/app/accounts/reset_password.js +1 -0
- package/dist/app/accounts/roles/add.js +1 -7
- package/dist/app/accounts/roles/grant.js +1 -7
- package/dist/app/accounts/roles/index.js +1 -17
- package/dist/app/accounts/roles/list.js +1 -7
- package/dist/app/accounts/roles/remove.js +1 -7
- package/dist/app/accounts/roles/revoke.js +1 -7
- package/dist/app/accounts/roles/user_has_role.js +1 -0
- package/dist/app/accounts/send_email_verification.js +1 -0
- package/dist/app/accounts/set_account_cookie.js +1 -0
- package/dist/app/accounts/set_password.js +1 -0
- package/dist/app/accounts/signup.js +1 -97
- package/dist/app/accounts/unset_account_cookie.js +1 -0
- package/dist/app/accounts/verify_email.js +1 -0
- package/dist/app/api/accounts/authenticated.js +1 -0
- package/dist/app/api/accounts/login.js +1 -0
- package/dist/app/api/accounts/logout.js +1 -0
- package/dist/app/api/accounts/recover_password.js +1 -0
- package/dist/app/api/accounts/reset_password.js +1 -0
- package/dist/app/api/accounts/signup.js +1 -0
- package/dist/app/api/accounts/user.js +1 -0
- package/dist/app/api/accounts/verify_email.js +1 -0
- package/dist/app/api/format_api_error.js +1 -0
- package/dist/app/api/get.js +2 -0
- package/dist/app/api/get_api_context.js +1 -0
- package/dist/app/api/get_api_for_data_functions.js +1 -0
- package/dist/app/api/get_api_url_component.js +1 -0
- package/dist/app/api/get_output.js +1 -0
- package/dist/app/api/get_value_from_object.js +1 -0
- package/dist/app/api/handle_api_error.js +1 -0
- package/dist/app/api/input_validators.js +1 -0
- package/dist/app/api/is_array_path.js +1 -0
- package/dist/app/api/push/health.js +2 -0
- package/dist/app/api/register_getters.js +1 -0
- package/dist/app/api/register_setters.js +1 -0
- package/dist/app/api/sanitize_api_response.js +1 -0
- package/dist/app/api/set.js +2 -0
- package/dist/app/api/test/accounts/delete.js +1 -0
- package/dist/app/api/test/accounts/signup.js +1 -0
- package/dist/app/api/test/bootstrap.js +1 -0
- package/dist/app/api/test/process.js +1 -0
- package/dist/app/api/test/queues.js +1 -0
- package/dist/app/api/validate_input.js +1 -0
- package/dist/app/api/validate_session.js +1 -0
- package/dist/app/api/validate_type.js +1 -0
- package/dist/app/browser/hmr_client.js +1 -0
- package/dist/app/browser/process_polyfill.js +1 -0
- package/dist/app/cron_jobs/register.js +1 -0
- package/dist/app/databases/database_type_map.js +1 -0
- package/dist/app/databases/get_target_database_connection.js +1 -0
- package/dist/app/databases/mongodb/available_query_parameters.js +1 -0
- package/dist/app/databases/mongodb/build_connection_string.js +1 -0
- package/dist/app/databases/mongodb/build_query_parameters.js +1 -0
- package/dist/app/databases/mongodb/connect.js +6 -0
- package/dist/app/databases/mongodb/create_indexes.js +1 -0
- package/dist/app/databases/postgresql/accounts/create_accounts_metadata_table_columns.js +1 -0
- package/dist/app/databases/postgresql/connect.js +30 -0
- package/dist/app/databases/postgresql/create_indexes.js +1 -0
- package/dist/app/databases/postgresql/create_tables.js +1 -0
- package/dist/app/databases/postgresql/handle_cleanup_queues.js +5 -0
- package/dist/app/databases/postgresql/handle_cleanup_sessions.js +1 -0
- package/dist/app/databases/queries/accounts.js +1 -0
- package/dist/app/databases/queries/map.js +1 -0
- package/dist/app/databases/queries/mongodb/accounts.js +1 -0
- package/dist/app/databases/queries/mongodb/queues.js +1 -0
- package/dist/app/databases/queries/mongodb/sessions.js +1 -0
- package/dist/app/databases/queries/postgresql/accounts.js +1 -0
- package/dist/app/databases/queries/postgresql/queues.js +123 -0
- package/dist/app/databases/queries/postgresql/sessions.js +14 -0
- package/dist/app/databases/queries/sessions.js +1 -0
- package/dist/app/databases/register_database.js +1 -0
- package/dist/app/databases/sql.js +1 -0
- package/dist/app/email/send.js +1 -0
- package/dist/app/email/validate_smtp_settings.js +1 -0
- package/dist/app/fixture/index.js +1 -0
- package/dist/app/generate_machine_id.js +1 -0
- package/dist/app/generate_process_id.js +1 -0
- package/dist/app/get_ssl_certificates.js +1 -0
- package/dist/app/handle_process_errors.js +1 -0
- package/dist/app/index.js +1 -656
- package/dist/app/middleware/account.js +1 -0
- package/dist/app/middleware/body_parser.js +1 -0
- package/dist/app/middleware/build_error.js +1 -0
- package/dist/app/middleware/built_in.js +1 -0
- package/dist/app/middleware/context.js +1 -0
- package/dist/app/middleware/cors.js +1 -22
- package/dist/app/middleware/csp.js +1 -48
- package/dist/app/middleware/generate_insecure_page.js +65 -0
- package/dist/app/middleware/generate_joystick_error_page.js +147 -0
- package/dist/app/middleware/hmr_client.js +1 -0
- package/dist/app/middleware/insecure.js +1 -11
- package/dist/app/middleware/process_browser_polyfill.js +1 -0
- package/dist/app/middleware/render/get_url.js +1 -0
- package/dist/app/middleware/render/index.js +1 -0
- package/dist/app/middleware/request_methods.js +1 -0
- package/dist/app/middleware/session.js +1 -24
- package/dist/app/push_logs.js +1 -0
- package/dist/app/queues/index.js +1 -119
- package/dist/app/register_app_options.js +1 -0
- package/dist/app/routes/register_route_from_function.js +1 -0
- package/dist/app/routes/register_route_from_object.js +1 -0
- package/dist/app/routes/supported_http_methods.js +1 -0
- package/dist/app/settings/load.js +1 -0
- package/dist/app/ssr/index.js +33 -0
- package/dist/app/ssr/set_base_attributes_in_html.js +1 -0
- package/dist/app/ssr/set_head_tags_in_html.js +1 -0
- package/dist/app/start_express.js +1 -0
- package/dist/app/start_node_as_cluster.js +1 -0
- package/dist/app/uploaders/local_upload_progress_middleware.js +1 -0
- package/dist/app/uploaders/register.js +1 -0
- package/dist/app/uploaders/run_upload.js +1 -0
- package/dist/app/uploaders/validate_options.js +1 -0
- package/dist/app/uploaders/validate_uploads.js +1 -0
- package/dist/app/websockets/emit_event.js +1 -0
- package/dist/app/websockets/index.js +1 -0
- package/dist/app/websockets/register.js +1 -0
- package/dist/index.js +4 -76
- package/dist/lib/camel_pascal_to_snake.js +1 -0
- package/dist/lib/constants.js +1 -13
- package/dist/lib/dynamic_import.js +1 -0
- package/dist/lib/escape_html.js +1 -0
- package/dist/lib/escape_key_value_pair.js +1 -0
- package/dist/lib/float_to_decimal_place.js +1 -0
- package/dist/lib/generate_id.js +1 -0
- package/dist/lib/get_browser_safe_request.js +1 -0
- package/dist/lib/get_joystick_build_path.js +1 -0
- package/dist/lib/get_origin.js +1 -0
- package/dist/lib/get_platform_safe_path.js +1 -0
- package/dist/lib/get_sanitized_context.js +1 -0
- package/dist/lib/get_translations.js +1 -0
- package/dist/lib/hash_string.js +1 -0
- package/dist/lib/is_valid_json.js +1 -0
- package/dist/lib/log.js +13 -49
- package/dist/lib/node_path_polyfills.js +1 -0
- package/dist/lib/parse_json.js +1 -0
- package/dist/lib/path_exists.js +1 -0
- package/dist/lib/rainbow_road.js +1 -0
- package/dist/lib/serialize_query_parameters.js +1 -0
- package/dist/lib/set_cookie.js +1 -0
- package/dist/lib/string_to_slug.js +1 -0
- package/dist/lib/timestamps.js +1 -0
- package/dist/lib/types.js +1 -0
- package/dist/lib/unset_cookie.js +1 -0
- package/dist/lib/wait.js +1 -0
- package/dist/test/track_function_call.js +1 -0
- package/increment_version.js +3 -0
- package/package.json +27 -44
- package/src/action/class.js +137 -0
- package/src/action/index.js +8 -0
- package/src/app/accounts/default_user_output_fields.js +10 -0
- package/src/app/accounts/delete_user.js +18 -0
- package/src/app/accounts/generate_account_session.js +11 -0
- package/src/app/accounts/generate_password_reset_token.js +16 -0
- package/src/app/accounts/get_browser_safe_user.js +29 -0
- package/src/app/accounts/has_login_token_expired.js +9 -0
- package/src/app/accounts/index.js +38 -0
- package/src/app/accounts/login.js +82 -0
- package/src/app/accounts/recover_password.js +58 -0
- package/src/app/accounts/reset_password.js +69 -0
- package/src/app/accounts/roles/add.js +7 -0
- package/src/app/accounts/roles/grant.js +7 -0
- package/src/app/accounts/roles/index.js +18 -0
- package/src/app/accounts/roles/list.js +7 -0
- package/src/app/accounts/roles/remove.js +7 -0
- package/src/app/accounts/roles/revoke.js +7 -0
- package/src/app/accounts/roles/user_has_role.js +7 -0
- package/src/app/accounts/send_email_verification.js +48 -0
- package/src/app/accounts/set_account_cookie.js +12 -0
- package/src/app/accounts/set_password.js +46 -0
- package/src/app/accounts/signup.js +158 -0
- package/src/app/accounts/unset_account_cookie.js +12 -0
- package/src/app/accounts/verify_email.js +32 -0
- package/src/app/api/accounts/authenticated.js +17 -0
- package/src/app/api/accounts/login.js +36 -0
- package/src/app/api/accounts/logout.js +20 -0
- package/src/app/api/accounts/recover_password.js +16 -0
- package/src/app/api/accounts/reset_password.js +24 -0
- package/src/app/api/accounts/signup.js +49 -0
- package/src/app/api/accounts/user.js +21 -0
- package/src/app/api/accounts/verify_email.js +11 -0
- package/src/app/api/format_api_error.js +10 -0
- package/src/app/api/get.js +119 -0
- package/src/app/api/get_api_context.js +27 -0
- package/src/app/api/get_api_for_data_functions.js +37 -0
- package/src/app/api/get_api_url_component.js +5 -0
- package/src/app/api/get_output.js +116 -0
- package/src/app/api/get_value_from_object.js +8 -0
- package/src/app/api/handle_api_error.js +28 -0
- package/src/app/api/input_validators.js +227 -0
- package/src/app/api/is_array_path.js +6 -0
- package/src/app/api/push/health.js +17 -0
- package/src/app/api/register_getters.js +57 -0
- package/src/app/api/register_setters.js +55 -0
- package/src/app/api/sanitize_api_response.js +35 -0
- package/src/app/api/set.js +119 -0
- package/src/app/api/test/accounts/delete.js +8 -0
- package/src/app/api/test/accounts/signup.js +50 -0
- package/src/app/api/test/bootstrap.js +39 -0
- package/src/app/api/test/process.js +7 -0
- package/src/app/api/test/queues.js +25 -0
- package/src/app/api/validate_input.js +130 -0
- package/src/app/api/validate_session.js +20 -0
- package/src/app/api/validate_type.js +24 -0
- package/src/app/browser/hmr_client.js +196 -0
- package/src/app/browser/process_polyfill.js +11 -0
- package/src/app/cron_jobs/register.js +29 -0
- package/src/app/databases/database_type_map.js +6 -0
- package/src/app/databases/get_target_database_connection.js +25 -0
- package/{dist/app/databases/mongodb/availableQueryParameters.js → src/app/databases/mongodb/available_query_parameters.js} +3 -4
- package/src/app/databases/mongodb/build_connection_string.js +30 -0
- package/src/app/databases/mongodb/build_query_parameters.js +17 -0
- package/src/app/databases/mongodb/connect.js +42 -0
- package/src/app/databases/mongodb/create_indexes.js +35 -0
- package/src/app/databases/postgresql/accounts/create_accounts_metadata_table_columns.js +18 -0
- package/src/app/databases/postgresql/connect.js +128 -0
- package/src/app/databases/postgresql/create_indexes.js +58 -0
- package/src/app/databases/postgresql/create_tables.js +70 -0
- package/src/app/databases/postgresql/handle_cleanup_queues.js +36 -0
- package/src/app/databases/postgresql/handle_cleanup_sessions.js +5 -0
- package/src/app/databases/queries/accounts.js +17 -0
- package/src/app/databases/queries/map.js +21 -0
- package/src/app/databases/queries/mongodb/accounts.js +360 -0
- package/src/app/databases/queries/mongodb/queues.js +164 -0
- package/src/app/databases/queries/mongodb/sessions.js +22 -0
- package/src/app/databases/queries/postgresql/accounts.js +379 -0
- package/src/app/databases/queries/postgresql/queues.js +294 -0
- package/src/app/databases/queries/postgresql/sessions.js +37 -0
- package/src/app/databases/queries/sessions.js +17 -0
- package/src/app/databases/register_database.js +30 -0
- package/src/app/databases/sql.js +63 -0
- package/src/app/email/send.js +108 -0
- package/src/app/email/validate_smtp_settings.js +53 -0
- package/src/app/fixture/index.js +50 -0
- package/src/app/generate_machine_id.js +26 -0
- package/src/app/generate_process_id.js +30 -0
- package/src/app/get_ssl_certificates.js +23 -0
- package/src/app/handle_process_errors.js +101 -0
- package/src/app/index.js +253 -0
- package/src/app/middleware/account.js +28 -0
- package/src/app/middleware/body_parser.js +18 -0
- package/src/app/middleware/build_error.js +18 -0
- package/src/app/middleware/built_in.js +76 -0
- package/src/app/middleware/context.js +34 -0
- package/src/app/middleware/cors.js +23 -0
- package/src/app/middleware/csp.js +54 -0
- package/src/app/middleware/generate_insecure_page.js +71 -0
- package/{dist/lib/generateErrorPage.js → src/app/middleware/generate_joystick_error_page.js} +25 -21
- package/src/app/middleware/hmr_client.js +12 -0
- package/src/app/middleware/insecure.js +22 -0
- package/src/app/middleware/process_browser_polyfill.js +12 -0
- package/src/app/middleware/render/get_url.js +15 -0
- package/src/app/middleware/render/index.js +93 -0
- package/src/app/middleware/request_methods.js +21 -0
- package/src/app/middleware/session.js +31 -0
- package/src/app/push_logs.js +44 -0
- package/src/app/queues/index.js +268 -0
- package/src/app/register_app_options.js +7 -0
- package/src/app/routes/register_route_from_function.js +10 -0
- package/src/app/routes/register_route_from_object.js +34 -0
- package/src/app/routes/supported_http_methods.js +9 -0
- package/src/app/settings/load.js +33 -0
- package/src/app/ssr/index.js +133 -0
- package/src/app/ssr/set_base_attributes_in_html.js +43 -0
- package/src/app/ssr/set_head_tags_in_html.js +104 -0
- package/src/app/start_express.js +50 -0
- package/src/app/start_node_as_cluster.js +30 -0
- package/src/app/uploaders/local_upload_progress_middleware.js +24 -0
- package/src/app/uploaders/register.js +169 -0
- package/src/app/uploaders/run_upload.js +136 -0
- package/src/app/uploaders/validate_options.js +74 -0
- package/src/app/uploaders/validate_uploads.js +127 -0
- package/src/app/websockets/emit_event.js +14 -0
- package/src/app/websockets/index.js +16 -0
- package/src/app/websockets/register.js +175 -0
- package/src/index.js +81 -0
- package/{dist/lib/camelPascalToSnake.js → src/lib/camel_pascal_to_snake.js} +3 -4
- package/src/lib/constants.js +21 -0
- package/src/lib/dynamic_import.js +8 -0
- package/src/lib/escape_html.js +9 -0
- package/src/lib/escape_key_value_pair.js +15 -0
- package/src/lib/float_to_decimal_place.js +5 -0
- package/src/lib/generate_id.js +15 -0
- package/src/lib/get_browser_safe_request.js +17 -0
- package/src/lib/get_joystick_build_path.js +22 -0
- package/src/lib/get_origin.js +7 -0
- package/src/lib/get_platform_safe_path.js +8 -0
- package/src/lib/get_sanitized_context.js +51 -0
- package/src/lib/get_translations.js +109 -0
- package/src/lib/hash_string.js +7 -0
- package/src/lib/is_valid_json.js +10 -0
- package/src/lib/log.js +42 -0
- package/src/lib/node_path_polyfills.js +23 -0
- package/src/lib/parse_json.js +9 -0
- package/src/lib/path_exists.js +12 -0
- package/src/lib/rainbow_road.js +7 -0
- package/src/lib/serialize_query_parameters.js +7 -0
- package/src/lib/set_cookie.js +16 -0
- package/src/lib/string_to_slug.js +14 -0
- package/src/lib/timestamps.js +48 -0
- package/src/lib/types.js +59 -0
- package/src/lib/unset_cookie.js +11 -0
- package/src/lib/wait.js +9 -0
- package/src/test/track_function_call.js +16 -0
- package/README.md +0 -8
- package/_package.json +0 -63
- package/canary.js +0 -12
- package/dist/api/get.js +0 -29
- package/dist/api/getOrigin.js +0 -6
- package/dist/api/index.js +0 -9
- package/dist/api/set.js +0 -29
- package/dist/app/accounts/defaultUserOutputFields.js +0 -9
- package/dist/app/accounts/generateResetToken.js +0 -28
- package/dist/app/accounts/generateSession.js +0 -15
- package/dist/app/accounts/getBrowserSafeUser.js +0 -24
- package/dist/app/accounts/hasLoginTokenExpired.js +0 -17
- package/dist/app/accounts/hashString.js +0 -7
- package/dist/app/accounts/recoverPassword.js +0 -30
- package/dist/app/accounts/resetPassword.js +0 -73
- package/dist/app/accounts/roles/userHasRole.js +0 -7
- package/dist/app/accounts/runUserQuery.js +0 -15
- package/dist/app/accounts/sendEmailVerification.js +0 -65
- package/dist/app/accounts/setAuthenticationCookie.js +0 -11
- package/dist/app/accounts/setPassword.js +0 -45
- package/dist/app/accounts/unsetAuthenticationCookie.js +0 -11
- package/dist/app/accounts/verifyEmail.js +0 -46
- package/dist/app/databases/getTargetDatabase.js +0 -10
- package/dist/app/databases/getTargetDatabaseConnection.js +0 -19
- package/dist/app/databases/getTargetDatabaseProvider.js +0 -10
- package/dist/app/databases/mongodb/buildConnectionString.js +0 -22
- package/dist/app/databases/mongodb/buildQueryParameters.js +0 -14
- package/dist/app/databases/mongodb/index.js +0 -40
- package/dist/app/databases/mongodb/queries/accounts.js +0 -266
- package/dist/app/databases/mongodb/queries/queues.js +0 -111
- package/dist/app/databases/postgresql/addColumnToTable.js +0 -6
- package/dist/app/databases/postgresql/createAccountsIndexes.js +0 -21
- package/dist/app/databases/postgresql/createAccountsTables.js +0 -39
- package/dist/app/databases/postgresql/createDatabase.js +0 -0
- package/dist/app/databases/postgresql/index.js +0 -55
- package/dist/app/databases/postgresql/queries/accounts.js +0 -186
- package/dist/app/databases/postgresql/queries/queues.js +0 -211
- package/dist/app/databases/queryMap.js +0 -17
- package/dist/app/databases/typesMap.js +0 -7
- package/dist/app/getAPIContext.js +0 -25
- package/dist/app/getAPIURLComponent.js +0 -6
- package/dist/app/getBrowserSafeRequest.js +0 -14
- package/dist/app/getOutput.js +0 -74
- package/dist/app/handleProcessErrors.js +0 -73
- package/dist/app/initExpress.js +0 -41
- package/dist/app/middleware/bodyParser.js +0 -16
- package/dist/app/middleware/hmr/client.js +0 -113
- package/dist/app/middleware/index.js +0 -89
- package/dist/app/middleware/render.js +0 -213
- package/dist/app/middleware/requestMethods.js +0 -19
- package/dist/app/registerGetters.js +0 -45
- package/dist/app/registerSetters.js +0 -45
- package/dist/app/runGetter.js +0 -103
- package/dist/app/runSetter.js +0 -103
- package/dist/app/runUploader.js +0 -143
- package/dist/app/sanitizeAPIResponse.js +0 -27
- package/dist/app/utils/process.js +0 -193
- package/dist/app/validateSession.js +0 -19
- package/dist/app/validateUploaderOptions.js +0 -53
- package/dist/app/validateUploads.js +0 -102
- package/dist/email/render.js +0 -50
- package/dist/email/send.js +0 -55
- package/dist/email/templates/base.css +0 -194
- package/dist/email/templates/base.html +0 -28
- package/dist/email/templates/reset-password.js +0 -13
- package/dist/email/validateSMTPSettings.js +0 -27
- package/dist/lib/escapeHTML.js +0 -9
- package/dist/lib/escapeKeyValuePair.js +0 -13
- package/dist/lib/formatAPIError.js +0 -12
- package/dist/lib/formatErrorString.js +0 -8
- package/dist/lib/generateCookie.js +0 -14
- package/dist/lib/generateId.js +0 -13
- package/dist/lib/generateMachineId.js +0 -15
- package/dist/lib/getBuildPath.js +0 -10
- package/dist/lib/getErrorObject.js +0 -9
- package/dist/lib/getPlatformSafeFilePath.js +0 -8
- package/dist/lib/getPlatformSafePath.js +0 -8
- package/dist/lib/getSSLCertificates.js +0 -19
- package/dist/lib/isValidHTTPMethod.js +0 -7
- package/dist/lib/isValidJSONString.js +0 -11
- package/dist/lib/nodeUrlPolyfills.js +0 -14
- package/dist/lib/objectToSQLKeysString.js +0 -18
- package/dist/lib/objectToSQLValuesString.js +0 -16
- package/dist/lib/obscenedb/debounce.js +0 -12
- package/dist/lib/obscenedb/index.js +0 -61
- package/dist/lib/parseDatabasesFromEnvironment.js +0 -9
- package/dist/lib/rainbowRoad.js +0 -7
- package/dist/lib/readDirectory.js +0 -24
- package/dist/lib/replaceBackslashesWithForwardSlashes.js +0 -8
- package/dist/lib/replaceFileProtocol.js +0 -8
- package/dist/lib/replaceForwardSlashesWithBackslashes.js +0 -8
- package/dist/lib/serializeQueryParameters.js +0 -8
- package/dist/lib/serverAvailable.js +0 -0
- package/dist/lib/setCookie.js +0 -16
- package/dist/lib/supportedHTTPMethods.js +0 -4
- package/dist/lib/unsetCookie.js +0 -13
- package/dist/push/logs/index.js +0 -55
- package/dist/settings/index.js +0 -5
- package/dist/settings/load.js +0 -30
- package/dist/ssr/compileCSS.js +0 -85
- package/dist/ssr/findComponentInTree.js +0 -29
- package/dist/ssr/formatCSS.js +0 -6
- package/dist/ssr/getCSSFromTree.js +0 -33
- package/dist/ssr/index.js +0 -441
- package/dist/ssr/replaceWhenTags.js +0 -37
- package/dist/ssr/setHeadTagsInHTML.js +0 -84
- package/dist/validation/index.js +0 -10
- package/dist/validation/index.test.js +0 -463
- package/dist/validation/inputWithSchema/index.js +0 -105
- package/dist/validation/lib/constants.js +0 -162
- package/dist/validation/lib/getValueFromObject.js +0 -12
- package/dist/validation/lib/getValueFromObject.test.js +0 -7
- package/dist/validation/lib/isArrayPath.js +0 -6
- package/dist/validation/lib/throwError.js +0 -6
- package/dist/validation/lib/typeValidators.js +0 -38
- package/dist/validation/lib/validateType.js +0 -33
- package/dist/validation/schema/index.js +0 -44
- package/dist/websockets/emitWebsocketEvent.js +0 -12
- package/dist/websockets/index.js +0 -12
- package/notes +0 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import postgresql from 'pg';
|
|
5
|
+
import sql from '../sql.js';
|
|
6
|
+
|
|
7
|
+
const { Pool } = postgresql;
|
|
8
|
+
|
|
9
|
+
const connect_postgresql = async (database_settings = {}, database_port = 2610) => {
|
|
10
|
+
const connection = database_settings?.connection || {
|
|
11
|
+
hosts: [
|
|
12
|
+
{ hostname: "127.0.0.1", port: database_port },
|
|
13
|
+
],
|
|
14
|
+
database: "app",
|
|
15
|
+
// NOTE: PostgreSQL creates a default superuser based on the OS username.
|
|
16
|
+
username: (os.userInfo() || {}).username || "",
|
|
17
|
+
password: "",
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const host = connection.hosts && connection.hosts[0];
|
|
22
|
+
const connection_config = {
|
|
23
|
+
user: connection?.username || '',
|
|
24
|
+
database: connection?.database,
|
|
25
|
+
password: connection?.password || '',
|
|
26
|
+
host: host?.hostname,
|
|
27
|
+
port: host?.port,
|
|
28
|
+
...(database_settings?.options || {})
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
if (database_settings?.options?.ssl?.ca) {
|
|
32
|
+
connection_config.ssl = {
|
|
33
|
+
ca: fs.readFileSync(database_settings?.options?.ssl?.ca),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const pool = new Pool(connection_config);
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
pool,
|
|
41
|
+
query: (...args) => {
|
|
42
|
+
return pool.query(...args).then((response) => {
|
|
43
|
+
return response?.rows || [];
|
|
44
|
+
}).catch((error) => {
|
|
45
|
+
console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
|
|
46
|
+
console.log(args[0]);
|
|
47
|
+
console.log(`\n`);
|
|
48
|
+
console.log(chalk.redBright(`\nFailed Values:\n`));
|
|
49
|
+
console.log(args[1]);
|
|
50
|
+
|
|
51
|
+
throw error;
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
add_column: (options = {}) => {
|
|
55
|
+
const column = sql.add_column(options);
|
|
56
|
+
return pool.query(column.statement).then((response) => {
|
|
57
|
+
return response?.rows || [];
|
|
58
|
+
}).catch((error) => {
|
|
59
|
+
console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
|
|
60
|
+
console.log(column.statement);
|
|
61
|
+
|
|
62
|
+
throw error;
|
|
63
|
+
});
|
|
64
|
+
},
|
|
65
|
+
create_table: (options = {}) => {
|
|
66
|
+
const table = sql.create_table(options);
|
|
67
|
+
return pool.query(table.statement).then((response) => {
|
|
68
|
+
return response?.rows || [];
|
|
69
|
+
}).catch((error) => {
|
|
70
|
+
console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
|
|
71
|
+
console.log(table.statement);
|
|
72
|
+
|
|
73
|
+
throw error;
|
|
74
|
+
});
|
|
75
|
+
},
|
|
76
|
+
insert: (options = {}) => {
|
|
77
|
+
const insert = sql.insert(options);
|
|
78
|
+
return pool.query(insert.statement, insert.values).then((response) => {
|
|
79
|
+
return response?.rows || [];
|
|
80
|
+
}).catch((error) => {
|
|
81
|
+
console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
|
|
82
|
+
console.log(insert.statement);
|
|
83
|
+
console.log(`\n`);
|
|
84
|
+
console.log(chalk.redBright(`\nFailed Values:\n`));
|
|
85
|
+
console.log(insert.values);
|
|
86
|
+
|
|
87
|
+
throw error;
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
select: (options = {}) => {
|
|
91
|
+
const select = sql.select(options);
|
|
92
|
+
return pool.query(select.statement, select.values).then((response) => {
|
|
93
|
+
return response?.rows || [];
|
|
94
|
+
}).catch((error) => {
|
|
95
|
+
console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
|
|
96
|
+
console.log(select.statement);
|
|
97
|
+
console.log(`\n`);
|
|
98
|
+
console.log(chalk.redBright(`\nFailed Values:\n`));
|
|
99
|
+
console.log(select.where);
|
|
100
|
+
|
|
101
|
+
throw error;
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
update: (options = {}) => {
|
|
105
|
+
const update = sql.update(options);
|
|
106
|
+
return pool.query(update.statement, update.values).then((response) => {
|
|
107
|
+
return response?.rows || [];
|
|
108
|
+
}).catch((error) => {
|
|
109
|
+
console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
|
|
110
|
+
console.log(update.statement);
|
|
111
|
+
console.log(`\n`);
|
|
112
|
+
console.log(chalk.redBright(`\nFailed Values:\n`));
|
|
113
|
+
console.log(update.values);
|
|
114
|
+
|
|
115
|
+
throw error;
|
|
116
|
+
});
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
} catch (exception) {
|
|
120
|
+
console.warn(
|
|
121
|
+
chalk.yellowBright(
|
|
122
|
+
`\nFailed to connect to PostgreSQL. Please double-check connection settings and try again.\n\nError from PostgreSQL:\n\n${chalk.redBright(exception?.message)}`
|
|
123
|
+
),
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export default connect_postgresql;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import cron from 'node-cron';
|
|
2
|
+
import types from "../../../lib/types.js";
|
|
3
|
+
import handle_cleanup_sessions from "./handle_cleanup_sessions.js";
|
|
4
|
+
|
|
5
|
+
const create_unique_index = async (target_database = '', index_name = '', table_name = '', table_columns = []) => {
|
|
6
|
+
return process.databases[target_database]?.query(`CREATE UNIQUE INDEX IF NOT EXISTS ${index_name} ON ${table_name}(${table_columns.join(', ')})`);
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const create_index = async (target_database = '', index_name = '', table_name = '', table_columns = []) => {
|
|
10
|
+
return process.databases[target_database]?.query(`CREATE INDEX IF NOT EXISTS ${index_name} ON ${table_name}(${table_columns.join(', ')})`);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const indexes = {
|
|
14
|
+
// NOTE: queue indexes are set dynamically when initializing the queue in
|
|
15
|
+
// app/databases/queries/<provider>/queues.js initialize_database function
|
|
16
|
+
// to account for developer customization options.
|
|
17
|
+
sessions: async () => {
|
|
18
|
+
await create_index('_sessions', 'session_by_id', 'sessions', ['session_id']);
|
|
19
|
+
await create_index('_sessions', 'session_created_at', 'sessions', ['created_at']);
|
|
20
|
+
|
|
21
|
+
// NOTE: Simulate a TTL index using cron to wipe out sessions older than 1 hour.
|
|
22
|
+
cron.schedule('*/30 * * * * *', () => {
|
|
23
|
+
handle_cleanup_sessions();
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
users: async () => {
|
|
27
|
+
// users
|
|
28
|
+
await create_index('_users', 'user_by_email', 'users', ['email_address']);
|
|
29
|
+
await create_index('_users', 'user_by_username', 'users', ['username']);
|
|
30
|
+
await create_index('_users', 'user_by_user_id', 'users', ['user_id']);
|
|
31
|
+
|
|
32
|
+
// users_sessions
|
|
33
|
+
await create_index('user_session_by_token', 'users_sessions', ['token']);
|
|
34
|
+
|
|
35
|
+
// users_password_reset_tokens
|
|
36
|
+
await create_index('_users', 'user_password_reset_token_by_token', 'users_password_reset_tokens', ['token']);
|
|
37
|
+
await create_index('_users', 'user_password_reset_token_by_user_id_token', 'users_password_reset_tokens', ['user_id', 'token']);
|
|
38
|
+
|
|
39
|
+
// users_roles
|
|
40
|
+
await create_index('_users', 'user_role', 'users_roles', ['role']);
|
|
41
|
+
await create_index('_users', 'user_roles_by_user_id_role', 'users_roles', ['user_id', 'role']);
|
|
42
|
+
|
|
43
|
+
// roles
|
|
44
|
+
await create_index('_users', 'role', 'roles', ['role']);
|
|
45
|
+
await create_unique_index('_users', 'user_roles', 'users_roles', ['user_id', 'role']);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const create_indexes = async (database_types_to_index = []) => {
|
|
50
|
+
for (let i = 0; i < database_types_to_index?.length; i += 1) {
|
|
51
|
+
const database_type = database_types_to_index[i];
|
|
52
|
+
if (types.is_function(indexes[database_type])) {
|
|
53
|
+
await indexes[database_type]();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export default create_indexes;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import types from "../../../lib/types.js";
|
|
2
|
+
|
|
3
|
+
const create_table = (target_database = '', table_name = '', table_columns = []) => {
|
|
4
|
+
return process.databases[target_database]?.query(
|
|
5
|
+
`CREATE TABLE IF NOT EXISTS ${table_name} (${table_columns.join(", ")})`
|
|
6
|
+
);
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const tables = {
|
|
10
|
+
// NOTE: queue tables are created dynamically when initializing the queue in
|
|
11
|
+
// app/databases/queries/<provider>/queues.js initialize_database function
|
|
12
|
+
// to account for dynamic table names.
|
|
13
|
+
sessions: async () => {
|
|
14
|
+
await create_table('_sessions', 'sessions', [
|
|
15
|
+
'id bigserial primary key',
|
|
16
|
+
'session_id text',
|
|
17
|
+
'csrf text',
|
|
18
|
+
'created_at text'
|
|
19
|
+
]);
|
|
20
|
+
},
|
|
21
|
+
users: async () => {
|
|
22
|
+
await create_table('_users', 'users', [
|
|
23
|
+
'id bigserial primary key',
|
|
24
|
+
'user_id text',
|
|
25
|
+
'email_address text',
|
|
26
|
+
'password text',
|
|
27
|
+
'username text',
|
|
28
|
+
'language text',
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
await create_table('_users', 'users_sessions', [
|
|
32
|
+
'id bigserial primary key',
|
|
33
|
+
'user_id text',
|
|
34
|
+
'token text',
|
|
35
|
+
'token_expires_at text',
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
await create_table('_users', 'users_password_reset_tokens', [
|
|
39
|
+
'id bigserial primary key',
|
|
40
|
+
'user_id text',
|
|
41
|
+
'token text',
|
|
42
|
+
'requested_at text',
|
|
43
|
+
]);
|
|
44
|
+
|
|
45
|
+
await create_table('_users', 'users_verify_email_tokens', [
|
|
46
|
+
'id bigserial primary key',
|
|
47
|
+
'user_id text',
|
|
48
|
+
'token text',
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
await create_table('_users', 'roles', ['id bigserial primary key', 'role text']);
|
|
52
|
+
|
|
53
|
+
await create_table('_users', 'users_roles', [
|
|
54
|
+
'id bigserial primary key',
|
|
55
|
+
'user_id text',
|
|
56
|
+
'role text',
|
|
57
|
+
]);
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const create_tables = async (database_types_to_index = []) => {
|
|
62
|
+
for (let i = 0; i < database_types_to_index?.length; i += 1) {
|
|
63
|
+
const database_type = database_types_to_index[i];
|
|
64
|
+
if (types.is_function(tables[database_type])) {
|
|
65
|
+
await tables[database_type]();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export default create_tables;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import timestamps from "../../../lib/timestamps.js";
|
|
2
|
+
|
|
3
|
+
const handle_cleanup_queues = async ({
|
|
4
|
+
database = {},
|
|
5
|
+
table = '',
|
|
6
|
+
seconds = 0,
|
|
7
|
+
}) => {
|
|
8
|
+
const jobs_with_status = await database.query(`
|
|
9
|
+
SELECT * FROM ${table} WHERE status = ANY($1) AND environment = $2
|
|
10
|
+
`, [
|
|
11
|
+
['completed', 'failed'],
|
|
12
|
+
process.env.NODE_ENV,
|
|
13
|
+
]);
|
|
14
|
+
|
|
15
|
+
const jobs_to_cleanup = jobs_with_status?.filter((job = {}) => {
|
|
16
|
+
if (job?.status === 'completed') {
|
|
17
|
+
const completed_at_with_seconds = timestamps.get_future_time('seconds', seconds, { start_from: job?.completed_at });
|
|
18
|
+
return completed_at_with_seconds <= timestamps.get_current_time();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (job?.status === 'failed') {
|
|
22
|
+
const failed_at_with_seconds = timestamps.get_future_time('seconds', seconds, { start_from: job?.failed_at });
|
|
23
|
+
return failed_at_with_seconds <= timestamps.get_current_time();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return false;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
await database.query(`
|
|
30
|
+
DELETE FROM ${table} WHERE _id = ANY($1)
|
|
31
|
+
`, [
|
|
32
|
+
jobs_to_cleanup?.map(({ _id }) => _id)
|
|
33
|
+
]);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export default handle_cleanup_queues;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import get_target_database_connection from "../get_target_database_connection.js";
|
|
2
|
+
import query_map from "./map.js";
|
|
3
|
+
|
|
4
|
+
const accounts_query = async (query_name = "", inputs = {}) => {
|
|
5
|
+
const users_database = get_target_database_connection('users');
|
|
6
|
+
const query_map_for_database = users_database && query_map && query_map[users_database?.provider] && query_map[users_database?.provider]?.accounts;
|
|
7
|
+
const query = query_map_for_database && query_map_for_database[query_name];
|
|
8
|
+
|
|
9
|
+
if (users_database?.connection && query) {
|
|
10
|
+
const response = await query_map_for_database[query_name](inputs, users_database?.connection);
|
|
11
|
+
return Promise.resolve(response);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return null;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default accounts_query;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import mongodb_accounts_queries from './mongodb/accounts.js';
|
|
2
|
+
import mongodb_queues_queries from './mongodb/queues.js';
|
|
3
|
+
import mongodb_sessions_queries from './mongodb/sessions.js';
|
|
4
|
+
import postgresql_accounts_queries from './postgresql/accounts.js';
|
|
5
|
+
import postgresql_queues_queries from './postgresql/queues.js';
|
|
6
|
+
import postgresql_sessions_queries from './postgresql/sessions.js';
|
|
7
|
+
|
|
8
|
+
const map = {
|
|
9
|
+
mongodb: {
|
|
10
|
+
accounts: mongodb_accounts_queries,
|
|
11
|
+
queues: mongodb_queues_queries,
|
|
12
|
+
sessions: mongodb_sessions_queries,
|
|
13
|
+
},
|
|
14
|
+
postgresql: {
|
|
15
|
+
accounts: postgresql_accounts_queries,
|
|
16
|
+
queues: postgresql_queues_queries,
|
|
17
|
+
sessions: postgresql_sessions_queries,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export default map;
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import generate_id from "../../../../lib/generate_id.js";
|
|
2
|
+
|
|
3
|
+
const accounts = {
|
|
4
|
+
add_password_reset_token: (input = {}) => {
|
|
5
|
+
return process.databases._users?.collection("users").updateOne({
|
|
6
|
+
emailAddress: input.email_address,
|
|
7
|
+
}, {
|
|
8
|
+
$addToSet: {
|
|
9
|
+
passwordResetTokens: {
|
|
10
|
+
token: input.token,
|
|
11
|
+
requestedAt: new Date().toISOString(),
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
},
|
|
16
|
+
add_role: async (input = {}) => {
|
|
17
|
+
const existing_role = input?.role
|
|
18
|
+
? await process.databases._users?.collection("roles").findOne({ role: input?.role })
|
|
19
|
+
: null;
|
|
20
|
+
|
|
21
|
+
if (!existing_role && input?.role) {
|
|
22
|
+
await process.databases._users?.collection("roles").insertOne({
|
|
23
|
+
_id: generate_id(16),
|
|
24
|
+
role: input?.role,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
_id: input?.user_id,
|
|
29
|
+
action: "add",
|
|
30
|
+
role: input?.role,
|
|
31
|
+
ok: true,
|
|
32
|
+
error: null,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
action: "add",
|
|
38
|
+
role: input?.role,
|
|
39
|
+
ok: false,
|
|
40
|
+
error: input?.role
|
|
41
|
+
? `Role already exists: ${input?.role}.`
|
|
42
|
+
: `Must pass a name for role to add.`,
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
add_session: async (input = {}) => {
|
|
46
|
+
await process.databases._users?.collection("users").updateOne({
|
|
47
|
+
_id: input.user_id,
|
|
48
|
+
}, {
|
|
49
|
+
$addToSet: {
|
|
50
|
+
sessions: input.session,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
create_email_verification_token: async (input = {}) => {
|
|
55
|
+
const token = generate_id(16);
|
|
56
|
+
|
|
57
|
+
await process.databases._users?.collection("users").updateOne({
|
|
58
|
+
_id: input?.user_id,
|
|
59
|
+
}, {
|
|
60
|
+
$addToSet: {
|
|
61
|
+
verifyEmailTokens: {
|
|
62
|
+
userId: input?.user_id,
|
|
63
|
+
token,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
return token;
|
|
69
|
+
},
|
|
70
|
+
create_user: async (input = {}) => {
|
|
71
|
+
const user_id = generate_id(16);
|
|
72
|
+
await process.databases._users?.collection("users").insertOne({
|
|
73
|
+
_id: user_id,
|
|
74
|
+
...input,
|
|
75
|
+
sessions: [],
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
return user_id;
|
|
79
|
+
},
|
|
80
|
+
delete_old_sessions: async (input = {}) => {
|
|
81
|
+
const user = await process.databases._users?.collection('users').findOne({
|
|
82
|
+
_id: input?.user_id,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
if (user) {
|
|
86
|
+
const sessions = user?.sessions?.filter((session) => {
|
|
87
|
+
// NOTE: If tokenExpiresAt is after today, it hasn't expired yet, so keep it.
|
|
88
|
+
return new Date(session?.tokenExpiresAt || session?.token_expires_at).toISOString() > new Date().toISOString();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
await process.databases._users?.collection("users").updateOne({
|
|
92
|
+
_id: input.user_id,
|
|
93
|
+
}, {
|
|
94
|
+
$set: {
|
|
95
|
+
sessions,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
delete_user: async (input = {}) => {
|
|
101
|
+
return process.databases._users?.collection('users').deleteOne({
|
|
102
|
+
_id: input?.user_id,
|
|
103
|
+
});
|
|
104
|
+
},
|
|
105
|
+
existing_user: async (input = {}) => {
|
|
106
|
+
let existing_user_with_email_address;
|
|
107
|
+
let existing_user_with_username;
|
|
108
|
+
|
|
109
|
+
if (input?.email_address) {
|
|
110
|
+
existing_user_with_email_address = await process.databases._users?.collection("users").findOne({ emailAddress: input.email_address });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (input?.username) {
|
|
114
|
+
existing_user_with_username = await process.databases._users?.collection("users").findOne({ username: input.username });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return existing_user_with_email_address || existing_user_with_username ? {
|
|
118
|
+
existing_email_address: existing_user_with_email_address?.emailAddress,
|
|
119
|
+
existing_username: existing_user_with_username?.username,
|
|
120
|
+
} : null;
|
|
121
|
+
},
|
|
122
|
+
get_existing_session: async (input = {}) => {
|
|
123
|
+
const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
|
|
124
|
+
|
|
125
|
+
if (user?.sessions?.length > 0) {
|
|
126
|
+
const sessions_by_last_to_expire = user?.sessions.sort((a, b) => {
|
|
127
|
+
return (a.tokenExpiresAt || a.token_expires_at) > (b.tokenExpiresAt || b.token_expires_at) ? -1 : 1;
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
return sessions_by_last_to_expire.shift();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return null;
|
|
134
|
+
},
|
|
135
|
+
get_password_reset_token: async (input = {}) => {
|
|
136
|
+
const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
|
|
137
|
+
|
|
138
|
+
if (user) {
|
|
139
|
+
return user?.passwordResetTokens && user?.passwordResetTokens[0]?.token || null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return null;
|
|
143
|
+
},
|
|
144
|
+
grant_role: async (input = {}) => {
|
|
145
|
+
const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
|
|
146
|
+
|
|
147
|
+
if (user) {
|
|
148
|
+
await process.databases._users?.collection("users").updateOne({
|
|
149
|
+
_id: input?.user_id
|
|
150
|
+
}, {
|
|
151
|
+
$addToSet: {
|
|
152
|
+
roles: input?.role,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const existing_role = await process.databases._users?.collection("roles").findOne({ role: input?.role });
|
|
157
|
+
|
|
158
|
+
if (!existing_role) {
|
|
159
|
+
await process.databases._users?.collection("roles").insertOne({
|
|
160
|
+
_id: generate_id(16),
|
|
161
|
+
role: input?.role,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
_id: input?.user_id,
|
|
167
|
+
action: "grant",
|
|
168
|
+
role: input?.role,
|
|
169
|
+
ok: true,
|
|
170
|
+
error: null,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return {
|
|
175
|
+
_id: input?.user_id,
|
|
176
|
+
action: "grant",
|
|
177
|
+
role: input?.role,
|
|
178
|
+
ok: false,
|
|
179
|
+
error: `User not found with the _id ${input?.user_id}.`,
|
|
180
|
+
};
|
|
181
|
+
},
|
|
182
|
+
list_roles: async () => {
|
|
183
|
+
const roles = await process.databases._users?.collection("roles").find().toArray();
|
|
184
|
+
return (roles || []).map(({ role }) => role);
|
|
185
|
+
},
|
|
186
|
+
mark_email_verified_at: async (input = {}) => {
|
|
187
|
+
const user = await process.databases._users?.collection("users").findOne({
|
|
188
|
+
_id: input?.user_id,
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
await process.databases._users?.collection("users").updateOne({
|
|
192
|
+
_id: input?.user_id,
|
|
193
|
+
}, {
|
|
194
|
+
$set: {
|
|
195
|
+
emailVerified: true,
|
|
196
|
+
emailVerifiedAt: new Date().toISOString(),
|
|
197
|
+
verifyEmailTokens: user?.verifyEmailTokens?.filter(
|
|
198
|
+
(verify_email_token) => {
|
|
199
|
+
return verify_email_token?.token === input?.token;
|
|
200
|
+
}
|
|
201
|
+
),
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
return true;
|
|
206
|
+
},
|
|
207
|
+
remove_reset_token: async (input = {}) => {
|
|
208
|
+
const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
|
|
209
|
+
|
|
210
|
+
await process.databases._users?.collection("users").updateOne({
|
|
211
|
+
_id: input?.user_id,
|
|
212
|
+
}, {
|
|
213
|
+
$set: {
|
|
214
|
+
passwordResetTokens: user?.passwordResetTokens?.filter(
|
|
215
|
+
({ token }) => {
|
|
216
|
+
return token !== input?.token;
|
|
217
|
+
}
|
|
218
|
+
),
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
return process.databases._users?.collection("users").findOne({ _id: input?.user_id });
|
|
223
|
+
},
|
|
224
|
+
remove_role: async (input = {}) => {
|
|
225
|
+
const existing_role = input?.role
|
|
226
|
+
? await process.databases._users?.collection("roles").findOne({ role: input?.role })
|
|
227
|
+
: null;
|
|
228
|
+
|
|
229
|
+
if (existing_role) {
|
|
230
|
+
await process.databases._users?.collection("users").updateMany({
|
|
231
|
+
roles: { $in: [input?.role] },
|
|
232
|
+
}, {
|
|
233
|
+
$pull: {
|
|
234
|
+
roles: input?.role,
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
await process.databases._users?.collection("roles").deleteOne({
|
|
239
|
+
role: input?.role,
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
return {
|
|
243
|
+
_id: input?.user_id,
|
|
244
|
+
action: "remove",
|
|
245
|
+
role: input?.role,
|
|
246
|
+
ok: true,
|
|
247
|
+
error: null,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return {
|
|
252
|
+
action: "add",
|
|
253
|
+
role: input?.role,
|
|
254
|
+
ok: false,
|
|
255
|
+
error: `Could not find an existing role with the name ${input?.role}.`,
|
|
256
|
+
};
|
|
257
|
+
},
|
|
258
|
+
reset_user_sessions: async (input = {}) => {
|
|
259
|
+
const user = await process.databases._users?.collection('users').findOne({
|
|
260
|
+
_id: input?.user_id,
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
if (user) {
|
|
264
|
+
await process.databases._users?.collection("users").updateOne({
|
|
265
|
+
_id: input.user_id,
|
|
266
|
+
}, {
|
|
267
|
+
$set: {
|
|
268
|
+
sessions: [],
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
revoke_role: async (input = {}) => {
|
|
274
|
+
const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
|
|
275
|
+
if (user && user.roles) {
|
|
276
|
+
await process.databases._users?.collection("users").updateOne({
|
|
277
|
+
_id: input?.user_id
|
|
278
|
+
}, {
|
|
279
|
+
$pull: {
|
|
280
|
+
roles: input?.role,
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
return {
|
|
285
|
+
_id: input?.user_id,
|
|
286
|
+
action: "revoke",
|
|
287
|
+
role: input?.role,
|
|
288
|
+
ok: true,
|
|
289
|
+
error: null,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return {
|
|
294
|
+
_id: input?.user_id,
|
|
295
|
+
action: "revoke",
|
|
296
|
+
role: input?.role,
|
|
297
|
+
ok: false,
|
|
298
|
+
error: `User not found with the _id ${input?.user_id}.`,
|
|
299
|
+
};
|
|
300
|
+
},
|
|
301
|
+
set_new_password: async (input = {}) => {
|
|
302
|
+
return process.databases._users?.collection("users").updateOne({
|
|
303
|
+
_id: input?.user_id,
|
|
304
|
+
}, {
|
|
305
|
+
$set: {
|
|
306
|
+
password: input?.hashed_password,
|
|
307
|
+
},
|
|
308
|
+
});
|
|
309
|
+
},
|
|
310
|
+
user: async (input = {}) => {
|
|
311
|
+
if (input?.email_address) {
|
|
312
|
+
const user = await process.databases._users?.collection("users").findOne({ emailAddress: input.email_address });
|
|
313
|
+
return user;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (input?.username) {
|
|
317
|
+
const user = await process.databases._users?.collection("users").findOne({ username: input.username });
|
|
318
|
+
return user;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (input?._id) {
|
|
322
|
+
const user = await process.databases._users?.collection("users").findOne({ _id: input._id });
|
|
323
|
+
return user;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
return null;
|
|
327
|
+
},
|
|
328
|
+
user_has_role: async (input = {}) => {
|
|
329
|
+
const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
|
|
330
|
+
|
|
331
|
+
if (user && user.roles) {
|
|
332
|
+
return user?.roles?.includes(input?.role);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return false;
|
|
336
|
+
},
|
|
337
|
+
user_with_login_token: async (input = {}) => {
|
|
338
|
+
const user = await process.databases._users?.collection("users").findOne({
|
|
339
|
+
"sessions.token": input?.token,
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
return user;
|
|
343
|
+
},
|
|
344
|
+
user_with_reset_token: async (input = {}) => {
|
|
345
|
+
const user = await process.databases._users?.collection("users").findOne({
|
|
346
|
+
"passwordResetTokens.token": input["passwordResetTokens.token"],
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
return user;
|
|
350
|
+
},
|
|
351
|
+
user_with_verify_email_token: async (input = {}) => {
|
|
352
|
+
const user = await process.databases._users?.collection("users").findOne({
|
|
353
|
+
"verifyEmailTokens.token": input?.token,
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
return user;
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
export default accounts;
|