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
data/README.md ADDED
@@ -0,0 +1,286 @@
1
+ # NeetoCommonsBackend
2
+
3
+ NeetoCommonsBackend gem is responsible for handling common business logic that are used across the neeto applications and also store the common files like that are widely used in all neeto applications. NeetoCommonsBackend, together with [neetoCompliance](https://github.com/bigbinary/neeto-compliance) gem handles the standardisation of configuration stucture and code standard.
4
+
5
+
6
+ All the controllers, concerns, services, helpers, views defined in neeto-commons-backend gem are as follows:
7
+
8
+ <table>
9
+ <thead>
10
+ <tr>
11
+ <th>
12
+
13
+ File name
14
+
15
+ </th>
16
+ <th>
17
+
18
+ Category
19
+
20
+ </th>
21
+
22
+ </tr>
23
+ </thead>
24
+ <tbody>
25
+ <tr>
26
+ <td>
27
+
28
+ - [NeetoCommonsBackend::Api::BaseController](./docs/controllers/README.md#neetocommonsbackendapibasecontroller)
29
+ - [NeetoCommonsBackend::Api::DirectUploadsController](./docs/controllers/README.md#neetocommonsbackendapidirectuploadscontroller)
30
+ - [NeetoCommonsBackend::AppVersionsController](./docs/controllers/README.md#neetocommonsbackendappversionscontroller)
31
+ - [NeetoCommonsBackend::FailuresController](./docs/controllers/README.md#neetocommonsbackendfailurescontroller)
32
+ - [NeetoCommonsBackend::HealthCheckController](./docs/controllers/README.md#neetocommonsbackendhealthcheckcontroller)
33
+ - [NeetoCommonsBackend::WellKnownsController](./docs/controllers/README.md#neetocommonsbackendwellknownscontroller)
34
+
35
+ </td>
36
+ <td>
37
+
38
+ [Controllers](./docs/controllers/README.md)
39
+
40
+ </td>
41
+ </tr>
42
+ <tr>
43
+ <td>
44
+
45
+ - [NeetoCommonsBackend::ApplicationMailer](./docs/mailers/README.md#neetocommonsbackendapplicationmailer)
46
+
47
+ </td>
48
+ <td>
49
+
50
+ [Mailers](./docs/mailers/README.md)
51
+
52
+ </td>
53
+ </tr>
54
+ <tr>
55
+ <td>
56
+
57
+ - [NeetoCommonsBackend::Sluggable](./docs/model_concerns/README.md#neetocommonsbackendsluggable)
58
+ - [NeetoCommonsBackend::SoftDeletable](./docs/model_concerns/README.md#neetocommonsbackendsoftdeletable)
59
+ - [NeetoCommonsBackend::DeviseValidator](./docs/model_concerns/README.md#neetocommonsbackenddevisevalidator)
60
+
61
+ </td>
62
+ <td>
63
+
64
+ [Model Concerns](./docs/model_concerns/README.md)
65
+
66
+ </td>
67
+ </tr>
68
+ <tr>
69
+ <td>
70
+
71
+ - [NeetoCommonsBackend::ApiHelpers](./docs/controller_concerns/README.md#neetocommonsbackendapihelpers)
72
+ - [NeetoCommonsBackend::ApiExceptions](./docs/controller_concerns/README.md#neetocommonsbackendapiexceptions)
73
+ - [NeetoCommonsBackend::ApiResponders](./docs/controller_concerns/README.md#neetocommonsbackendapiresponders)
74
+ - [NeetoCommonsBackend::HoneybadgerContext](./docs/controller_concerns/README.md#neetocommonsbackendhoneybadgercontext)
75
+ - [NeetoCommonsBackend::Authenticatable](./docs/controller_concerns/README.md#neetocommonsbackendauthenticatable)
76
+ - [NeetoCommonsBackend::StoreUserLocation](./docs/controller_concerns/README.md#neetocommonsbackendstoreuserlocation)
77
+
78
+ </td>
79
+ <td>
80
+
81
+ [Controller Concerns](./docs/controller_concerns/README.md)
82
+
83
+ </td>
84
+ </tr>
85
+ <tr>
86
+ <td>
87
+
88
+ - [NeetoCommonsBackend::BaseWorkers::Base](./docs/workers/README.md#neetocommonsbackendbaseworkersbase)
89
+ - [NeetoCommonsBackend::BaseWorkers::Auth](./docs/workers/README.md#neetocommonsbackendbaseworkersauth)
90
+ - [NeetoCommonsBackend::BaseWorkers::Default](./docs/workers/README.md#neetocommonsbackendbaseworkersdefault)
91
+ - [NeetoCommonsBackend::BaseWorkers::Low](./docs/workers/README.md#neetocommonsbackendbaseworkerslow)
92
+ - [NeetoCommonsBackend::BaseWorkers::Urgent](./docs/workers/README.md#neetocommonsbackendbaseworkersurgent)
93
+
94
+ </td>
95
+ <td>
96
+
97
+ [Workers](./docs/workers/README.md)
98
+
99
+ </td>
100
+ </tr>
101
+
102
+ <tr>
103
+ <td>
104
+
105
+ - [NeetoCommonsBackend::AppUrlCarrier](./docs/carriers/README.md#neetocommonsbackendappurlcarrier)
106
+
107
+ </td>
108
+ <td>
109
+
110
+ [Carriers](./docs/carriers/README.md)
111
+
112
+ </td>
113
+ </tr>
114
+
115
+ <tr>
116
+ <td>
117
+
118
+ - [auto_update_prs_with_latest_master](./docs/workflows/README.md#auto_update_prs_with_latest_master)
119
+ - [bump_version](./docs/workflows/README.md#bump_version)
120
+
121
+ </td>
122
+ <td>
123
+
124
+ [Workflows](./docs/workflows/README.md)
125
+
126
+ </td>
127
+ </tr>
128
+
129
+ <tr>
130
+ <td>
131
+
132
+ - [semaphore.yml](./docs/semaphore/README.md#semaphoreyml)
133
+
134
+ </td>
135
+ <td>
136
+
137
+ [Semaphore config](./docs/semaphore/README.md)
138
+
139
+ </td>
140
+ </tr>
141
+ <tr>
142
+ <td>
143
+
144
+ - [Gemfile.common.rb](./docs/gemfiles/README.md#gemfilecommonrb)
145
+
146
+ </td>
147
+ <td>
148
+
149
+ [gemfiles](./docs/gemfiles/README.md)
150
+
151
+ </td>
152
+ </tr>
153
+ <tr>
154
+ <td>
155
+
156
+ - [NeetoCommonsBackend::Helpers::AuthServerApi](./docs/helpers/README.md#neetocommonsbackendhelpersauthserverapi)
157
+ - [NeetoCommonsBackend::Helpers.favicon](./docs/helpers/README.md#neetocommonsbackendhelpersfavicon)
158
+ - [NeetoCommonsBackend::Helpers.common_client_props](./docs/helpers/README.md#neetocommonsbackendhelperscommon_client_props)
159
+ - [NeetoCommonsBackend::Helpers.build_neeto_widget_script_url](./docs/helpers/README.md#neetocommonsbackendhelpersbuild_neeto_widget_script_url)
160
+ - [NeetoCommonsBackend::TestHelper.setup](./docs/helpers/README.md#neetocommonsbackendtesthelpersetup)
161
+
162
+ </td>
163
+ <td>
164
+
165
+ [Helpers](./docs/helpers/README.md)
166
+
167
+ </td>
168
+ </tr>
169
+ <tr>
170
+ <td>
171
+
172
+ - [NeetoCommonsBackend::Initializers::EnableExtensionHerokuMonkeypatch](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/_enable_extension_hack.rb)
173
+ - [NeetoCommonsBackend::Initializers.cache_store](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/cache_store.rb)
174
+ - [NeetoCommonsBackend::Initializers.session_store](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/session_store.rb)
175
+ - [NeetoCommonsBackend::Initializers.assets](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/assets.rb)
176
+ - [NeetoCommonsBackend::Initializers.remove_backtrace_silencers](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/remove_backtrace_silencers.rb)
177
+ - [NeetoCommonsBackend::Initializers.bullet](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/bullet.rb)
178
+ - [NeetoCommonsBackend::Initializers.cookies_serializer](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/cookies_serializer.rb)
179
+ - [NeetoCommonsBackend::Initializers.cors](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/cors.rb)
180
+ - [NeetoCommonsBackend::Initializers.database_cleaner](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/database_cleaner.rb)
181
+ - [NeetoCommonsBackend::Initializers.datetime](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/datetime.rb)
182
+ - [NeetoCommonsBackend::Initializers.email_setup](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/email_setup.rb)
183
+ - [NeetoCommonsBackend::Initializers.neeto_email_prefixer](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/neeto_email_prefixer.rb)
184
+ - [NeetoCommonsBackend::Initializers.filter_parameter_logging](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/filter_parameter_logging.rb)
185
+ - [NeetoCommonsBackend::Initializers.honeybadger](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/honeybadger.rb)
186
+ - [NeetoCommonsBackend::Initializers.kaminari_config](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/kaminari_config.rb)
187
+ - [NeetoCommonsBackend::Initializers.neeto_mail_interceptor](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/neeto_mail_interceptor.rb)
188
+ - [NeetoCommonsBackend::Initializers.mime_types](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/mime_types.rb)
189
+ - [NeetoCommonsBackend::Initializers.mini_profiler](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/mini_profiler.rb)
190
+ - [NeetoCommonsBackend::Initializers.rack_attack](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/rack_attack.rb)
191
+ - [NeetoCommonsBackend::Initializers.rack_deflater](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/rack_deflater.rb)
192
+ - [NeetoCommonsBackend::Initializers.rack_timeout](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/rack_timeout.rb)
193
+ - [NeetoCommonsBackend::Initializers.rails_email_preview](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/rails_email_preview.rb)
194
+ - [NeetoCommonsBackend::Initializers.sidekiq](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/sidekiq.rb)
195
+ - [NeetoCommonsBackend::Initializers.wrap_parameters](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/wrap_parameters.rb)
196
+ - [NeetoCommonsBackend::Initializers.strong_migrations](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/strong_migrations.rb)
197
+ - [NeetoCommonsBackend::Initializers::PostCompilation](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/post_compilation.rb)
198
+ - [NeetoCommonsBackend::SharedRedis](https://github.com/bigbinary/neeto-commons-backend/blob/main/lib/neeto_commons_backend/initializers/shared_redis.rb)
199
+
200
+ </td>
201
+ <td>
202
+
203
+ [Initializers](https://github.com/bigbinary/neeto-commons-backend/tree/main/lib/neeto_commons_backend/initializers)
204
+
205
+ </td>
206
+ </tr>
207
+ <tr>
208
+ <td>
209
+
210
+ - [catch_all.rb](./docs/routes/README.md#catch_allrb)
211
+ - [devise.rb](./docs/routes/README.md#deviserb)
212
+ - [direct_uploads.rb](./docs/routes/README.md#direct_uploadsrb)
213
+ - [draw.rb](./docs/routes/README.md#drawrb)
214
+ - [email_previews.rb](./docs/routes/README.md#email_previewsrb)
215
+ - [errors.rb](./docs/routes/README.md#errorsrb)
216
+ - [health.rb](./docs/routes/README.md#healthrb)
217
+ - [letter_opener.rb](./docs/routes/README.md#letter_openerrb)
218
+ - [sidekiq.rb](./docs/routes/README.md#sidekiqrb)
219
+ - [well_knowns.rb](./docs/routes/README.md#well_knownsrb)
220
+
221
+ </td>
222
+ <td>
223
+
224
+ [Routes](./docs/routes/README.md)
225
+
226
+ </td>
227
+ </tr>
228
+ <tr>
229
+ <td>
230
+
231
+ - [sync_with_wheel.sh](./docs/scripts/README.md#sync_with_wheelsh)
232
+
233
+ </td>
234
+ <td>
235
+
236
+ [Scripts](./docs/scripts/README.md)
237
+
238
+ </td>
239
+ </tr>
240
+ <tr>
241
+ <td>
242
+
243
+ - [sample_data](./docs/services/README.md#sample_data)
244
+ - [NeetoCommonsBackend::SourceMapPublishService](./docs/services/README.md#neetocommonsbackendsourcemappublishservice)
245
+ - [NeetoCommonsBackend::Services::CustomDomain](./docs/services/README.md#neetocommonsbackendservicescustomdomain)
246
+
247
+ </td>
248
+ <td>
249
+
250
+ [Services](./docs/services/README.md)
251
+
252
+ </td>
253
+ </tr>
254
+
255
+ </tbody>
256
+
257
+ </table>
258
+
259
+ ## Installation
260
+
261
+ 1. Add this line to your application's Gemfile:
262
+
263
+ ```ruby
264
+ gem "neeto-commons-backend", git: "https://github.com/bigbinary/neeto-commons-backend"
265
+ ```
266
+
267
+ 2. And then execute:
268
+
269
+ ```shell
270
+ $ bundle install
271
+ ```
272
+
273
+ ## Development
274
+
275
+ 1. Add this line to your application's Gemfile (replace the path to the local copy of neetoCommonsBackend gem):
276
+
277
+ ```ruby
278
+ gem 'neeto-commons-backend', path: '../neeto-commons-backend'
279
+ ```
280
+
281
+ 2. And then execute:
282
+
283
+ ```shell
284
+ $ bundle install
285
+ ```
286
+
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+ require "bundler/setup"
6
+
7
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
8
+ load "rails/tasks/engine.rake"
9
+
10
+ load "rails/tasks/statistics.rake"
11
+
12
+ Rake::TestTask.new(:test) do |t|
13
+ t.libs << "test"
14
+ t.libs << "lib"
15
+ t.test_files = FileList["test/**/*_test.rb"]
16
+ end
17
+
18
+ task default: :test
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Api
4
+ class BaseController < NeetoCommonsBackend::Api::BaseController
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Api
5
+ class BaseController < ApplicationController
6
+ include NeetoCommonsBackend::Authenticatable
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ class Api::DirectUploadsController < ActiveStorage::DirectUploadsController
5
+ protect_from_forgery with: :null_session
6
+
7
+ before_action :load_blob!, only: %i[update destroy]
8
+
9
+ def create
10
+ blob = ActiveStorage::Blob.create_before_direct_upload!(**blob_args)
11
+ blob_url = url_for(blob)
12
+ render json: direct_upload_json(blob).merge(blob_url:)
13
+ end
14
+
15
+ def update
16
+ @blob.update! blob_params
17
+ render status: :ok, json: { notice: "Attachment has been successfully updated.", blob: @blob }
18
+ end
19
+
20
+ def destroy
21
+ @blob.attachments.each do |attachment|
22
+ attachment.record&.touch
23
+ attachment.purge
24
+ end
25
+ @blob&.purge
26
+ render status: :ok, json: { notice: "Attachment has been successfully deleted." }
27
+ end
28
+
29
+ private
30
+
31
+ def load_blob!
32
+ blob_id = ActiveStorage.verifier.verify(params[:id], purpose: :blob_id)
33
+ @blob = ActiveStorage::Blob.find(blob_id)
34
+ rescue ActiveSupport::MessageVerifier::InvalidSignature
35
+ render status: :unprocessable_entity, json: { error: "Attachment signature is not valid." }
36
+ end
37
+
38
+ def blob_params
39
+ options = params.require(:blob).permit(:filename)
40
+ if options[:filename].present?
41
+ options.merge!(filename: filename_with_extension(options[:filename]))
42
+ end
43
+ options
44
+ end
45
+
46
+ def filename_with_extension(filename)
47
+ file_extension = @blob.filename.extension_with_delimiter
48
+ updated_extension = File.extname(filename)
49
+
50
+ if updated_extension == file_extension
51
+ File.basename(filename, ".*") + file_extension
52
+ else
53
+ filename + file_extension
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ class AppVersionsController < ApplicationController
5
+ def index
6
+ render json: {
7
+ "androidMinimumSupportedVersion": app_versions[:android_minimum_supported_version],
8
+ "androidCurrentVersion": app_versions[:android_current_version],
9
+ "iOSMinimumSupportedVersion": app_versions[:ios_minimum_supported_version],
10
+ "iOSCurrentVersion": app_versions[:ios_current_version]
11
+ }
12
+ end
13
+
14
+ private
15
+
16
+ def app_versions
17
+ @_app_versions ||= (Rails.application.secrets.app_versions || {})
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ class FailuresController < ApplicationController
5
+ before_action :set_default_format
6
+
7
+ def show
8
+ @status_code = params[:status_code] || "404"
9
+ error = @status_code == "404" ?
10
+ t("neeto_commons_backend.error.not_found") :
11
+ t("neeto_commons_backend.error.generic_error")
12
+
13
+ if params[:url]
14
+ Rails.logger.warn "ActionController::RoutingError (No route matches [#{request.method}] /#{params[:url]})"
15
+ end
16
+
17
+ respond_to do |format|
18
+ format.json { render json: { error: }, status: @status_code }
19
+ format.any { render status: @status_code }
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def set_default_format
26
+ request.format = :html unless request.format == :json
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ class HealthCheckController < ApplicationController
5
+ def show
6
+ head :ok
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ class WellKnownsController < ApplicationController
5
+ def assetlinks
6
+ render
7
+ end
8
+
9
+ def apple_app_site_association
10
+ render
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ class ApplicationMailer < ActionMailer::Base
5
+ layout "layouts/common"
6
+
7
+ default from: -> { get_from_email(Rails.application.secrets.mailer[:default_from_email]) },
8
+ bcc: Rails.application.secrets.mailer[:default_bcc_email],
9
+ reply_to: Rails.application.secrets.mailer[:default_from_email]
10
+
11
+ default_url_options[:host] = Rails.application.secrets.host
12
+
13
+ default template_path: -> { "mailers/#{self.class.name.underscore}" }
14
+
15
+ private
16
+
17
+ def get_from_email(from_email)
18
+ name = Rails.application.secrets.mailer[:default_from_name]
19
+ "#{name} <#{from_email}>"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module Sluggable
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ def generate_slug(value_field, slug_field, relation = nil, only_content_is_present = false)
9
+ value_slug = only_content_is_present ? "untitled" : self.send(value_field)&.parameterize
10
+ return if value_slug.nil?
11
+
12
+ query = relation || self.class
13
+ latest_slug = query
14
+ .where("#{slug_field} ~ ?", "^#{value_slug}$|^#{value_slug}-[0-9]+$")
15
+ .unscope(:order).order("LENGTH(#{slug_field}) DESC", "#{slug_field}" => :desc)
16
+ .first&.send(slug_field)
17
+
18
+ slug_count = 0
19
+ if latest_slug.present?
20
+ slug_count = latest_slug.split("-").last.to_i
21
+ slug_count = 1 if slug_count == 0
22
+ end
23
+ slug = slug_count.positive? ? "#{value_slug}-#{slug_count + 1}" : value_slug
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module SoftDeletable
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ default_scope { where(deleted_at: nil) }
9
+ scope :deleted, -> { unscope(where: :deleted_at).where.not(deleted_at: nil) }
10
+ end
11
+
12
+ def destroy
13
+ update_columns(deleted_at: DateTime.now, deleted_by: User.current)
14
+ end
15
+
16
+ def really_destroy
17
+ update_columns(deleted_at: DateTime.now, deleted_by: User.current)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module SampleData
5
+ module Common
6
+ class AdminService < Common::Base
7
+ def process!
8
+ create_admin!
9
+ end
10
+
11
+ private
12
+
13
+ def create_admin!
14
+ User.create! \
15
+ organization:,
16
+ email: "oliver@example.com",
17
+ first_name: "Oliver",
18
+ last_name: "Smith",
19
+ active: true,
20
+ password: app_secrets.default_password,
21
+ organization_role: organization.roles.find_by(name: "Admin")
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module SampleData
5
+ module Common
6
+ class AppOrganizationService < Common::OrganizationBase
7
+ ORGANIZATION_NAME = "App"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "faker"
4
+
5
+ module NeetoCommonsBackend
6
+ module SampleData
7
+ module Common
8
+ class Base
9
+ def organization
10
+ @_organization ||= Organization.find_by(subdomain: "spinkart")
11
+ end
12
+
13
+ def admin
14
+ organization.users.find_by(email: "oliver@example.com")
15
+ end
16
+
17
+ def skip?
18
+ !heroku_or_development_env?
19
+ end
20
+
21
+ def print_description
22
+ Rails.logger.debug format("%-80s", description)
23
+ end
24
+
25
+ def print_success
26
+ Rails.logger.debug "[DONE]\n"
27
+ end
28
+
29
+ def description
30
+ self.class.name
31
+ end
32
+
33
+ def heroku_or_development_env?
34
+ Rails.env.heroku? || Rails.env.development?
35
+ end
36
+
37
+ def app_secrets
38
+ @_app_secrets ||= Rails.application.secrets
39
+ end
40
+
41
+ def load!
42
+ print_description
43
+ process!
44
+ print_success
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module SampleData
5
+ module Common
6
+ class DatabaseCleanupService < Common::Base
7
+ def process!
8
+ DatabaseCleaner.clean_with :truncation
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module SampleData
5
+ module Common
6
+ class LoaderService < Common::Base
7
+ def process!
8
+ return if skip?
9
+
10
+ ActiveRecord::Base.descendants.map(&:reset_column_information)
11
+ Rails.logger.debug { "\n#{'-' * 80}" }
12
+ Rails.logger.debug "Loading sample data..."
13
+ ActiveRecord::Base.logger.level = Logger::INFO
14
+
15
+ load_sample_data!
16
+ Rails.logger.debug { "#{'-' * 80}\n" }
17
+ true
18
+ end
19
+
20
+ private
21
+
22
+ def load_sample_data!
23
+ ::SampleData::LoadersList.get.each do |loader_service|
24
+ loader_service.new.load!
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NeetoCommonsBackend
4
+ module SampleData
5
+ module Common
6
+ class NeetoTeamMembersService < Common::Base
7
+ def process!
8
+ NeetoTeamMembersEngine::PermissionSeederService.new.process
9
+ Organization.find_each do |organization|
10
+ NeetoTeamMembersEngine::OrganizationRoleSeederService.new(organization).process
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end