neeto-commons-backend 1.0.89

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. checksums.yaml +7 -0
  2. data/.eslintignore +14 -0
  3. data/.eslintrc.js +87 -0
  4. data/.husky/helpers/verify_neeto_audit.sh +18 -0
  5. data/.husky/pre-push +5 -0
  6. data/.neetoci/neetoci.yml +26 -0
  7. data/.prettierrc.js +15 -0
  8. data/.rubocop.yml +626 -0
  9. data/.ruby-version +1 -0
  10. data/.semaphore/semaphore.yml +32 -0
  11. data/.semaphore/staging-deploy.yml +23 -0
  12. data/Gemfile +92 -0
  13. data/Gemfile.lock +461 -0
  14. data/README.md +286 -0
  15. data/Rakefile +18 -0
  16. data/app/controllers/api/base_controller.rb +6 -0
  17. data/app/controllers/neeto_commons_backend/api/base_controller.rb +9 -0
  18. data/app/controllers/neeto_commons_backend/api/direct_uploads_controller.rb +57 -0
  19. data/app/controllers/neeto_commons_backend/app_versions_controller.rb +20 -0
  20. data/app/controllers/neeto_commons_backend/failures_controller.rb +29 -0
  21. data/app/controllers/neeto_commons_backend/health_check_controller.rb +9 -0
  22. data/app/controllers/neeto_commons_backend/well_knowns_controller.rb +13 -0
  23. data/app/mailers/neeto_commons_backend/application_mailer.rb +22 -0
  24. data/app/models/concerns/neeto_commons_backend/sluggable.rb +27 -0
  25. data/app/models/concerns/neeto_commons_backend/soft_deletable.rb +20 -0
  26. data/app/services/neeto_commons_backend/sample_data/common/admin_service.rb +26 -0
  27. data/app/services/neeto_commons_backend/sample_data/common/app_organization_service.rb +11 -0
  28. data/app/services/neeto_commons_backend/sample_data/common/base.rb +49 -0
  29. data/app/services/neeto_commons_backend/sample_data/common/database_cleanup_service.rb +13 -0
  30. data/app/services/neeto_commons_backend/sample_data/common/loader_service.rb +30 -0
  31. data/app/services/neeto_commons_backend/sample_data/common/neeto_team_members_service.rb +16 -0
  32. data/app/services/neeto_commons_backend/sample_data/common/organization_base.rb +36 -0
  33. data/app/services/neeto_commons_backend/sample_data/common/organization_service.rb +11 -0
  34. data/app/services/neeto_commons_backend/source_map_publish_service.rb +47 -0
  35. data/app/views/neeto_commons_backend/failures/show.html.erb +1 -0
  36. data/app/views/shared/_common.html.erb +8 -0
  37. data/app/views/shared/_neeto_engineering_replay_widget.html.erb +31 -0
  38. data/app/views/shared/_neeto_widget.html.erb +30 -0
  39. data/app/workers/neeto_commons_backend/base_workers/auth.rb +9 -0
  40. data/app/workers/neeto_commons_backend/base_workers/base.rb +52 -0
  41. data/app/workers/neeto_commons_backend/base_workers/default.rb +8 -0
  42. data/app/workers/neeto_commons_backend/base_workers/low.rb +9 -0
  43. data/app/workers/neeto_commons_backend/base_workers/urgent.rb +9 -0
  44. data/app/workers/neeto_commons_backend/purge_unattached_files_worker.rb +11 -0
  45. data/babel.config.js +47 -0
  46. data/bin/console +15 -0
  47. data/bin/rails +16 -0
  48. data/bin/setup +8 -0
  49. data/config/brakeman.ignore +52 -0
  50. data/config/locales/en.yml +5 -0
  51. data/docs/carriers/README.md +5 -0
  52. data/docs/controller_concerns/README.md +34 -0
  53. data/docs/controllers/README.md +27 -0
  54. data/docs/gemfiles/README.md +5 -0
  55. data/docs/helpers/README.md +21 -0
  56. data/docs/mailers/README.md +5 -0
  57. data/docs/model_concerns/README.md +39 -0
  58. data/docs/routes/README.md +44 -0
  59. data/docs/scripts/README.md +5 -0
  60. data/docs/semaphore/README.md +5 -0
  61. data/docs/services/README.md +23 -0
  62. data/docs/workers/README.md +32 -0
  63. data/docs/workflows/README.md +9 -0
  64. data/lib/Rakefile +4 -0
  65. data/lib/neeto-commons-backend.rb +62 -0
  66. data/lib/neeto_commons_backend/.circleci/config.yml +84 -0
  67. data/lib/neeto_commons_backend/.slugignore +17 -0
  68. data/lib/neeto_commons_backend/carriers/app_url_carrier.rb +71 -0
  69. data/lib/neeto_commons_backend/common_files/.bundler-version +1 -0
  70. data/lib/neeto_commons_backend/common_files/.editorconfig +10 -0
  71. data/lib/neeto_commons_backend/common_files/.erb-lint.yml +20 -0
  72. data/lib/neeto_commons_backend/common_files/.eslintignore +14 -0
  73. data/lib/neeto_commons_backend/common_files/.eslintrc.js +2 -0
  74. data/lib/neeto_commons_backend/common_files/.gitignore +132 -0
  75. data/lib/neeto_commons_backend/common_files/.husky/helpers/lint_staged.sh +5 -0
  76. data/lib/neeto_commons_backend/common_files/.husky/helpers/prevent_conflict_markers.sh +35 -0
  77. data/lib/neeto_commons_backend/common_files/.husky/helpers/prevent_pushing_to_main.sh +24 -0
  78. data/lib/neeto_commons_backend/common_files/.husky/helpers/verify_neeto_audit.sh +17 -0
  79. data/lib/neeto_commons_backend/common_files/.husky/pre-commit +9 -0
  80. data/lib/neeto_commons_backend/common_files/.husky/pre-push +7 -0
  81. data/lib/neeto_commons_backend/common_files/.node-version +1 -0
  82. data/lib/neeto_commons_backend/common_files/.nvmrc +1 -0
  83. data/lib/neeto_commons_backend/common_files/.postcssrc.yml +6 -0
  84. data/lib/neeto_commons_backend/common_files/.prettierrc.js +1 -0
  85. data/lib/neeto_commons_backend/common_files/.rubocop.yml +625 -0
  86. data/lib/neeto_commons_backend/common_files/.ruby-version +1 -0
  87. data/lib/neeto_commons_backend/common_files/.semaphore/commands/run_eslint_on_modified_files.sh +5 -0
  88. data/lib/neeto_commons_backend/common_files/.vscode/extensions.json +10 -0
  89. data/lib/neeto_commons_backend/common_files/.vscode/settings.json +21 -0
  90. data/lib/neeto_commons_backend/common_files/Dockerfile.dev +50 -0
  91. data/lib/neeto_commons_backend/common_files/app/javascript/jsconfig.json +62 -0
  92. data/lib/neeto_commons_backend/common_files/app/javascript/src/types.d.ts +36 -0
  93. data/lib/neeto_commons_backend/common_files/babel.config.js +1 -0
  94. data/lib/neeto_commons_backend/common_files/bin/bundle +5 -0
  95. data/lib/neeto_commons_backend/common_files/bin/rails +6 -0
  96. data/lib/neeto_commons_backend/common_files/bin/rake +6 -0
  97. data/lib/neeto_commons_backend/common_files/bin/setup +40 -0
  98. data/lib/neeto_commons_backend/common_files/bin/update +33 -0
  99. data/lib/neeto_commons_backend/common_files/bin/webpacker +17 -0
  100. data/lib/neeto_commons_backend/common_files/bin/webpacker-dev-server +17 -0
  101. data/lib/neeto_commons_backend/common_files/bin/yarn +19 -0
  102. data/lib/neeto_commons_backend/common_files/cypress-tests/.eslintrc.js +57 -0
  103. data/lib/neeto_commons_backend/common_files/cypress-tests/cypress/plugins/index.js +63 -0
  104. data/lib/neeto_commons_backend/common_files/github/workflows/auto_update_prs_with_latest_master.yml +21 -0
  105. data/lib/neeto_commons_backend/common_files/neeto_gems/github/workflows/bump_version.yml +51 -0
  106. data/lib/neeto_commons_backend/common_files/newrelic.yml +31 -0
  107. data/lib/neeto_commons_backend/common_files/package-common.json +119 -0
  108. data/lib/neeto_commons_backend/common_files/roles.yml +34 -0
  109. data/lib/neeto_commons_backend/common_files/semaphore/semaphore.yml +58 -0
  110. data/lib/neeto_commons_backend/common_files/sitemap.xml +15 -0
  111. data/lib/neeto_commons_backend/common_files/test/support/assertion_support.rb +9 -0
  112. data/lib/neeto_commons_backend/common_files/webpacker.yml +90 -0
  113. data/lib/neeto_commons_backend/config/secrets.yml +169 -0
  114. data/lib/neeto_commons_backend/controllers/concerns/api_exceptions.rb +83 -0
  115. data/lib/neeto_commons_backend/controllers/concerns/api_helpers.rb +9 -0
  116. data/lib/neeto_commons_backend/controllers/concerns/api_responders.rb +33 -0
  117. data/lib/neeto_commons_backend/controllers/concerns/authenticatable.rb +51 -0
  118. data/lib/neeto_commons_backend/controllers/concerns/honeybadger_context.rb +17 -0
  119. data/lib/neeto_commons_backend/controllers/concerns/store_user_location.rb +23 -0
  120. data/lib/neeto_commons_backend/cypress/cypress.review.json +13 -0
  121. data/lib/neeto_commons_backend/cypress/jsconfig.json +17 -0
  122. data/lib/neeto_commons_backend/cypress/package.json +51 -0
  123. data/lib/neeto_commons_backend/cypress/resolve.js +16 -0
  124. data/lib/neeto_commons_backend/cypress/webpack.config.js +21 -0
  125. data/lib/neeto_commons_backend/engine.rb +6 -0
  126. data/lib/neeto_commons_backend/environments/application.rb +33 -0
  127. data/lib/neeto_commons_backend/environments/development.rb +46 -0
  128. data/lib/neeto_commons_backend/environments/heroku.rb +35 -0
  129. data/lib/neeto_commons_backend/environments/production.rb +45 -0
  130. data/lib/neeto_commons_backend/environments/staging.rb +43 -0
  131. data/lib/neeto_commons_backend/environments/test.rb +29 -0
  132. data/lib/neeto_commons_backend/gemfiles/Gemfile.common.rb +240 -0
  133. data/lib/neeto_commons_backend/helpers/auth_server_api.rb +92 -0
  134. data/lib/neeto_commons_backend/helpers/favicon.rb +18 -0
  135. data/lib/neeto_commons_backend/helpers/global_props.rb +76 -0
  136. data/lib/neeto_commons_backend/helpers/neeto_widget_helper.rb +19 -0
  137. data/lib/neeto_commons_backend/helpers/test_helper.rb +90 -0
  138. data/lib/neeto_commons_backend/initializers/_enable_extension_hack.rb +32 -0
  139. data/lib/neeto_commons_backend/initializers/assets.rb +11 -0
  140. data/lib/neeto_commons_backend/initializers/bullet.rb +26 -0
  141. data/lib/neeto_commons_backend/initializers/cache_store.rb +27 -0
  142. data/lib/neeto_commons_backend/initializers/common.rb +33 -0
  143. data/lib/neeto_commons_backend/initializers/cookies_serializer.rb +11 -0
  144. data/lib/neeto_commons_backend/initializers/cors.rb +16 -0
  145. data/lib/neeto_commons_backend/initializers/database_cleaner.rb +11 -0
  146. data/lib/neeto_commons_backend/initializers/datetime.rb +14 -0
  147. data/lib/neeto_commons_backend/initializers/email_setup.rb +25 -0
  148. data/lib/neeto_commons_backend/initializers/filter_parameter_logging.rb +11 -0
  149. data/lib/neeto_commons_backend/initializers/honeybadger.rb +23 -0
  150. data/lib/neeto_commons_backend/initializers/kaminari_config.rb +13 -0
  151. data/lib/neeto_commons_backend/initializers/mime_types.rb +12 -0
  152. data/lib/neeto_commons_backend/initializers/mini_profiler.rb +14 -0
  153. data/lib/neeto_commons_backend/initializers/neeto_email_prefixer.rb +40 -0
  154. data/lib/neeto_commons_backend/initializers/neeto_mail_interceptor.rb +35 -0
  155. data/lib/neeto_commons_backend/initializers/post_compilation.rb +17 -0
  156. data/lib/neeto_commons_backend/initializers/rack_attack.rb +38 -0
  157. data/lib/neeto_commons_backend/initializers/rack_deflater.rb +11 -0
  158. data/lib/neeto_commons_backend/initializers/rack_timeout.rb +15 -0
  159. data/lib/neeto_commons_backend/initializers/rails_email_preview.rb +21 -0
  160. data/lib/neeto_commons_backend/initializers/redis_client_patch.rb +18 -0
  161. data/lib/neeto_commons_backend/initializers/remove_backtrace_silencers.rb +11 -0
  162. data/lib/neeto_commons_backend/initializers/session_store.rb +21 -0
  163. data/lib/neeto_commons_backend/initializers/shared_redis.rb +13 -0
  164. data/lib/neeto_commons_backend/initializers/sidekiq.rb +46 -0
  165. data/lib/neeto_commons_backend/initializers/strong_migrations.rb +13 -0
  166. data/lib/neeto_commons_backend/initializers/wrap_parameters.rb +13 -0
  167. data/lib/neeto_commons_backend/models/concerns/devise_validator.rb +19 -0
  168. data/lib/neeto_commons_backend/railtie.rb +20 -0
  169. data/lib/neeto_commons_backend/routes/catch_all.rb +9 -0
  170. data/lib/neeto_commons_backend/routes/devise.rb +16 -0
  171. data/lib/neeto_commons_backend/routes/direct_uploads.rb +9 -0
  172. data/lib/neeto_commons_backend/routes/draw.rb +29 -0
  173. data/lib/neeto_commons_backend/routes/email_previews.rb +5 -0
  174. data/lib/neeto_commons_backend/routes/errors.rb +7 -0
  175. data/lib/neeto_commons_backend/routes/health.rb +8 -0
  176. data/lib/neeto_commons_backend/routes/letter_opener.rb +5 -0
  177. data/lib/neeto_commons_backend/routes/sidekiq.rb +22 -0
  178. data/lib/neeto_commons_backend/routes/well_knowns.rb +10 -0
  179. data/lib/neeto_commons_backend/scripts/sync_with_wheel.sh +54 -0
  180. data/lib/neeto_commons_backend/secrets_management.rb +41 -0
  181. data/lib/neeto_commons_backend/services/custom_domain_service.rb +40 -0
  182. data/lib/neeto_commons_backend/tasks/assets.rake +27 -0
  183. data/lib/neeto_commons_backend/tasks/before_assets_precompile.rake +13 -0
  184. data/lib/neeto_commons_backend/tasks/simplecov_coverage.rake +25 -0
  185. data/lib/neeto_commons_backend/version.rb +5 -0
  186. data/neeto-commons-backend.gemspec +52 -0
  187. data/package.json +31 -0
  188. data/yarn.lock +2530 -0
  189. metadata +497 -0
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Helpers
5
+ class << self
6
+ def build_neeto_widget_script_url
7
+ widget_urls = {
8
+ production: "https://d13nryxs46eypn.cloudfront.net/neeto-widget.js",
9
+ staging: "https://d13nryxs46eypn.cloudfront.net/neeto-widget-staging.js"
10
+ }
11
+ Rails.env == "production" ? widget_urls[:production] : widget_urls[:staging]
12
+ end
13
+
14
+ def get_neeto_widget_environment
15
+ Rails.env == "production" ? "production" : "staging"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "webmock"
4
+ require "factory_bot_rails"
5
+ require "simplecov"
6
+ require "minitest/reporters"
7
+
8
+ class NeetoCommonsBackend::TestHelper
9
+ class << self
10
+ def webapp_setup
11
+ common_setup
12
+ webmock_disable_net_connect
13
+ add_modules_to_action_dispatch_integration_test
14
+ add_methods_to_action_dispatch_integration_test
15
+ end
16
+
17
+ def common_setup
18
+ simplecov_config
19
+ minitest_reporters_config
20
+ setup_common_stubs
21
+ add_modules_to_active_support_test_case
22
+ end
23
+
24
+ private
25
+
26
+ def setup_common_stubs
27
+ WebMock.stub_request(:post, "http://app.lvh.me:9000/api/v1/server/global_roles")
28
+ .to_return(status: 200, body: "", headers: {})
29
+ end
30
+
31
+ def minitest_reporters_config
32
+ Minitest::Reporters.use! [Minitest::Reporters::DefaultReporter.new(color: true)]
33
+ end
34
+
35
+ def simplecov_config
36
+ SimpleCov.start "rails" do
37
+ groups.clear
38
+ track_files "{app}/**/*.rb"
39
+
40
+ add_filter "test/"
41
+ add_filter "lib/"
42
+ add_filter "app/mailer_previews/"
43
+ add_filter "app/models/concerns/"
44
+ add_filter "app/controllers/concerns/"
45
+
46
+ add_filter "app/services/sample_data/"
47
+ add_filter "app/services/sample_data_loader_service.rb"
48
+ add_filter "app/services/seeds/sample_data_service.rb"
49
+
50
+ add_group "Controllers", "app/controllers"
51
+ add_group "Models", "app/models"
52
+ add_group "Services", "app/services"
53
+ add_group "Mailers", "app/mailers"
54
+ add_group "Workers", "app/workers"
55
+ add_group "Jobs", "app/jobs"
56
+ add_group "Carriers", "app/carriers"
57
+ add_group "Policies", "app/policies"
58
+ add_group "Channels", "app/channels"
59
+ add_group "Helpers", "app/helpers"
60
+ end
61
+ end
62
+
63
+ def webmock_disable_net_connect
64
+ WebMock.disable_net_connect!(allow_localhost: true, allow: "fonts.googleapis.com")
65
+ end
66
+
67
+ def add_methods_to_action_dispatch_integration_test
68
+ ActionDispatch::IntegrationTest.define_method(:response_json) do
69
+ response.parsed_body
70
+ end
71
+
72
+ ActionDispatch::IntegrationTest.define_method(:validate_response) do |response_code, **messages|
73
+ assert_response response_code
74
+ messages.each_key do |key|
75
+ assert_equal messages[key], response_json[key.to_s]
76
+ end
77
+ end
78
+ end
79
+
80
+ def add_modules_to_action_dispatch_integration_test
81
+ ActionDispatch::IntegrationTest.include(ActionView::Helpers::TranslationHelper)
82
+ ActionDispatch::IntegrationTest.include(Devise::Test::IntegrationHelpers)
83
+ end
84
+
85
+ def add_modules_to_active_support_test_case
86
+ ActiveSupport::TestCase.include(ActionView::Helpers::TranslationHelper)
87
+ ActiveSupport::TestCase.include(FactoryBot::Syntax::Methods)
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ # TODO: - remove this once/if Heroku fixes this.
4
+ # Refer: https://devcenter.heroku.com/changelog-items/2446
5
+ # https://stackoverflow.com/a/73273766
6
+
7
+ module NeetoCommonsBackend
8
+ module Initializers
9
+ module EnableExtensionHerokuMonkeypatch
10
+ def self.apply_patch!
11
+ if defined? ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
12
+ patched_method = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.instance_method(:enable_extension)
13
+ # Only patch this method if it's method signature matches what we're expecting
14
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend InstanceMethods if patched_method&.arity == 1
15
+ end
16
+ end
17
+
18
+ module InstanceMethods
19
+ def enable_extension(name)
20
+ name_override = name
21
+
22
+ if schema_exists?("heroku_ext")
23
+ Rails.logger.debug "enable_extension -- Adding SCHEMA heroku_ext"
24
+ name_override = "#{name}\" SCHEMA heroku_ext -- Ignore trailing double quote"
25
+ end
26
+
27
+ super name_override
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def assets
7
+ Rails.application.config.assets.version = "1.0"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def bullet
7
+ if Rails.env.development? || Rails.env.test?
8
+ Bullet.enable = true
9
+ Bullet.bullet_logger = true
10
+ Bullet.rails_logger = true
11
+ Bullet.raise = true if Rails.env.test?
12
+
13
+ # Detect N+1 queries
14
+ Bullet.n_plus_one_query_enable = true
15
+
16
+ # Detect eager-loaded associations which are not used
17
+ Bullet.unused_eager_loading_enable = false
18
+
19
+ # Detect unnecessary COUNT queries which could be avoided
20
+ # with a counter_cache
21
+ Bullet.counter_cache_enable = true
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def cache_store(config)
7
+ if Rails.application.secrets.redis_cache_url.present?
8
+ config.cache_store = :redis_cache_store, {
9
+ url: ENV[Rails.application.secrets.redis_cache_url],
10
+ connect_timeout: 30, # Defaults to 20 seconds
11
+ read_timeout: 0.4, # Defaults to 1 second
12
+ write_timeout: 0.4, # Defaults to 1 second
13
+ reconnect_attempts: 1, # Defaults to 0
14
+ ssl_params: {
15
+ verify_mode: OpenSSL::SSL::VERIFY_NONE
16
+ },
17
+
18
+ error_handler: lambda { |method:, returning:, exception:|
19
+ # Report errors to Honeybadger
20
+ Honeybadger.notify(exception, context: { method:, returning: })
21
+ }
22
+ }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # TODO: - remove this once/if Heroku fixes this.
4
+ # Refer: https://devcenter.heroku.com/changelog-items/2446
5
+ # https://stackoverflow.com/a/73273766
6
+ NeetoCommonsBackend::Initializers::EnableExtensionHerokuMonkeypatch.apply_patch!
7
+
8
+ # All common initializers
9
+
10
+ NeetoCommonsBackend::Initializers.session_store
11
+ NeetoCommonsBackend::Initializers.assets
12
+ NeetoCommonsBackend::Initializers.remove_backtrace_silencers
13
+ NeetoCommonsBackend::Initializers.bullet
14
+ NeetoCommonsBackend::Initializers.cookies_serializer
15
+ NeetoCommonsBackend::Initializers.cors
16
+ NeetoCommonsBackend::Initializers.database_cleaner
17
+ NeetoCommonsBackend::Initializers.datetime
18
+ NeetoCommonsBackend::Initializers.email_setup
19
+ NeetoCommonsBackend::Initializers.neeto_email_prefixer
20
+ NeetoCommonsBackend::Initializers.filter_parameter_logging
21
+ NeetoCommonsBackend::Initializers.honeybadger
22
+ NeetoCommonsBackend::Initializers.kaminari_config
23
+ NeetoCommonsBackend::Initializers.neeto_mail_interceptor
24
+ NeetoCommonsBackend::Initializers.mime_types
25
+ NeetoCommonsBackend::Initializers.mini_profiler
26
+ NeetoCommonsBackend::Initializers.rack_attack
27
+ NeetoCommonsBackend::Initializers.rack_deflater
28
+ NeetoCommonsBackend::Initializers.rack_timeout
29
+ NeetoCommonsBackend::Initializers.rails_email_preview
30
+ NeetoCommonsBackend::Initializers.sidekiq
31
+ NeetoCommonsBackend::Initializers.wrap_parameters
32
+ NeetoCommonsBackend::Initializers.strong_migrations
33
+ NeetoCommonsBackend::Initializers.redis_client_patch
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def cookies_serializer
7
+ Rails.application.config.action_dispatch.cookies_serializer = :json
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def cors
7
+ Rails.application.config.middleware.insert_before 0, Rack::Cors do
8
+ allow do
9
+ origins "*"
10
+ resource "*", headers: :any, methods: %i[get post put patch delete options head]
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def database_cleaner
7
+ DatabaseCleaner.allow_remote_database_url = true unless Rails.env.production?
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def datetime
7
+ # Ruby uses local time in .to_time conversions.
8
+ # Force local time to be UTC always in any environment.
9
+ # Ref: https://bugs.ruby-lang.org/issues/14850
10
+ ENV["TZ"] = "UTC"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def email_setup
7
+ Premailer::Rails.config.merge!(preserve_styles: true, remove_ids: true)
8
+
9
+ ActionMailer::Base.default_url_options[:host] = Rails.application.secrets.host
10
+
11
+ ActionMailer::Base.delivery_method = Rails.application.config.action_mailer.delivery_method
12
+
13
+ ActionMailer::Base.asset_host = Rails.application.secrets.host
14
+
15
+ if ActionMailer::Base.delivery_method == :smtp
16
+ ActionMailer::Base.smtp_settings = Rails.application.secrets.mailer[:smtp_settings].symbolize_keys
17
+ end
18
+
19
+ if Rails.env.production? && ENV["APP_URL"].blank?
20
+ raise "URLs in email use APP_URL. This is not set. Please fix it by adding APP_URL env in the format app.neetoappname.com"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def filter_parameter_logging
7
+ Rails.application.config.filter_parameters += [:password]
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def honeybadger
7
+ Honeybadger.configure do |config|
8
+ # Disable logging
9
+ config.logging.path = "/dev/null"
10
+ config.logging.level = "WARN"
11
+ config.exceptions.notify_at_exit = false
12
+ config.before_notify do |notice|
13
+ break if notice.component != "errors"
14
+
15
+ params = Rails.application.routes.recognize_path(notice.url)
16
+ notice.component = params[:controller]
17
+ notice.action = params[:action]
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def kaminari_config
7
+ Kaminari.configure do |config|
8
+ config.default_per_page = 25
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def mime_types
7
+ Mime::Type.register "application/pdf", :pdf
8
+ Mime::Type.register "application/xlsx", :xlsx
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def mini_profiler
7
+ if Rails.env.development?
8
+ Rack::MiniProfiler.config.pre_authorize_cb = ->(_env) { ENV["MINI_PROFILER"].present? }
9
+ Rack::MiniProfiler.config.auto_inject = ENV["MINI_PROFILER"].present?
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ # frozen_string_literal: true
4
+
5
+ module NeetoCommonsBackend
6
+ module Initializers
7
+ class << self
8
+ def neeto_email_prefixer
9
+ NeetoEmailPrefixer.configure do |config|
10
+ config.application_name = ((Rails.application.secrets.mailer || {})[:default_from_name]) || ""
11
+ config.stage_name = Rails.env
12
+ end
13
+
14
+ ActiveSupport.on_load(:action_mailer) do
15
+ ActionMailer::Base.class_eval do
16
+ default custom_prefix_override: -> { organization_name }
17
+
18
+ private
19
+ def organization_name
20
+ if params.nil? || params[:organization_name].nil?
21
+ raise ArgumentError, <<~MSG
22
+ Missing organization_name parameter in mailer. Please add it to the mailer params.
23
+
24
+ Suppose the name of the mailer is UserMailer, and you are trying to send a mail via
25
+ UserMailer, you need to add the following parameter like so:
26
+
27
+ UserMailer.with(organization_name: organization_name).send_email.deliver
28
+
29
+ Please pass the appropriate organization name to the mailer.
30
+ MSG
31
+ else
32
+ params[:organization_name]
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ostruct"
4
+
5
+ module NeetoCommonsBackend
6
+ module Initializers
7
+ class << self
8
+ def neeto_mail_interceptor
9
+ intercept_secrets = Rails.application.secrets.mail_interceptor
10
+
11
+ if Rails.env.staging?
12
+ cleanup = proc { |n| n.split(",").map(&:strip) }
13
+
14
+ interceptor = NeetoMailInterceptor::Interceptor.new(
15
+ forward_emails_to: cleanup.call(intercept_secrets[:forward_emails_to] || ""),
16
+ deliver_emails_to: cleanup.call(intercept_secrets[:whitelisted_emails] || "")
17
+ )
18
+ ActionMailer::Base.register_interceptor(interceptor)
19
+ elsif Rails.env.production?
20
+ interceptor = NeetoMailInterceptor::Interceptor.new(
21
+ env: OpenStruct.new(name: Rails.env, intercept?: true),
22
+ only_intercept: ["@example.com", "@example.net", "@neetoauth.com", "nitrohelp.com"]
23
+ )
24
+ ActionMailer::Base.register_interceptor(interceptor)
25
+ end
26
+
27
+ if Rails.application.secrets.zerobounce_api_key.present?
28
+ NeetoMailInterceptor.configure do |config|
29
+ config.enable_zerobounce_validation = true
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rake"
4
+
5
+ module NeetoCommonsBackend
6
+ module Initializers
7
+ module PostCompilation
8
+ def self.run
9
+ if Rake::Task.task_defined?("assets:clean")
10
+ Rake::Task["assets:clean"].enhance { Rake::Task["assets:post_compilation"].invoke }
11
+ else
12
+ Rake::Task.define_task("assets:clean") { Rake::Task["assets:post_compilation"].invoke }
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ # require "rack-attack"
4
+ module Rack
5
+ class Attack
6
+ class Request < ::Rack::Request
7
+ def remote_ip
8
+ # Cloudflare stores remote IP in CF_CONNECTING_IP header
9
+ @_remote_ip ||= (env["HTTP_CF_CONNECTING_IP"] ||
10
+ env["action_dispatch.remote_ip"] ||
11
+ ip).to_s
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ module NeetoCommonsBackend
18
+ module Initializers
19
+ class << self
20
+ def rack_attack
21
+ # IP Blacklist - comma separated
22
+ blocked_ips = ENV["RACK_ATTACK_BLOCKED_IPS"].to_s.split(",")
23
+ blocked_ips.each do |ip|
24
+ Rack::Attack.blocklist_ip(ip)
25
+ end
26
+
27
+ if ENV["ENABLE_RACK_ATTACK"] == "true"
28
+ (3..5).each do |level|
29
+ Rack::Attack.throttle(
30
+ "req/ip/#{level}",
31
+ limit: (30 * (2**level)),
32
+ period: (0.9 * (8**level)).to_i.seconds, &:remote_ip)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def rack_deflater
7
+ Rails.application.config.middleware.insert_after ActionDispatch::Static, Rack::Deflater
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def rack_timeout
7
+ # service_timeout = 0 or false disables rack-timeout
8
+ # service_timeout = 30 is the maximum timeout supported by Heroku
9
+ service_timeout = ["development", "test"].include?(Rails.env.to_s) ? 0 : 30
10
+
11
+ Rails.application.config.middleware.use Rack::Timeout, service_timeout:
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_email_preview"
4
+
5
+ module NeetoCommonsBackend
6
+ module Initializers
7
+ class << self
8
+ def rails_email_preview
9
+ RailsEmailPreview.setup do |config|
10
+ config.before_render do |message, _preview_class_name, _mailer_action|
11
+ Premailer::Rails::Hook.delivering_email(message)
12
+ end
13
+ end
14
+
15
+ Rails.application.config.to_prepare do
16
+ RailsEmailPreview.preview_classes = RailsEmailPreview.find_preview_classes("app/mailer_previews")
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "redis"
4
+
5
+ module NeetoCommonsBackend
6
+ module Initializers
7
+ def self.redis_client_patch
8
+ ::Redis.class_eval do
9
+ alias_method :old_initialize, :initialize
10
+
11
+ def initialize(my_options = {})
12
+ options = my_options.merge({ ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } })
13
+ old_initialize(options)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def remove_backtrace_silencers
7
+ Rails.backtrace_cleaner.remove_silencers!
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def session_store(expire_after = 1.days.to_i)
7
+ Rails.application.config.session_store(
8
+ :active_record_store,
9
+ key: Rails.application.secrets.session_cookie_name, expire_after:)
10
+
11
+ ActiveRecord::SessionStore::Session.table_name = "server_side_sessions"
12
+ ActiveRecord::SessionStore::Session.primary_key = "session_id"
13
+ ActiveRecord::SessionStore::Session.serializer = :json
14
+
15
+ Rails.application.config.after_initialize do
16
+ ActionDispatch::Session::ActiveRecordStore.session_class = ServerSideSession
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "redis"
4
+
5
+ module NeetoCommonsBackend
6
+ module SharedRedis
7
+ class << self
8
+ def client
9
+ @@_client ||= Redis.new(ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE })
10
+ end
11
+ end
12
+ end
13
+ end