neeto-commons-backend 1.0.89
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.eslintignore +14 -0
- data/.eslintrc.js +87 -0
- data/.husky/helpers/verify_neeto_audit.sh +18 -0
- data/.husky/pre-push +5 -0
- data/.neetoci/neetoci.yml +26 -0
- data/.prettierrc.js +15 -0
- data/.rubocop.yml +626 -0
- data/.ruby-version +1 -0
- data/.semaphore/semaphore.yml +32 -0
- data/.semaphore/staging-deploy.yml +23 -0
- data/Gemfile +92 -0
- data/Gemfile.lock +461 -0
- data/README.md +286 -0
- data/Rakefile +18 -0
- data/app/controllers/api/base_controller.rb +6 -0
- data/app/controllers/neeto_commons_backend/api/base_controller.rb +9 -0
- data/app/controllers/neeto_commons_backend/api/direct_uploads_controller.rb +57 -0
- data/app/controllers/neeto_commons_backend/app_versions_controller.rb +20 -0
- data/app/controllers/neeto_commons_backend/failures_controller.rb +29 -0
- data/app/controllers/neeto_commons_backend/health_check_controller.rb +9 -0
- data/app/controllers/neeto_commons_backend/well_knowns_controller.rb +13 -0
- data/app/mailers/neeto_commons_backend/application_mailer.rb +22 -0
- data/app/models/concerns/neeto_commons_backend/sluggable.rb +27 -0
- data/app/models/concerns/neeto_commons_backend/soft_deletable.rb +20 -0
- data/app/services/neeto_commons_backend/sample_data/common/admin_service.rb +26 -0
- data/app/services/neeto_commons_backend/sample_data/common/app_organization_service.rb +11 -0
- data/app/services/neeto_commons_backend/sample_data/common/base.rb +49 -0
- data/app/services/neeto_commons_backend/sample_data/common/database_cleanup_service.rb +13 -0
- data/app/services/neeto_commons_backend/sample_data/common/loader_service.rb +30 -0
- data/app/services/neeto_commons_backend/sample_data/common/neeto_team_members_service.rb +16 -0
- data/app/services/neeto_commons_backend/sample_data/common/organization_base.rb +36 -0
- data/app/services/neeto_commons_backend/sample_data/common/organization_service.rb +11 -0
- data/app/services/neeto_commons_backend/source_map_publish_service.rb +47 -0
- data/app/views/neeto_commons_backend/failures/show.html.erb +1 -0
- data/app/views/shared/_common.html.erb +8 -0
- data/app/views/shared/_neeto_engineering_replay_widget.html.erb +31 -0
- data/app/views/shared/_neeto_widget.html.erb +30 -0
- data/app/workers/neeto_commons_backend/base_workers/auth.rb +9 -0
- data/app/workers/neeto_commons_backend/base_workers/base.rb +52 -0
- data/app/workers/neeto_commons_backend/base_workers/default.rb +8 -0
- data/app/workers/neeto_commons_backend/base_workers/low.rb +9 -0
- data/app/workers/neeto_commons_backend/base_workers/urgent.rb +9 -0
- data/app/workers/neeto_commons_backend/purge_unattached_files_worker.rb +11 -0
- data/babel.config.js +47 -0
- data/bin/console +15 -0
- data/bin/rails +16 -0
- data/bin/setup +8 -0
- data/config/brakeman.ignore +52 -0
- data/config/locales/en.yml +5 -0
- data/docs/carriers/README.md +5 -0
- data/docs/controller_concerns/README.md +34 -0
- data/docs/controllers/README.md +27 -0
- data/docs/gemfiles/README.md +5 -0
- data/docs/helpers/README.md +21 -0
- data/docs/mailers/README.md +5 -0
- data/docs/model_concerns/README.md +39 -0
- data/docs/routes/README.md +44 -0
- data/docs/scripts/README.md +5 -0
- data/docs/semaphore/README.md +5 -0
- data/docs/services/README.md +23 -0
- data/docs/workers/README.md +32 -0
- data/docs/workflows/README.md +9 -0
- data/lib/Rakefile +4 -0
- data/lib/neeto-commons-backend.rb +62 -0
- data/lib/neeto_commons_backend/.circleci/config.yml +84 -0
- data/lib/neeto_commons_backend/.slugignore +17 -0
- data/lib/neeto_commons_backend/carriers/app_url_carrier.rb +71 -0
- data/lib/neeto_commons_backend/common_files/.bundler-version +1 -0
- data/lib/neeto_commons_backend/common_files/.editorconfig +10 -0
- data/lib/neeto_commons_backend/common_files/.erb-lint.yml +20 -0
- data/lib/neeto_commons_backend/common_files/.eslintignore +14 -0
- data/lib/neeto_commons_backend/common_files/.eslintrc.js +2 -0
- data/lib/neeto_commons_backend/common_files/.gitignore +132 -0
- data/lib/neeto_commons_backend/common_files/.husky/helpers/lint_staged.sh +5 -0
- data/lib/neeto_commons_backend/common_files/.husky/helpers/prevent_conflict_markers.sh +35 -0
- data/lib/neeto_commons_backend/common_files/.husky/helpers/prevent_pushing_to_main.sh +24 -0
- data/lib/neeto_commons_backend/common_files/.husky/helpers/verify_neeto_audit.sh +17 -0
- data/lib/neeto_commons_backend/common_files/.husky/pre-commit +9 -0
- data/lib/neeto_commons_backend/common_files/.husky/pre-push +7 -0
- data/lib/neeto_commons_backend/common_files/.node-version +1 -0
- data/lib/neeto_commons_backend/common_files/.nvmrc +1 -0
- data/lib/neeto_commons_backend/common_files/.postcssrc.yml +6 -0
- data/lib/neeto_commons_backend/common_files/.prettierrc.js +1 -0
- data/lib/neeto_commons_backend/common_files/.rubocop.yml +625 -0
- data/lib/neeto_commons_backend/common_files/.ruby-version +1 -0
- data/lib/neeto_commons_backend/common_files/.semaphore/commands/run_eslint_on_modified_files.sh +5 -0
- data/lib/neeto_commons_backend/common_files/.vscode/extensions.json +10 -0
- data/lib/neeto_commons_backend/common_files/.vscode/settings.json +21 -0
- data/lib/neeto_commons_backend/common_files/Dockerfile.dev +50 -0
- data/lib/neeto_commons_backend/common_files/app/javascript/jsconfig.json +62 -0
- data/lib/neeto_commons_backend/common_files/app/javascript/src/types.d.ts +36 -0
- data/lib/neeto_commons_backend/common_files/babel.config.js +1 -0
- data/lib/neeto_commons_backend/common_files/bin/bundle +5 -0
- data/lib/neeto_commons_backend/common_files/bin/rails +6 -0
- data/lib/neeto_commons_backend/common_files/bin/rake +6 -0
- data/lib/neeto_commons_backend/common_files/bin/setup +40 -0
- data/lib/neeto_commons_backend/common_files/bin/update +33 -0
- data/lib/neeto_commons_backend/common_files/bin/webpacker +17 -0
- data/lib/neeto_commons_backend/common_files/bin/webpacker-dev-server +17 -0
- data/lib/neeto_commons_backend/common_files/bin/yarn +19 -0
- data/lib/neeto_commons_backend/common_files/cypress-tests/.eslintrc.js +57 -0
- data/lib/neeto_commons_backend/common_files/cypress-tests/cypress/plugins/index.js +63 -0
- data/lib/neeto_commons_backend/common_files/github/workflows/auto_update_prs_with_latest_master.yml +21 -0
- data/lib/neeto_commons_backend/common_files/neeto_gems/github/workflows/bump_version.yml +51 -0
- data/lib/neeto_commons_backend/common_files/newrelic.yml +31 -0
- data/lib/neeto_commons_backend/common_files/package-common.json +119 -0
- data/lib/neeto_commons_backend/common_files/roles.yml +34 -0
- data/lib/neeto_commons_backend/common_files/semaphore/semaphore.yml +58 -0
- data/lib/neeto_commons_backend/common_files/sitemap.xml +15 -0
- data/lib/neeto_commons_backend/common_files/test/support/assertion_support.rb +9 -0
- data/lib/neeto_commons_backend/common_files/webpacker.yml +90 -0
- data/lib/neeto_commons_backend/config/secrets.yml +169 -0
- data/lib/neeto_commons_backend/controllers/concerns/api_exceptions.rb +83 -0
- data/lib/neeto_commons_backend/controllers/concerns/api_helpers.rb +9 -0
- data/lib/neeto_commons_backend/controllers/concerns/api_responders.rb +33 -0
- data/lib/neeto_commons_backend/controllers/concerns/authenticatable.rb +51 -0
- data/lib/neeto_commons_backend/controllers/concerns/honeybadger_context.rb +17 -0
- data/lib/neeto_commons_backend/controllers/concerns/store_user_location.rb +23 -0
- data/lib/neeto_commons_backend/cypress/cypress.review.json +13 -0
- data/lib/neeto_commons_backend/cypress/jsconfig.json +17 -0
- data/lib/neeto_commons_backend/cypress/package.json +51 -0
- data/lib/neeto_commons_backend/cypress/resolve.js +16 -0
- data/lib/neeto_commons_backend/cypress/webpack.config.js +21 -0
- data/lib/neeto_commons_backend/engine.rb +6 -0
- data/lib/neeto_commons_backend/environments/application.rb +33 -0
- data/lib/neeto_commons_backend/environments/development.rb +46 -0
- data/lib/neeto_commons_backend/environments/heroku.rb +35 -0
- data/lib/neeto_commons_backend/environments/production.rb +45 -0
- data/lib/neeto_commons_backend/environments/staging.rb +43 -0
- data/lib/neeto_commons_backend/environments/test.rb +29 -0
- data/lib/neeto_commons_backend/gemfiles/Gemfile.common.rb +240 -0
- data/lib/neeto_commons_backend/helpers/auth_server_api.rb +92 -0
- data/lib/neeto_commons_backend/helpers/favicon.rb +18 -0
- data/lib/neeto_commons_backend/helpers/global_props.rb +76 -0
- data/lib/neeto_commons_backend/helpers/neeto_widget_helper.rb +19 -0
- data/lib/neeto_commons_backend/helpers/test_helper.rb +90 -0
- data/lib/neeto_commons_backend/initializers/_enable_extension_hack.rb +32 -0
- data/lib/neeto_commons_backend/initializers/assets.rb +11 -0
- data/lib/neeto_commons_backend/initializers/bullet.rb +26 -0
- data/lib/neeto_commons_backend/initializers/cache_store.rb +27 -0
- data/lib/neeto_commons_backend/initializers/common.rb +33 -0
- data/lib/neeto_commons_backend/initializers/cookies_serializer.rb +11 -0
- data/lib/neeto_commons_backend/initializers/cors.rb +16 -0
- data/lib/neeto_commons_backend/initializers/database_cleaner.rb +11 -0
- data/lib/neeto_commons_backend/initializers/datetime.rb +14 -0
- data/lib/neeto_commons_backend/initializers/email_setup.rb +25 -0
- data/lib/neeto_commons_backend/initializers/filter_parameter_logging.rb +11 -0
- data/lib/neeto_commons_backend/initializers/honeybadger.rb +23 -0
- data/lib/neeto_commons_backend/initializers/kaminari_config.rb +13 -0
- data/lib/neeto_commons_backend/initializers/mime_types.rb +12 -0
- data/lib/neeto_commons_backend/initializers/mini_profiler.rb +14 -0
- data/lib/neeto_commons_backend/initializers/neeto_email_prefixer.rb +40 -0
- data/lib/neeto_commons_backend/initializers/neeto_mail_interceptor.rb +35 -0
- data/lib/neeto_commons_backend/initializers/post_compilation.rb +17 -0
- data/lib/neeto_commons_backend/initializers/rack_attack.rb +38 -0
- data/lib/neeto_commons_backend/initializers/rack_deflater.rb +11 -0
- data/lib/neeto_commons_backend/initializers/rack_timeout.rb +15 -0
- data/lib/neeto_commons_backend/initializers/rails_email_preview.rb +21 -0
- data/lib/neeto_commons_backend/initializers/redis_client_patch.rb +18 -0
- data/lib/neeto_commons_backend/initializers/remove_backtrace_silencers.rb +11 -0
- data/lib/neeto_commons_backend/initializers/session_store.rb +21 -0
- data/lib/neeto_commons_backend/initializers/shared_redis.rb +13 -0
- data/lib/neeto_commons_backend/initializers/sidekiq.rb +46 -0
- data/lib/neeto_commons_backend/initializers/strong_migrations.rb +13 -0
- data/lib/neeto_commons_backend/initializers/wrap_parameters.rb +13 -0
- data/lib/neeto_commons_backend/models/concerns/devise_validator.rb +19 -0
- data/lib/neeto_commons_backend/railtie.rb +20 -0
- data/lib/neeto_commons_backend/routes/catch_all.rb +9 -0
- data/lib/neeto_commons_backend/routes/devise.rb +16 -0
- data/lib/neeto_commons_backend/routes/direct_uploads.rb +9 -0
- data/lib/neeto_commons_backend/routes/draw.rb +29 -0
- data/lib/neeto_commons_backend/routes/email_previews.rb +5 -0
- data/lib/neeto_commons_backend/routes/errors.rb +7 -0
- data/lib/neeto_commons_backend/routes/health.rb +8 -0
- data/lib/neeto_commons_backend/routes/letter_opener.rb +5 -0
- data/lib/neeto_commons_backend/routes/sidekiq.rb +22 -0
- data/lib/neeto_commons_backend/routes/well_knowns.rb +10 -0
- data/lib/neeto_commons_backend/scripts/sync_with_wheel.sh +54 -0
- data/lib/neeto_commons_backend/secrets_management.rb +41 -0
- data/lib/neeto_commons_backend/services/custom_domain_service.rb +40 -0
- data/lib/neeto_commons_backend/tasks/assets.rake +27 -0
- data/lib/neeto_commons_backend/tasks/before_assets_precompile.rake +13 -0
- data/lib/neeto_commons_backend/tasks/simplecov_coverage.rake +25 -0
- data/lib/neeto_commons_backend/version.rb +5 -0
- data/neeto-commons-backend.gemspec +52 -0
- data/package.json +31 -0
- data/yarn.lock +2530 -0
- 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,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,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,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,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,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,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,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
|