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,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sidekiq"
4
+ require "sidekiq-cron"
5
+
6
+ module NeetoCommonsBackend
7
+ module Initializers
8
+ class << self
9
+ def sidekiq
10
+ if Rails.env.test? || Rails.env.heroku?
11
+ require "sidekiq/testing"
12
+ Sidekiq::Testing.inline!
13
+ end
14
+
15
+ Sidekiq.logger.level = Logger::WARN if Rails.env.test?
16
+
17
+ Sidekiq.configure_server do |config|
18
+ # Reference:
19
+ # 1. https://github.com/mperham/sidekiq/wiki/Using-Redis#complete-control
20
+ # 2. https://elements.heroku.com/addons/heroku-redis Max connection 20
21
+ config.redis = {
22
+ url: Rails.application.secrets.redis_url,
23
+ size: 18,
24
+ reconnect_attempts: 2
25
+ }
26
+
27
+ unless Rails.env.test? || Rails.env.production? || Rails.env.staging?
28
+ schedule_file = "config/scheduled_jobs.yml"
29
+ if File.exist?(schedule_file)
30
+ Sidekiq::Cron::Job.load_from_hash! YAML.load_file(schedule_file, aliases: true)[Rails.env] ||
31
+ YAML.load_file(schedule_file)
32
+ end
33
+ end
34
+ end
35
+
36
+ Sidekiq.configure_client do |config|
37
+ config.redis = {
38
+ url: Rails.application.secrets.redis_url,
39
+ size: 2,
40
+ reconnect_attempts: 2
41
+ }
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def strong_migrations
7
+ StrongMigrations.lock_timeout = 10.seconds
8
+ StrongMigrations.statement_timeout = 1.hour
9
+ StrongMigrations.auto_analyze = true
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Initializers
5
+ class << self
6
+ def wrap_parameters
7
+ ActiveSupport.on_load(:action_controller) do
8
+ wrap_parameters format: [:json]
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module DeviseValidator
5
+ extend ActiveSupport::Concern
6
+
7
+ VALID_EMAIL_REGEX = /\b[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}\z/.freeze
8
+
9
+ included do
10
+ validates :email, presence: true
11
+ validates :email, uniqueness: {
12
+ allow_blank: true, scope: :organization_id, if: :email_changed?, case_sensitive: false,
13
+ message: "is already taken"
14
+ }
15
+ validates :email, format: { with: VALID_EMAIL_REGEX, allow_blank: true, if: :email_changed? }
16
+ validates :password, presence: true, on: :create
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "neeto-commons-backend"
4
+ require "rails"
5
+ require "neeto_commons_backend/initializers/post_compilation.rb"
6
+
7
+ module NeetoCommonsBackend
8
+ class Railtie < Rails::Railtie
9
+ railtie_name :neeto_commons_backend
10
+
11
+ rake_tasks do
12
+ path = File.expand_path(__dir__)
13
+ Dir.glob("#{path}/tasks/*.rake").each { |f| load f }
14
+ end
15
+
16
+ initializer "neeto_commons_backend.post_compilation" do
17
+ NeetoCommonsBackend::Initializers::PostCompilation.run
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ scope module: "neeto_commons_backend" do
5
+ match ":url", to: "failures#show", via: :all, url: /.*/, constraints: -> (request) do
6
+ request.path.exclude?("/rails/")
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ devise_for :users, controllers: {
5
+ sessions: "users/sessions",
6
+ registrations: "users/registrations",
7
+ omniauth_callbacks: "users/omniauth_callbacks"
8
+ }, skip: [:session]
9
+
10
+ devise_scope :user do
11
+ get "login", to: "users/sessions#new", as: :new_user_session
12
+ get "login", to: "users/sessions#new", as: :login
13
+ get "logout", controller: "users/sessions", action: "destroy"
14
+ post "/login", controller: "users/sessions", action: "create", as: :user_session
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ scope module: "neeto_commons_backend" do
5
+ namespace :api do
6
+ resources :direct_uploads, only: %i[create update destroy]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Routes
5
+ class << self
6
+ def draw(routes_name)
7
+ load_draw(routes_name)
8
+ end
9
+
10
+ def neeto_routes(routes_name)
11
+ Rails.root.join("config/routes/#{routes_name}.rb")
12
+ end
13
+
14
+ def commons_routes(routes_name)
15
+ "#{File.dirname(__FILE__)}/#{routes_name}.rb"
16
+ end
17
+
18
+ def load_draw(routes_name)
19
+ if File.exist?(neeto_routes(routes_name))
20
+ Rails.application.routes.draw do
21
+ instance_eval(File.read(NeetoCommonsBackend::Routes.neeto_routes(routes_name)))
22
+ end
23
+ else
24
+ instance_eval(File.read(commons_routes(routes_name)))
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ mount RailsEmailPreview::Engine, at: "emails" if Rails.env.development? || Rails.env.heroku?
5
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ scope module: "neeto_commons_backend" do
5
+ match "/:status_code", constraints: { status_code: /404|500/, format: :html }, to: "failures#show", via: :all
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ scope module: "neeto_commons_backend" do
5
+ get "health_check", to: "health_check#show"
6
+ get "app_versions", to: "app_versions#index"
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ mount LetterOpenerWeb::Engine, at: "/mailbox" if Rails.env.development? || Rails.env.heroku?
5
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ require "sidekiq/web"
5
+ require "sidekiq/cron/web"
6
+
7
+ def _secure_compare(s1, s2)
8
+ ActiveSupport::SecurityUtils.secure_compare(::Digest::SHA256.hexdigest(s1), ::Digest::SHA256.hexdigest(s2))
9
+ end
10
+
11
+ if %w[staging production].include?(Rails.env)
12
+ Sidekiq::Web.use Rack::Auth::Basic do |username, password|
13
+ _secure_compare(username, "sidekiq") & _secure_compare(password, Rails.application.secrets.sidekiq_web_password)
14
+ end
15
+ end
16
+
17
+ if Rails.env.development?
18
+ mount Sidekiq::Web, at: "/sidekiq"
19
+ else
20
+ mount Sidekiq::Web, at: "/sidekiq", constraints: { method: "GET" }
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ defaults format: :json do
5
+ scope ".well-known" do
6
+ get "assetlinks", to: "well_knowns#assetlinks"
7
+ get "apple-app-site-association", to: "well_knowns#apple_app_site_association"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,54 @@
1
+ # For executing this script, run the following from your terminal:
2
+ # curl -s -L "https://raw.githubusercontent.com/bigbinary/wheel/main/.scripts/sync_with_wheel.sh" | bash
3
+ yarn remove babel-eslint 2> /dev/null
4
+ yarn add -D @babel/eslint-parser
5
+ yarn add -D prettier
6
+ yarn add -D eslint \
7
+ eslint-plugin-react-hooks@4.2.1-alpha-13455d26d-20211104 \
8
+ eslint-plugin-import \
9
+ eslint-config-prettier \
10
+ eslint-plugin-prettier \
11
+ eslint-plugin-json \
12
+ eslint-plugin-react \
13
+ eslint-plugin-promise \
14
+ eslint-plugin-jam3 \
15
+ eslint-plugin-cypress \
16
+ eslint-plugin-unused-imports \
17
+ prettier-plugin-tailwindcss
18
+
19
+ raw_base_url="https://raw.githubusercontent.com/bigbinary/wheel/main"
20
+ declare -a configs=(
21
+ ".eslintrc.js"
22
+ ".eslintignore"
23
+ ".eslint-rules/helpers/index.js"
24
+ ".eslint-rules/imports/enforced.js"
25
+ ".eslint-rules/imports/order.js"
26
+ ".eslint-rules/globals.js"
27
+ ".eslint-rules/overrides.js"
28
+ ".eslint-rules/promise.js"
29
+ ".eslint-rules/react.js"
30
+ ".rubocop.yml"
31
+ ".prettierrc.js"
32
+ ".editorconfig"
33
+ ".vscode/extensions.json"
34
+ ".vscode/settings.json"
35
+ "cypress-tests/.eslintrc.js"
36
+ ".semaphore/commands/run_eslint_on_modified_files.sh"
37
+ ".node-version"
38
+ ".nvmrc"
39
+ ".ruby-version"
40
+ ".erb-lint.yml"
41
+ "bin/bundle"
42
+ "bin/rails"
43
+ "bin/rake"
44
+ "bin/setup"
45
+ "bin/update"
46
+ "bin/webpack"
47
+ "bin/webpack-dev-server"
48
+ "bin/yarn"
49
+ )
50
+
51
+ for config in "${configs[@]}"; do
52
+ echo "Downloading ${config}..."
53
+ curl --create-dirs -o "${config}" "${raw_base_url}/${config}"
54
+ done
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module SecretsManagement
5
+ def neeto_secrets
6
+ @_neeto_secrets ||= begin
7
+ secrets = ActiveSupport::OrderedOptions.new
8
+ secrets.deep_merge! common_secrets
9
+ secrets.deep_merge! host_app_secrets
10
+
11
+ # Fallback to config.secret_key_base if secrets.secret_key_base isn't set
12
+ secrets.secret_key_base ||= config.secret_key_base
13
+
14
+ secrets
15
+ end
16
+
17
+ @secrets = @_neeto_secrets
18
+ end
19
+
20
+ private
21
+
22
+ def host_app_secrets
23
+ files = config.paths["config/secrets"].existent
24
+ files = files.reject { |path| path.end_with?(".enc") } unless config.read_encrypted_secrets
25
+ _read_secrets files
26
+ end
27
+
28
+ def common_secrets
29
+ _read_secrets [File.join(__dir__, "config/secrets.yml")]
30
+ end
31
+
32
+ def _read_secrets(files)
33
+ Rails::Secrets.parse(files, env: Rails.env)
34
+ end
35
+ end
36
+ end
37
+
38
+ class Rails::Application
39
+ include NeetoCommonsBackend::SecretsManagement
40
+ alias_method :secrets, :neeto_secrets
41
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Services
5
+ class CustomDomain
6
+ attr_reader :domain_name, :default_url
7
+
8
+ def initialize(domain_name)
9
+ @domain_name = domain_name
10
+ @default_url = "https://api.heroku.com/apps/#{Rails.application.secrets.heroku[:app_name]}/domains"
11
+ end
12
+
13
+ def create
14
+ params = { hostname: domain_name, sni_endpoint: Rails.application.secrets.heroku[:certificate_name] }
15
+ uri = URI(default_url)
16
+ req = Net::HTTP::Post.new(uri)
17
+ make_api_request(req, params, uri)
18
+ end
19
+
20
+ def delete
21
+ uri = URI("#{default_url}/#{domain_name}")
22
+ req = Net::HTTP::Delete.new(uri)
23
+ make_api_request(req, nil, uri)
24
+ end
25
+
26
+ private
27
+
28
+ def make_api_request(req, params, uri)
29
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
30
+ req.body = JSON[params] if params
31
+ req["Content-Type"] = "application/json"
32
+ req["Accept"] = "application/vnd.heroku+json; version=3"
33
+ req["Authorization"] = "Bearer #{Rails.application.secrets.heroku[:auth_token]}"
34
+ http.request(req)
35
+ end
36
+ JSON.parse(response.body)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rake"
4
+ require "json"
5
+
6
+ namespace :assets do
7
+ desc "Remove 'node_modules' folder"
8
+ task rm_node_modules: :environment do
9
+ Rails.logger.info "Removing node_modules folder"
10
+ FileUtils.remove_dir("node_modules", true)
11
+ end
12
+
13
+ desc "Upload sourcemap to Honeybadger"
14
+ task publish_sourcemap: :environment do
15
+ Rails.logger.info "Publishing sourcemap"
16
+ NeetoCommonsBackend::SourceMapPublishService.new.process!
17
+ end
18
+
19
+ desc "Remove 'node_modules' folder and upload sourcemap to Honeybadger"
20
+ task post_compilation: :environment do
21
+ skip_clean = %w[no false n f].include?(ENV["WEBPACKER_PRECOMPILE"])
22
+ unless skip_clean
23
+ Rake::Task["assets:rm_node_modules"].invoke
24
+ Rake::Task["assets:publish_sourcemap"].invoke if Rails.env.production? || Rails.env.staging?
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rake"
4
+ require "json"
5
+
6
+ desc "Engines webpack compilation"
7
+ task before_assets_precompile: :environment do
8
+ Rake::Task["neeto:area51:webpacker:compile"].invoke if Rake::Task.task_defined?("neeto:area51:webpacker:compile")
9
+ end
10
+
11
+ # every time you execute 'rake assets:precompile'
12
+ # run 'before_assets_precompile' first
13
+ Rake::Task["assets:precompile"].enhance ["before_assets_precompile"] if Rake::Task.task_defined?("assets:precompile")
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "net/http"
5
+
6
+ namespace :simplecov_coverage do
7
+ desc "Publish simplecov coverage"
8
+ task :publish do
9
+ branch = `git rev-parse --abbrev-ref HEAD`.chomp.strip
10
+ next unless branch == "main"
11
+
12
+ repo = `git rev-parse --show-toplevel`.split("/").last.chomp.strip
13
+ coverage_json = JSON.parse(File.read("#{Rails.root}/coverage/.last_run.json"))
14
+ coverage = { app_name: repo, value: coverage_json.dig("result", "line") }
15
+
16
+ uri = URI("https://neeto-library-stable-versions.herokuapp.com/neeto_test_coverage_data/upload")
17
+ http = Net::HTTP.new(uri.host, uri.port)
18
+ http.use_ssl = (uri.scheme == "https")
19
+
20
+ request = Net::HTTP::Post.new(uri, "Content-Type" => "application/json")
21
+ request.body = { coverage_data: coverage }.to_json
22
+ response = http.request(request)
23
+ raise "Simplecov coverage upload failed" unless response.is_a?(Net::HTTPSuccess)
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ VERSION = "1.0.89"
5
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/neeto_commons_backend/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "neeto-commons-backend"
7
+ spec.version = NeetoCommonsBackend::VERSION
8
+ spec.authors = ["Prasanth Chaduvula"]
9
+ spec.email = ["prasanth.chaduvula@bigbinary.com"]
10
+
11
+ spec.summary = "Keeps all the common code of neeto products at one place"
12
+ spec.homepage = "https://github.com/bigbinary/neeto-commons-backend"
13
+ spec.required_ruby_version = ">= 3.1.2"
14
+
15
+ spec.metadata["homepage_uri"] = spec.homepage
16
+ spec.metadata["source_code_uri"] = "https://github.com/bigbinary/neeto-commons-backend"
17
+
18
+ # Specify which files should be added to the gem when it is released.
19
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
21
+ `git ls-files -z`.split("\x0").reject do |f|
22
+ (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
23
+ end
24
+ end
25
+ spec.bindir = "bin"
26
+ spec.require_paths = ["lib"]
27
+
28
+ # Uncomment to register a new dependency of your gem
29
+ # spec.add_dependency "example-gem", "~> 1.0"
30
+ spec.add_dependency "actionview"
31
+ spec.add_dependency "bullet"
32
+ spec.add_dependency "database_cleaner"
33
+ spec.add_dependency "honeybadger"
34
+ spec.add_dependency "kaminari"
35
+ spec.add_dependency "premailer-rails"
36
+ spec.add_dependency "rack-attack"
37
+ spec.add_dependency "rack-cors"
38
+ spec.add_dependency "rack-mini-profiler"
39
+ spec.add_dependency "rack-timeout"
40
+ spec.add_dependency "rails_email_preview"
41
+ spec.add_dependency "rake"
42
+ spec.add_dependency "redis"
43
+ spec.add_dependency "sidekiq"
44
+ spec.add_dependency "sidekiq-cron"
45
+ spec.add_dependency "sidekiq-failures"
46
+ spec.add_dependency "omniauth-google-oauth2"
47
+ spec.add_dependency "pundit"
48
+ spec.add_dependency "webmock"
49
+
50
+ # For more information and examples about making a new gem, checkout our
51
+ # guide at: https://bundler.io/guides/creating_gem.html
52
+ end
data/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "neeto-commons",
3
+ "version": "1.0.0",
4
+ "license": "UNLICENSED",
5
+ "devDependencies": {
6
+ "@babel/core": "7.17.10",
7
+ "@babel/eslint-parser": "7.17.0",
8
+ "@babel/plugin-transform-runtime": "7.17.10",
9
+ "@babel/preset-env": "7.17.10",
10
+ "@babel/preset-react": "7.16.7",
11
+ "@bigbinary/eslint-plugin-neeto": "1.0.46",
12
+ "@bigbinary/neeto-commons-frontend": "2.0.73",
13
+ "eslint": "8.14.0",
14
+ "eslint-config-prettier": "8.5.0",
15
+ "eslint-plugin-cypress": "2.12.1",
16
+ "eslint-plugin-import": "2.26.0",
17
+ "eslint-plugin-jam3": "0.2.3",
18
+ "eslint-plugin-json": "3.1.0",
19
+ "eslint-plugin-prettier": "4.0.0",
20
+ "eslint-plugin-promise": "6.0.0",
21
+ "eslint-plugin-react": "7.29.4",
22
+ "eslint-plugin-react-hooks": "4.5.0",
23
+ "eslint-plugin-unused-imports": "2.0.0",
24
+ "prettier": "2.6.2",
25
+ "prettier-plugin-tailwindcss": "0.1.10",
26
+ "husky": "^7.0.0"
27
+ },
28
+ "scripts": {
29
+ "prepare": "husky install"
30
+ }
31
+ }