workarea-core 3.4.45 → 3.5.0.beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +52 -0
  3. data/app/assets/javascripts/workarea/core/modules/duplicate_id.js +1 -5
  4. data/app/assets/javascripts/workarea/core/modules/style_guide_autocomplete_fields.js +9 -42
  5. data/app/assets/javascripts/workarea/core/modules/url.js +14 -0
  6. data/app/controllers/workarea/application_controller.rb +5 -1
  7. data/app/controllers/workarea/authentication.rb +15 -26
  8. data/app/controllers/workarea/authorization.rb +3 -3
  9. data/app/controllers/workarea/current_referrer.rb +1 -2
  10. data/app/controllers/workarea/current_release.rb +1 -1
  11. data/app/controllers/workarea/current_segments.rb +52 -0
  12. data/app/controllers/workarea/current_tracking.rb +45 -0
  13. data/app/controllers/workarea/http_caching.rb +30 -0
  14. data/app/controllers/workarea/impersonation.rb +18 -44
  15. data/app/helpers/workarea/schema_org_helper.rb +21 -0
  16. data/app/mailers/workarea/application_mailer.rb +2 -4
  17. data/app/middleware/workarea/application_middleware.rb +44 -0
  18. data/app/middleware/workarea/query_cache_middleware.rb +55 -0
  19. data/app/middleware/workarea/release_server_middleware.rb +1 -1
  20. data/app/models/workarea/application_document.rb +1 -1
  21. data/app/models/workarea/bulk_action/product_edit.rb +6 -6
  22. data/app/models/workarea/calculate_percent_change.rb +1 -1
  23. data/app/models/workarea/catalog/category.rb +0 -2
  24. data/app/models/workarea/catalog/product.rb +19 -2
  25. data/app/models/workarea/checkout/collect_payment.rb +10 -1
  26. data/app/models/workarea/checkout/fraud/analyzer.rb +44 -0
  27. data/app/models/workarea/checkout/fraud/no_decision_analyzer.rb +14 -0
  28. data/app/models/workarea/checkout/fraud/test_analyzer.rb +26 -0
  29. data/app/models/workarea/checkout.rb +18 -6
  30. data/app/models/workarea/configuration/admin.rb +25 -0
  31. data/app/models/workarea/configuration/params.rb +45 -0
  32. data/app/models/workarea/content/asset.rb +5 -18
  33. data/app/models/workarea/content/block.rb +8 -2
  34. data/app/models/workarea/content/block_draft.rb +7 -2
  35. data/app/models/workarea/content/block_type.rb +2 -2
  36. data/app/models/workarea/content/block_type_definition.rb +4 -0
  37. data/app/models/workarea/content/preset.rb +1 -1
  38. data/app/models/workarea/content.rb +12 -82
  39. data/app/models/workarea/data_file/csv.rb +6 -8
  40. data/app/models/workarea/data_file/import.rb +9 -1
  41. data/app/models/workarea/data_file/json.rb +1 -20
  42. data/app/models/workarea/data_file/operation.rb +0 -4
  43. data/app/models/workarea/data_file/tax_rates.rb +3 -0
  44. data/app/models/workarea/featured_products.rb +8 -0
  45. data/app/models/workarea/fulfillment/policies/base.rb +21 -0
  46. data/app/models/workarea/fulfillment/policies/download.rb +21 -0
  47. data/app/models/workarea/fulfillment/policies/ignore.rb +11 -0
  48. data/app/models/workarea/fulfillment/policies/ship.rb +15 -0
  49. data/app/models/workarea/fulfillment/sku.rb +72 -0
  50. data/app/models/workarea/fulfillment/token.rb +36 -0
  51. data/app/models/workarea/inquiry.rb +1 -2
  52. data/app/models/workarea/insights/customer_acquisition.rb +5 -9
  53. data/app/models/workarea/insights/trending_products.rb +2 -2
  54. data/app/models/workarea/insights/trending_searches.rb +2 -2
  55. data/app/models/workarea/inventory/collection.rb +30 -0
  56. data/app/models/workarea/inventory/collection_status.rb +40 -0
  57. data/app/models/workarea/metrics/affinity.rb +33 -0
  58. data/app/models/workarea/metrics/country_by_day.rb +4 -0
  59. data/app/models/workarea/metrics/product_by_day.rb +3 -0
  60. data/app/models/workarea/metrics/product_by_week.rb +2 -0
  61. data/app/models/workarea/metrics/product_for_last_week.rb +8 -12
  62. data/app/models/workarea/metrics/sales_by_day.rb +5 -0
  63. data/app/models/workarea/metrics/search_by_day.rb +1 -3
  64. data/app/models/workarea/metrics/search_for_last_week.rb +5 -11
  65. data/app/models/workarea/metrics/segment_by_day.rb +31 -0
  66. data/app/models/workarea/metrics/sku_by_day.rb +3 -0
  67. data/app/models/workarea/metrics/tender_by_day.rb +11 -0
  68. data/app/models/workarea/metrics/update_user_aggregations.rb +77 -0
  69. data/app/models/workarea/metrics/user.rb +73 -87
  70. data/app/models/workarea/navigation/breadcrumbs.rb +10 -1
  71. data/app/models/workarea/order/fraud_decision.rb +18 -0
  72. data/app/models/workarea/order/item.rb +5 -0
  73. data/app/models/workarea/order/queries.rb +1 -0
  74. data/app/models/workarea/order/status.rb +10 -1
  75. data/app/models/workarea/order.rb +47 -4
  76. data/app/models/workarea/payment/credit_card.rb +12 -0
  77. data/app/models/workarea/payment.rb +7 -2
  78. data/app/models/workarea/pricing/cache_key.rb +9 -3
  79. data/app/models/workarea/pricing/calculator.rb +5 -1
  80. data/app/models/workarea/pricing/calculators/tax_calculator.rb +32 -5
  81. data/app/models/workarea/pricing/discount/application_group.rb +8 -3
  82. data/app/models/workarea/pricing/discount/free_gift.rb +2 -1
  83. data/app/models/workarea/pricing/discount/redemption.rb +1 -1
  84. data/app/models/workarea/pricing/discount.rb +2 -3
  85. data/app/models/workarea/pricing/item_tax_applier.rb +41 -0
  86. data/app/models/workarea/pricing/price.rb +1 -0
  87. data/app/models/workarea/pricing/request.rb +11 -0
  88. data/app/models/workarea/pricing/sku.rb +1 -0
  89. data/app/models/workarea/pricing/tax_application.rb +21 -0
  90. data/app/models/workarea/pricing/tax_applier.rb +12 -15
  91. data/app/models/workarea/pricing/unsupported_segmentation.rb +22 -0
  92. data/app/models/workarea/product_rule.rb +5 -0
  93. data/app/models/workarea/releasable.rb +83 -89
  94. data/app/models/workarea/release/activation.rb +45 -0
  95. data/app/models/workarea/release/changes.rb +45 -0
  96. data/app/models/workarea/release/changeset.rb +42 -52
  97. data/app/models/workarea/release/preview.rb +28 -0
  98. data/app/models/workarea/release/status.rb +2 -24
  99. data/app/models/workarea/release.rb +72 -99
  100. data/app/models/workarea/release_session.rb +11 -11
  101. data/app/models/workarea/search/admin/catalog_product.rb +1 -2
  102. data/app/models/workarea/search/admin/fulfillment_sku.rb +27 -0
  103. data/app/models/workarea/search/admin/order.rb +1 -1
  104. data/app/models/workarea/search/admin/pricing_discount.rb +1 -1
  105. data/app/models/workarea/search/admin/release.rb +1 -4
  106. data/app/models/workarea/search/admin/segment.rb +19 -0
  107. data/app/models/workarea/search/admin.rb +17 -39
  108. data/app/models/workarea/search/order_text.rb +23 -6
  109. data/app/models/workarea/search/storefront/category_query.rb +152 -0
  110. data/app/models/workarea/search/storefront/product/categories.rb +11 -45
  111. data/app/models/workarea/search/storefront.rb +33 -29
  112. data/app/models/workarea/segment/first_time_customer.rb +8 -0
  113. data/app/models/workarea/segment/first_time_visitor.rb +12 -0
  114. data/app/models/workarea/segment/life_cycle.rb +44 -0
  115. data/app/models/workarea/segment/loyal_customer.rb +12 -0
  116. data/app/models/workarea/segment/returning_customer.rb +14 -0
  117. data/app/models/workarea/segment/returning_visitor.rb +12 -0
  118. data/app/models/workarea/segment/rules/base.rb +16 -0
  119. data/app/models/workarea/segment/rules/browser_info.rb +29 -0
  120. data/app/models/workarea/segment/rules/geolocation.rb +29 -0
  121. data/app/models/workarea/segment/rules/geolocation_option.rb +53 -0
  122. data/app/models/workarea/segment/rules/last_order.rb +14 -0
  123. data/app/models/workarea/segment/rules/logged_in.rb +13 -0
  124. data/app/models/workarea/segment/rules/orders.rb +17 -0
  125. data/app/models/workarea/segment/rules/revenue.rb +17 -0
  126. data/app/models/workarea/segment/rules/sessions.rb +17 -0
  127. data/app/models/workarea/segment/rules/tags.rb +14 -0
  128. data/app/models/workarea/segment/rules/traffic_referrer.rb +18 -0
  129. data/app/models/workarea/segment.rb +54 -0
  130. data/app/models/workarea/segmentable.rb +66 -0
  131. data/app/models/workarea/sort.rb +14 -2
  132. data/app/models/workarea/tax/rate.rb +35 -1
  133. data/app/models/workarea/user/authorization.rb +19 -13
  134. data/app/models/workarea/user/login.rb +4 -0
  135. data/app/models/workarea/user/password_reset.rb +1 -3
  136. data/app/queries/workarea/categorization.rb +3 -3
  137. data/app/queries/workarea/featured_categorization.rb +53 -0
  138. data/app/queries/workarea/order_cancellation_metrics.rb +155 -0
  139. data/app/queries/workarea/order_item_details.rb +16 -3
  140. data/app/queries/workarea/order_metrics.rb +32 -3
  141. data/app/queries/workarea/product_primary_navigation.rb +13 -2
  142. data/app/queries/workarea/product_releases.rb +38 -0
  143. data/app/queries/workarea/recommendation/user_activity_based.rb +14 -6
  144. data/app/queries/workarea/reports/average_order_value.rb +1 -1
  145. data/app/queries/workarea/reports/customers.rb +14 -11
  146. data/app/queries/workarea/reports/first_time_vs_returning_sales.rb +1 -1
  147. data/app/queries/workarea/reports/group_by_time.rb +13 -17
  148. data/app/queries/workarea/reports/sales_by_category.rb +1 -1
  149. data/app/queries/workarea/reports/sales_by_country.rb +10 -3
  150. data/app/queries/workarea/reports/sales_by_discount.rb +1 -1
  151. data/app/queries/workarea/reports/sales_by_menu.rb +1 -1
  152. data/app/queries/workarea/reports/sales_by_product.rb +39 -4
  153. data/app/queries/workarea/reports/sales_by_sku.rb +39 -4
  154. data/app/queries/workarea/reports/sales_by_tender.rb +42 -0
  155. data/app/queries/workarea/reports/sales_by_traffic_referrer.rb +1 -1
  156. data/app/queries/workarea/reports/sales_over_time.rb +10 -3
  157. data/app/queries/workarea/reports/searches.rb +1 -1
  158. data/app/queries/workarea/reports/searches_over_time.rb +1 -1
  159. data/app/queries/workarea/reports/searches_without_results_over_time.rb +1 -1
  160. data/app/queries/workarea/search/admin_fulfillment_skus.rb +20 -0
  161. data/app/queries/workarea/search/admin_releases.rb +1 -4
  162. data/app/queries/workarea/search/admin_search.rb +0 -4
  163. data/app/queries/workarea/search/admin_segments.rb +16 -0
  164. data/app/queries/workarea/search/admin_sorting.rb +1 -1
  165. data/app/queries/workarea/search/pagination.rb +1 -4
  166. data/app/queries/workarea/search/product_display_rules.rb +40 -8
  167. data/app/queries/workarea/search/product_entries.rb +15 -1
  168. data/app/queries/workarea/search/product_search.rb +4 -1
  169. data/app/queries/workarea/search/storefront_search/exact_matches.rb +1 -1
  170. data/app/queries/workarea/search/storefront_search/response.rb +6 -4
  171. data/app/queries/workarea/search/storefront_search.rb +5 -4
  172. data/app/seeds/workarea/assets_seeds.rb +2 -1
  173. data/app/seeds/workarea/insights_seeds.rb +0 -23
  174. data/app/seeds/workarea/orders_seeds.rb +7 -6
  175. data/app/seeds/workarea/products_seeds.rb +2 -0
  176. data/app/seeds/workarea/segments_seeds.rb +8 -0
  177. data/app/seeds/workarea/tax_seeds.rb +3 -3
  178. data/app/services/workarea/cancel_order.rb +8 -3
  179. data/app/services/workarea/copy_order.rb +6 -0
  180. data/app/services/workarea/create_fulfillment.rb +5 -3
  181. data/app/services/workarea/direct_upload.rb +11 -19
  182. data/app/services/workarea/hash_update.rb +1 -18
  183. data/app/services/workarea/packaging.rb +1 -1
  184. data/app/services/workarea/save_publishing.rb +5 -1
  185. data/app/workers/sidekiq/callbacks.rb +4 -52
  186. data/app/workers/sidekiq/callbacks_worker.rb +4 -6
  187. data/app/workers/workarea/bulk_index_admin.rb +2 -2
  188. data/app/workers/workarea/bulk_index_products.rb +6 -5
  189. data/app/workers/workarea/bulk_index_searches.rb +5 -5
  190. data/app/workers/workarea/deactivate_stale_discounts.rb +3 -3
  191. data/app/workers/workarea/generate_insights.rb +1 -1
  192. data/app/workers/workarea/index_admin_search.rb +1 -0
  193. data/app/workers/workarea/index_categorization.rb +4 -7
  194. data/app/workers/workarea/index_category.rb +2 -1
  195. data/app/workers/workarea/index_category_changes.rb +11 -6
  196. data/app/workers/workarea/index_fulfillment_changes.rb +2 -1
  197. data/app/workers/workarea/index_help.rb +2 -1
  198. data/app/workers/workarea/index_page.rb +2 -1
  199. data/app/workers/workarea/index_payment_transactions.rb +2 -1
  200. data/app/workers/workarea/index_product.rb +4 -4
  201. data/app/workers/workarea/index_product_children.rb +4 -3
  202. data/app/workers/workarea/index_product_rule.rb +3 -2
  203. data/app/workers/workarea/index_search_customizations.rb +3 -2
  204. data/app/workers/workarea/index_skus.rb +5 -6
  205. data/app/workers/workarea/keep_product_index_fresh.rb +3 -5
  206. data/app/workers/workarea/process_import.rb +3 -3
  207. data/app/workers/workarea/process_search_recommendations.rb +5 -9
  208. data/app/workers/workarea/publish_release.rb +1 -0
  209. data/app/workers/workarea/save_metrics.rb +116 -0
  210. data/app/workers/workarea/save_order_cancellation_metrics.rb +35 -0
  211. data/app/workers/workarea/save_order_metrics.rb +10 -74
  212. data/app/workers/workarea/status_reporter.rb +2 -4
  213. data/app/workers/workarea/synchronize_user_metrics.rb +17 -0
  214. data/app/workers/workarea/update_payment_profile_email.rb +22 -0
  215. data/app/workers/workarea/verify_scheduled_releases.rb +4 -11
  216. data/config/initializers/00_configuration.rb +185 -0
  217. data/config/initializers/02_assets.rb +1 -0
  218. data/config/initializers/05_scheduled_jobs.rb +0 -7
  219. data/config/initializers/10_rack_middleware.rb +2 -5
  220. data/config/initializers/11_payment.rb +4 -0
  221. data/config/initializers/13_rack_attack.rb +2 -4
  222. data/config/initializers/14_content_block_types.rb +16 -16
  223. data/config/initializers/15_endpoint_monitoring.rb +3 -6
  224. data/config/initializers/{21_premailer.rb → 24_premailer.rb} +1 -0
  225. data/config/initializers/{20_i18n_js.rb → 25_i18n_js.rb} +0 -0
  226. data/config/locales/en.yml +13 -24
  227. data/lib/generators/workarea/content_block_type/templates/initializer.rb +1 -1
  228. data/lib/generators/workarea/install/USAGE +0 -1
  229. data/lib/generators/workarea/install/install_generator.rb +0 -21
  230. data/lib/generators/workarea/install/templates/initializer.rb.erb +1 -1
  231. data/lib/tasks/insights.rake +1 -0
  232. data/lib/tasks/migrate.rake +106 -0
  233. data/lib/tasks/search.rake +17 -19
  234. data/lib/tasks/tests.rake +1 -1
  235. data/lib/workarea/cache.rb +6 -35
  236. data/lib/workarea/changelog.rake +2 -2
  237. data/lib/workarea/configuration/administrable/definition.rb +42 -0
  238. data/lib/workarea/configuration/administrable/field.rb +79 -0
  239. data/lib/workarea/configuration/administrable/fieldset.rb +44 -0
  240. data/lib/workarea/configuration/administrable_options.rb +24 -0
  241. data/lib/workarea/configuration/cache_store.rb +3 -1
  242. data/lib/workarea/configuration/content_blocks.rb +17 -0
  243. data/lib/workarea/configuration/mongoid.rb +1 -4
  244. data/lib/workarea/configuration/session.rb +36 -0
  245. data/lib/workarea/configuration/sidekiq.rb +3 -1
  246. data/lib/workarea/configuration.rb +121 -148
  247. data/lib/workarea/core/engine.rb +3 -58
  248. data/lib/workarea/core.rb +15 -11
  249. data/lib/workarea/elasticsearch/document.rb +8 -15
  250. data/lib/workarea/ext/freedom_patches/action_view_cache_helper.rb +4 -6
  251. data/lib/workarea/ext/freedom_patches/active_support_duration.rb +14 -0
  252. data/lib/workarea/ext/freedom_patches/money.rb +11 -0
  253. data/lib/workarea/ext/freedom_patches/premailer.rb +6 -0
  254. data/lib/workarea/ext/freedom_patches/string.rb +19 -4
  255. data/lib/workarea/ext/mongoid/find_ordered.rb +2 -2
  256. data/lib/workarea/ext/mongoid/lookup_hash.rb +30 -0
  257. data/lib/workarea/geolocation.rb +24 -6
  258. data/lib/workarea/routes_constraints/super_admin.rb +1 -1
  259. data/lib/workarea/version.rb +3 -4
  260. data/lib/workarea/visit.rb +92 -0
  261. data/lib/workarea/warnings.rb +95 -0
  262. data/lib/workarea.rb +102 -3
  263. data/test/dummy/config/initializers/session_store.rb +1 -1
  264. data/test/fixtures/tax_rates.csv +3 -3
  265. data/test/generators/workarea/content_block_type_generator_test.rb +1 -1
  266. data/test/generators/workarea/install_generator_test.rb +0 -13
  267. data/test/integration/workarea/authentication_test.rb +27 -4
  268. data/test/integration/workarea/authorization_test.rb +5 -0
  269. data/test/integration/workarea/cache_varies_integration_test.rb +21 -23
  270. data/test/integration/workarea/monitoring_integration_test.rb +5 -10
  271. data/test/javascripts/duplicate_id_spec.js +1 -7
  272. data/test/javascripts/fixtures/{duplicate_id_fail.html.haml → duplicate_id.html.haml} +0 -1
  273. data/test/javascripts/form_submitting_controls_spec.js +0 -1
  274. data/test/lib/workarea/asset_endpoints/favicons_test.rb +11 -13
  275. data/test/lib/workarea/configuration/administrable/definition_test.rb +71 -0
  276. data/test/lib/workarea/configuration/administrable/field_test.rb +128 -0
  277. data/test/lib/workarea/configuration/administrable/fieldset_test.rb +78 -0
  278. data/test/lib/workarea/configuration/configuration_test.rb +20 -0
  279. data/test/lib/workarea/elasticsearch/document_test.rb +0 -20
  280. data/test/lib/workarea/elasticsearch/query_cache_test.rb +7 -7
  281. data/test/lib/workarea/ext/freedom_patches/money_test.rb +11 -0
  282. data/test/lib/workarea/ext/mongoid/lookup_hash_test.rb +86 -0
  283. data/test/lib/workarea/geolocation_test.rb +20 -0
  284. data/test/mailers/workarea/application_mailer_test.rb +1 -11
  285. data/test/middleware/workarea/query_cache_middleware_test.rb +55 -0
  286. data/test/models/workarea/checkout/collect_payment_test.rb +14 -6
  287. data/test/models/workarea/checkout_test.rb +31 -57
  288. data/test/models/workarea/configuration/params_test.rb +37 -0
  289. data/test/models/workarea/data_file/csv_test.rb +8 -73
  290. data/test/models/workarea/data_file/import_test.rb +31 -0
  291. data/test/models/workarea/data_file/json_test.rb +6 -48
  292. data/test/models/workarea/data_file/tax_test.rb +3 -0
  293. data/test/models/workarea/fulfillment/policies/download_test.rb +39 -0
  294. data/test/models/workarea/fulfillment/sku_test.rb +54 -0
  295. data/test/models/workarea/insights/best_customers_test.rb +5 -2
  296. data/test/models/workarea/insights/best_full_price_customers_test.rb +5 -2
  297. data/test/models/workarea/insights/customer_acquisition_test.rb +1 -1
  298. data/test/models/workarea/insights/customers_at_risk_test.rb +1 -1
  299. data/test/models/workarea/insights/low_aov_customers_test.rb +1 -1
  300. data/test/models/workarea/inventory/collection_test.rb +75 -0
  301. data/test/models/workarea/metrics/affinity_test.rb +85 -0
  302. data/test/models/workarea/metrics/product_by_week_test.rb +27 -31
  303. data/test/models/workarea/metrics/search_by_day_test.rb +3 -0
  304. data/test/models/workarea/metrics/search_by_week_test.rb +27 -31
  305. data/test/models/workarea/metrics/update_user_aggregations_test.rb +62 -0
  306. data/test/models/workarea/metrics/user_test.rb +146 -63
  307. data/test/models/workarea/navigation/breadcrumbs_test.rb +12 -2
  308. data/test/models/workarea/order/queries_test.rb +2 -0
  309. data/test/models/workarea/order_test.rb +44 -0
  310. data/test/models/workarea/payment/address_test.rb +109 -111
  311. data/test/models/workarea/payment/credit_card_integration_test.rb +0 -52
  312. data/test/models/workarea/payment/credit_card_test.rb +5 -0
  313. data/test/models/workarea/pricing/cache_key_test.rb +7 -1
  314. data/test/models/workarea/pricing/calculators/tax_calculator_test.rb +41 -1
  315. data/test/models/workarea/pricing/discount/collection_test.rb +27 -29
  316. data/test/models/workarea/pricing/discount_test.rb +22 -24
  317. data/test/models/workarea/pricing/item_tax_applier_test.rb +83 -0
  318. data/test/models/workarea/pricing/price_test.rb +9 -0
  319. data/test/models/workarea/pricing/request_test.rb +13 -0
  320. data/test/models/workarea/pricing/sku_test.rb +9 -0
  321. data/test/models/workarea/releasable_active_test.rb +113 -0
  322. data/test/models/workarea/releasable_test.rb +69 -120
  323. data/test/models/workarea/release/changeset_test.rb +41 -0
  324. data/test/models/workarea/release_jobs_test.rb +52 -0
  325. data/test/models/workarea/release_previewing_test.rb +43 -0
  326. data/test/models/workarea/release_test.rb +59 -153
  327. data/test/models/workarea/search/admin/content_asset_test.rb +26 -28
  328. data/test/models/workarea/search/order_text_test.rb +35 -0
  329. data/test/models/workarea/search/storefront/category_query_test.rb +81 -0
  330. data/test/models/workarea/search/storefront/product/categories_test.rb +10 -70
  331. data/test/models/workarea/search/storefront/product_test.rb +10 -11
  332. data/test/models/workarea/search/storefront_test.rb +1 -13
  333. data/test/models/workarea/segment/life_cycle_test.rb +24 -0
  334. data/test/models/workarea/segment/rules/browser_info_test.rb +33 -0
  335. data/test/models/workarea/segment/rules/geolocation_option_test.rb +16 -0
  336. data/test/models/workarea/segment/rules/geolocation_test.rb +49 -0
  337. data/test/models/workarea/segment/rules/last_order_test.rb +32 -0
  338. data/test/models/workarea/segment/rules/logged_in_test.rb +25 -0
  339. data/test/models/workarea/segment/rules/orders_test.rb +59 -0
  340. data/test/models/workarea/segment/rules/revenue_test.rb +59 -0
  341. data/test/models/workarea/segment/rules/sessions_test.rb +26 -0
  342. data/test/models/workarea/segment/rules/tags_test.rb +27 -0
  343. data/test/models/workarea/segment/rules/traffic_referrer_test.rb +31 -0
  344. data/test/models/workarea/segment_test.rb +80 -0
  345. data/test/models/workarea/segmentable_test.rb +74 -0
  346. data/test/models/workarea/shipping/address_test.rb +109 -111
  347. data/test/models/workarea/shipping/sku_test.rb +8 -12
  348. data/test/models/workarea/user/password_reset_test.rb +4 -12
  349. data/test/models/workarea/user_test.rb +13 -10
  350. data/test/queries/workarea/admin_search_query_wrapper_test.rb +21 -25
  351. data/test/queries/workarea/categorization_test.rb +49 -0
  352. data/test/queries/workarea/featured_categorization_test.rb +66 -0
  353. data/test/queries/workarea/order_cancellation_metrics_test.rb +203 -0
  354. data/test/queries/workarea/order_item_details_test.rb +17 -0
  355. data/test/queries/workarea/order_metrics_test.rb +12 -0
  356. data/test/queries/workarea/product_releases_test.rb +56 -0
  357. data/test/queries/workarea/recommendation/searches_test.rb +3 -3
  358. data/test/queries/workarea/recommendation/user_activity_based_test.rb +4 -4
  359. data/test/queries/workarea/reports/customers_test.rb +12 -8
  360. data/test/queries/workarea/reports/report_test.rb +4 -6
  361. data/test/queries/workarea/reports/sales_by_country_test.rb +18 -3
  362. data/test/queries/workarea/reports/sales_by_product_test.rb +28 -8
  363. data/test/queries/workarea/reports/sales_by_sku_test.rb +28 -8
  364. data/test/queries/workarea/reports/sales_by_tender_test.rb +100 -0
  365. data/test/queries/workarea/reports/sales_by_traffic_referrer_test.rb +6 -6
  366. data/test/queries/workarea/search/admin_releases_test.rb +1 -26
  367. data/test/queries/workarea/search/admin_search_test.rb +0 -10
  368. data/test/queries/workarea/search/admin_users_test.rb +2 -2
  369. data/test/queries/workarea/search/category_browse_test.rb +53 -0
  370. data/test/queries/workarea/search/facet_sorting/size_test.rb +11 -13
  371. data/test/queries/workarea/search/pagination_test.rb +9 -26
  372. data/test/queries/workarea/search/product_entries_test.rb +27 -0
  373. data/test/queries/workarea/search/product_search_test.rb +0 -16
  374. data/test/queries/workarea/search/storefront_search/response_test.rb +26 -0
  375. data/test/queries/workarea/search/storefront_search_test.rb +34 -36
  376. data/test/services/workarea/cancel_order_test.rb +27 -13
  377. data/test/services/workarea/copy_order_test.rb +17 -0
  378. data/test/services/workarea/direct_upload_test.rb +1 -46
  379. data/test/services/workarea/export_report_test.rb +41 -45
  380. data/test/services/workarea/hash_update_test.rb +12 -12
  381. data/test/services/workarea/packaging_test.rb +9 -11
  382. data/test/services/workarea/save_publishing_test.rb +23 -0
  383. data/test/workers/sidekiq/callbacks_test.rb +0 -22
  384. data/test/workers/workarea/deactivate_stale_discounts_test.rb +2 -2
  385. data/test/workers/workarea/index_category_changes_test.rb +5 -7
  386. data/test/workers/workarea/keep_product_index_fresh_test.rb +1 -1
  387. data/test/workers/workarea/process_import_test.rb +0 -6
  388. data/test/workers/workarea/process_search_recommendations_test.rb +4 -5
  389. data/test/workers/workarea/status_reporter_test.rb +2 -1
  390. data/test/workers/workarea/synchronize_user_metrics_test.rb +57 -0
  391. data/test/workers/workarea/update_payment_profile_email_test.rb +27 -0
  392. data/test/workers/workarea/verify_scheduled_releases_test.rb +0 -26
  393. data/workarea-core.gemspec +13 -11
  394. metadata +196 -92
  395. data/app/assets/javascripts/workarea/core/templates/ui_menu_item.jst.ejs +0 -10
  396. data/app/controllers/workarea/admin_guest_browsing.rb +0 -54
  397. data/app/middleware/workarea/rack_cache_config_middleware.rb +0 -19
  398. data/app/queries/workarea/search/search_suggestions.rb +0 -43
  399. data/app/workers/workarea/bust_discount_cache.rb +0 -16
  400. data/app/workers/workarea/clean_user_activity.rb +0 -11
  401. data/app/workers/workarea/undo_release.rb +0 -15
  402. data/app/workers/workarea/update_email.rb +0 -33
  403. data/lib/generators/workarea/docker/USAGE +0 -16
  404. data/lib/generators/workarea/docker/docker_generator.rb +0 -61
  405. data/lib/generators/workarea/docker/templates/.env.erb +0 -6
  406. data/lib/generators/workarea/docker/templates/Dockerfile.erb +0 -48
  407. data/lib/generators/workarea/docker/templates/docker-compose.yml.erb +0 -72
  408. data/lib/generators/workarea/docker/templates/docker-entrypoint.sh.erb +0 -6
  409. data/lib/generators/workarea/docker/templates/docker-sync.yml.erb +0 -8
  410. data/lib/generators/workarea/docker/templates/docker-wait.sh +0 -11
  411. data/lib/generators/workarea/docker/templates/docker.env +0 -16
  412. data/lib/generators/workarea/docker/templates/docker_init.rb.erb +0 -29
  413. data/lib/workarea/configuration/headless_chrome.rb +0 -42
  414. data/lib/workarea/configuration/puma.rb +0 -37
  415. data/lib/workarea/ext/freedom_patches/i18n_js.rb +0 -27
  416. data/lib/workarea/ext/freedom_patches/mongoid_localized_defaults.rb +0 -25
  417. data/lib/workarea/ext/jbuilder/jbuilder_cache.rb +0 -29
  418. data/lib/workarea/ext/referer_parser/parser.decorator +0 -43
  419. data/lib/workarea/queues_pauser.rb +0 -26
  420. data/lib/workarea/robots.rb +0 -9
  421. data/test/generators/workarea/docker_generator_test.rb +0 -156
  422. data/test/javascripts/fixtures/duplicate_id_pass.html.haml +0 -2
  423. data/test/lib/workarea/ext/freedom_patches/mongoid_localized_defaults_test.rb +0 -25
  424. data/test/lib/workarea/ext/referer_parser/parser_test.rb +0 -20
  425. data/test/queries/workarea/search/search_suggestions_test.rb +0 -29
  426. data/test/workers/workarea/undo_release_test.rb +0 -23
  427. data/test/workers/workarea/update_email_test.rb +0 -39
@@ -6,7 +6,6 @@ Example:
6
6
 
7
7
  This will create:
8
8
  config/initializers/workarea.rb
9
- config/puma.rb
10
9
  db/seeds.rb
11
10
 
12
11
  This will modify:
@@ -37,14 +37,6 @@ module Workarea
37
37
  environment '# Run Sidekiq tasks synchronously so that Sidekiq is not required in Development', env: 'development'
38
38
  end
39
39
 
40
- def configure_puma
41
- remove_file 'config/puma.rb'
42
- create_file 'config/puma.rb', <<~TEXT
43
- require 'workarea/configuration/puma'
44
- Workarea::Configuration::Puma.load(self)
45
- TEXT
46
- end
47
-
48
40
  def update_test_helper
49
41
  inject_into_file(
50
42
  'test/test_helper.rb',
@@ -63,19 +55,6 @@ module Workarea
63
55
  remove_file 'public/favicon.ico'
64
56
  end
65
57
 
66
- def add_development_mailer_port
67
- development_port = <<-CODE
68
-
69
- config.action_mailer.default_url_options = { port: 3000 }
70
- CODE
71
-
72
- inject_into_file(
73
- 'config/environments/development.rb',
74
- development_port,
75
- before: /^end/
76
- )
77
- end
78
-
79
58
  private
80
59
 
81
60
  def app_name
@@ -4,7 +4,7 @@ Workarea.configure do |config|
4
4
 
5
5
  config.host = {
6
6
  'test' => 'www.example.com',
7
- 'development' => 'localhost',
7
+ 'development' => 'localhost:3000',
8
8
  'production' => 'www.<%= app_name.dasherize %>.com' # TODO
9
9
  }[Rails.env]
10
10
 
@@ -39,6 +39,7 @@ namespace :workarea do
39
39
  Workarea::Metrics::SearchByWeek.delete_all
40
40
  Workarea::Metrics::SearchForLastWeek.delete_all
41
41
  Workarea::Metrics::SkuByDay.delete_all
42
+ Workarea::Metrics::TenderByDay.delete_all
42
43
  Workarea::Metrics::TrafficReferrerByDay.delete_all
43
44
  Workarea::Metrics::User.delete_all
44
45
  Workarea::Insights::Base.delete_all
@@ -0,0 +1,106 @@
1
+ namespace :workarea do
2
+ namespace :migrate do
3
+ desc 'Migrate the database from v3.4 to v3.5'
4
+ task v3_5: :environment do
5
+ count = 0
6
+
7
+ Workarea::Release.where(:undo_at.gte => Time.current).each do |release|
8
+ undo = release.build_undo(publish_at: release.undo_at).tap(&:save!)
9
+
10
+ release.changesets.each do |changeset|
11
+ changeset.build_undo(release: undo).save!
12
+ end
13
+
14
+ Workarea::Scheduler.delete(release.undo_job_id)
15
+
16
+ release.update_attributes!(undo_at: nil, undo_job_id: nil)
17
+ count += 1
18
+ end
19
+
20
+ Workarea::Release.all.each { |r| Workarea::IndexAdminSearch.perform(r) }
21
+
22
+ puts "✅ #{count} undo releases have been created."
23
+
24
+ count = 0
25
+
26
+ Workarea::Tax::Category.each_by(100) do |category|
27
+ category.rates.each_by(500) do |rate|
28
+ rate.postal_code_percentage = rate.percentage
29
+ rate.percentage = nil
30
+ end
31
+
32
+ category.save!
33
+ count += 1
34
+ end
35
+
36
+ puts "✅ #{count} tax categories updated."
37
+
38
+ Workarea::Catalog::Product.each_by(500) do |product|
39
+ next unless product.digital?
40
+
41
+ product.skus.each do |sku|
42
+ fulfillment = Workarea::Fulfillment::Sku.find_or_initialize_by(id: sku)
43
+ fulfillment.policy = 'ignore'
44
+ fulfillment.save!
45
+ end
46
+ end
47
+
48
+ puts "✅ #{count} fulfillment skus for digital product have been created."
49
+
50
+ count = 0
51
+ failed_ids = []
52
+ backup = Mongo::Collection.new(Mongoid::Clients.default.database, 'workarea_legacy_segments')
53
+
54
+ legacy_segments = Workarea::Segment.collection.find.to_a
55
+ legacy_segments.each do |doc|
56
+ backup.insert_one(doc)
57
+ Workarea::Segment.collection.delete_one(doc.slice('_id'))
58
+
59
+ segment = Workarea::Segment.new(
60
+ id: doc['_id'],
61
+ name: doc['name'],
62
+ subscribed_user_ids: doc['subscribed_user_ids'],
63
+ created_at: doc['created_at'],
64
+ updated_at: doc['updated_at']
65
+ )
66
+
67
+ doc['conditions'].each do |condition|
68
+ if condition['_type'] =~ /UserTag/
69
+ segment.rules << Workarea::Segment::Rules::Tags.new(tags: condition['tags'])
70
+ elsif condition['_type'] =~ /TotalSpent/
71
+ rule = Workarea::Segment::Rules::Revenue.new
72
+
73
+ if condition['operator'] == 'equals'
74
+ rule.minimum = rule.maximum = Money.demongoize(condition['amount'])
75
+ elsif condition['operator'] == 'less_than_or_equals'
76
+ rule.maximum = Money.demongoize(condition['amount'])
77
+ elsif condition['operator'] == 'less_than'
78
+ rule.maximum = (Money.demongoize(condition['amount']) - 0.01.to_m)
79
+ elsif condition['operator'] == 'greater_than_or_equals'
80
+ rule.minimum = Money.demongoize(condition['amount'])
81
+ elsif condition['operator'] == 'greater_than'
82
+ rule.minimum = (Money.demongoize(condition['amount']) + 0.01.to_m)
83
+ end
84
+
85
+ segment.rules << rule
86
+ end
87
+ end
88
+
89
+ if doc['conditions'].size == segment.rules.size && segment.save
90
+ count += 1
91
+ else
92
+ failed_ids << doc['_id']
93
+ end
94
+ end
95
+
96
+ puts "✅ #{count} segments have been migrated." if count > 0
97
+ if failed_ids.any?
98
+ puts "⛔️ #{failed_ids.count} segments failed to migrate."
99
+ puts "You can find copies of the original segments in the workarea_legacy_segments collection."
100
+ puts "The segments that failed are #{failed_ids.to_sentence}."
101
+ end
102
+
103
+ puts "\nMigration complete!"
104
+ end
105
+ end
106
+ end
@@ -1,5 +1,10 @@
1
1
  namespace :workarea do
2
2
  namespace :search_index do
3
+ def setup
4
+ require 'sidekiq/testing/inline' unless ENV['INLINE'] == 'false'
5
+ Workarea.config.bulk_index_batch_size = ENV['BATCH_SIZE'].to_i if ENV['BATCH_SIZE'].present?
6
+ end
7
+
3
8
  desc 'Reindex all data'
4
9
  task all: :environment do
5
10
  Rake::Task['workarea:search_index:storefront'].invoke
@@ -9,17 +14,14 @@ namespace :workarea do
9
14
 
10
15
  desc 'Reindex admin'
11
16
  task admin: :environment do
12
- require 'sidekiq/testing/inline' unless ENV['INLINE'] == 'false'
17
+ setup
13
18
  puts 'Indexing admin...'
14
-
15
- Workarea::QueuesPauser.with_paused_queues do
16
- Workarea::Search::Admin.reset_indexes!
17
- end
19
+ Workarea::Search::Admin.reset_indexes!
18
20
 
19
21
  Mongoid.models.each do |klass|
20
22
  next unless Workarea::Search::Admin.for(klass.first).present?
21
23
 
22
- klass.all.each_slice_of(100) do |models|
24
+ klass.all.each_slice_of(Workarea.config.bulk_index_batch_size) do |models|
23
25
  Workarea::BulkIndexAdmin.perform_by_models(models)
24
26
  end
25
27
  end
@@ -31,13 +33,11 @@ namespace :workarea do
31
33
 
32
34
  desc 'Reindex storefront'
33
35
  task storefront: :environment do
34
- require 'sidekiq/testing/inline' unless ENV['INLINE'] == 'false'
36
+ setup
35
37
  puts 'Indexing storefront...'
36
38
 
37
- Workarea::QueuesPauser.with_paused_queues do
38
- Workarea::Search::Storefront.reset_indexes!
39
- Workarea::Search::Storefront.ensure_dynamic_mappings
40
- end
39
+ Workarea::Search::Storefront.reset_indexes!
40
+ Workarea::Search::Storefront.ensure_dynamic_mappings
41
41
 
42
42
  # This code finds all unique filters for products so we can index a sample
43
43
  # product for each to ensure the dynamic mappings get created.
@@ -65,12 +65,12 @@ namespace :workarea do
65
65
  Workarea::Search::Storefront::Product.new(product).save
66
66
  end
67
67
 
68
- Workarea::Catalog::Category.all.each_by(100) do |category|
69
- Workarea::Search::Storefront::Product.add_category(category)
68
+ Workarea::Catalog::Category.all.each_by(Workarea.config.bulk_index_batch_size) do |category|
69
+ Workarea::Search::Storefront::CategoryQuery.new(category).create
70
70
  Workarea::Search::Storefront::Category.new(category).save
71
71
  end
72
72
 
73
- Workarea::Content::Page.all.each_by(100) do |page|
73
+ Workarea::Content::Page.all.each_by(Workarea.config.bulk_index_batch_size) do |page|
74
74
  Workarea::Search::Storefront::Page.new(page).save
75
75
  end
76
76
 
@@ -80,14 +80,12 @@ namespace :workarea do
80
80
 
81
81
  desc 'Reindex help'
82
82
  task help: :environment do
83
- require 'sidekiq/testing/inline' unless ENV['INLINE'] == 'false'
83
+ setup
84
84
  puts 'Indexing help...'
85
85
 
86
- Workarea::QueuesPauser.with_paused_queues do
87
- Workarea::Search::Help.reset_indexes!
88
- end
86
+ Workarea::Search::Help.reset_indexes!
89
87
 
90
- Workarea::Help::Article.all.each_by(100) do |help_article|
88
+ Workarea::Help::Article.all.each_by(Workarea.config.bulk_index_batch_size) do |help_article|
91
89
  Workarea::Search::Help.new(help_article).save
92
90
  end
93
91
  end
data/lib/tasks/tests.rake CHANGED
@@ -86,7 +86,7 @@ namespace :workarea do
86
86
  Workarea::Plugin.installed.map(&:root) +
87
87
  [Rails.root]
88
88
 
89
- ENV['PERF_TEST'] = 'true'
89
+ ENV['PERF_TEST'] = true
90
90
  Rails::TestUnit::Runner.rake_run(
91
91
  roots
92
92
  .map { |r| FileList["#{r}/test/performance/**/*_test.rb"] }
@@ -7,10 +7,8 @@ module Workarea
7
7
  end
8
8
 
9
9
  class Varies
10
- class UnsupportedSessionAccess < RuntimeError; end
11
-
12
- attr_reader :env
13
- delegate_missing_to :request
10
+ attr_reader :visit
11
+ delegate_missing_to :visit
14
12
 
15
13
  # This allows varying the HTTP and fragment caching on cookies, session or
16
14
  # other request-based info (like headers). This is useful when you'd like
@@ -66,40 +64,13 @@ module Workarea
66
64
  Workarea.config.cache_varies << block
67
65
  end
68
66
 
69
- def initialize(env, varies = Workarea.config.cache_varies)
70
- @env = env
71
- @varies = Array.wrap(varies)
67
+ def initialize(visit, varies = Workarea.config.cache_varies)
68
+ @visit = visit
69
+ @varies = varies || []
72
70
  end
73
71
 
74
72
  def to_s
75
- @to_s ||= @varies.map { |v| instance_exec(&v).to_s }.join(':')
76
- end
77
-
78
- def cookies
79
- request.cookie_jar
80
- end
81
-
82
- def session
83
- raise UnsupportedSessionAccess unless session_cookie_store?
84
- @session ||= (cookies.signed_or_encrypted[session_key] || {}).with_indifferent_access
85
- end
86
-
87
- def request
88
- @request ||= ActionDispatch::Request.new(env)
89
- end
90
-
91
- def geolocation
92
- @geolocation ||= Workarea::Geolocation.new(env, request.remote_ip)
93
- end
94
-
95
- private
96
-
97
- def session_key
98
- Rails.application.config.session_options[:key]
99
- end
100
-
101
- def session_cookie_store?
102
- Rails.application.config.session_store == ActionDispatch::Session::CookieStore
73
+ @to_s ||= @varies.map { |v| visit.instance_exec(&v).to_s }.join(':')
103
74
  end
104
75
  end
105
76
  end
@@ -38,7 +38,7 @@ namespace :workarea do
38
38
  author: author
39
39
  }
40
40
 
41
- if subject.start_with?('Revert "')
41
+ if subject.start_with?('Revert')
42
42
  reverts << body.match(/[a-f0-9]{40}/)
43
43
  reverts << sha
44
44
  end
@@ -67,7 +67,7 @@ namespace :workarea do
67
67
  message << " #{line.strip}"
68
68
  end
69
69
  end
70
- message << "\n #{entry[:author]}\n"
70
+ message << " #{entry[:author]}\n"
71
71
  end
72
72
 
73
73
  # ensure and append to changelog
@@ -0,0 +1,42 @@
1
+ module Workarea
2
+ module Configuration
3
+ module Administrable
4
+ class Definition
5
+ attr_reader :fieldsets
6
+ delegate :field, to: :application_fieldset
7
+
8
+ def initialize
9
+ @fieldsets = SwappableList.new
10
+ @fieldsets.push(Fieldset.new('Application', namespaced: false))
11
+ end
12
+
13
+ def fieldset(name, override: false, namespaced: true, &block)
14
+ fieldset = Fieldset.new(name, namespaced: namespaced)
15
+ existing = find_fieldset(fieldset.id)
16
+
17
+ if override && existing.present?
18
+ @fieldsets.swap(existing, fieldset)
19
+ fieldset.instance_eval(&block) if block_given?
20
+ elsif existing.present?
21
+ existing.instance_eval(&block) if block_given?
22
+ else
23
+ @fieldsets.push(fieldset)
24
+ fieldset.instance_eval(&block) if block_given?
25
+ end
26
+ end
27
+
28
+ def application_fieldset
29
+ @application_fieldset ||= find_fieldset(:application)
30
+ end
31
+
32
+ def find_fieldset(id)
33
+ @fieldsets.detect { |fieldset| fieldset.id == id.to_sym }
34
+ end
35
+
36
+ def fields
37
+ @fieldsets.flat_map(&:fields)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,79 @@
1
+ module Workarea
2
+ module Configuration
3
+ module Administrable
4
+ class Field
5
+ class Invalid < StandardError; end
6
+
7
+ attr_reader :name, :type, :fieldset, :options
8
+ delegate :default, :description, :values_type, :encrypted, to: :options
9
+
10
+ def initialize(name, type:, fieldset: nil, **options)
11
+ @name = name
12
+ @type = type.to_s.underscore.to_sym
13
+ @fieldset = fieldset
14
+ @options = OpenStruct.new(options)
15
+ end
16
+
17
+ def id
18
+ @id ||= (options.id || name.to_s.systemize).to_sym
19
+ end
20
+
21
+ def key
22
+ @key ||= fieldset&.namespaced? ? :"#{fieldset.id}_#{id}" : id
23
+ end
24
+
25
+ def type_class
26
+ Workarea.config.configurable_field_types[type]&.constantize
27
+ end
28
+
29
+ def values
30
+ return options.values unless options.values.respond_to?(:call)
31
+ options.values.call
32
+ end
33
+
34
+ def values_type_class
35
+ return unless type == :hash
36
+
37
+ values_type = options.values_type || :string
38
+ Workarea.config.configurable_field_types[values_type]&.constantize
39
+ end
40
+
41
+ def overridden?
42
+ Workarea.config.key?(key)
43
+ end
44
+
45
+ def encrypted?
46
+ !!encrypted
47
+ end
48
+
49
+ def validate!
50
+ validate_id
51
+ validate_type
52
+ self
53
+ end
54
+
55
+ def allow_blank?
56
+ !!@options.allow_blank
57
+ end
58
+
59
+ def merge!(options = {})
60
+ @options = OpenStruct.new(options.to_h.merge(options))
61
+ end
62
+
63
+ private
64
+
65
+ def validate_id
66
+ unless id.to_s.valid_method_name?
67
+ raise Invalid.new("configuration field '#{name}' does not have a valid id - #{id}.")
68
+ end
69
+ end
70
+
71
+ def validate_type
72
+ unless type_class.present?
73
+ raise Invalid.new("configuration field '#{name}' does not have a valid type - #{@type}.")
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,44 @@
1
+ module Workarea
2
+ module Configuration
3
+ module Administrable
4
+ class Fieldset
5
+ attr_accessor :fields, :name
6
+
7
+ def initialize(name, namespaced: true)
8
+ @name = name
9
+ @namespaced = namespaced
10
+ @fields = SwappableList.new
11
+ end
12
+
13
+ def id
14
+ name.to_s.systemize.to_sym
15
+ end
16
+
17
+ def namespaced?
18
+ @namespaced
19
+ end
20
+
21
+ def field(name, type: nil, override: false, **options)
22
+ field = Field.new(name, fieldset: self, type: type, **options)
23
+ existing = find_field(field.id)
24
+
25
+ if existing.present? && override
26
+ @fields.swap(existing, field.validate!)
27
+ elsif existing.present?
28
+ existing.merge!(options)
29
+ existing.validate!
30
+ else
31
+ @fields.push(field.validate!)
32
+ end
33
+
34
+ return unless field.encrypted?
35
+ Rails.application.config.filter_parameters << field.key
36
+ end
37
+
38
+ def find_field(id)
39
+ @fields.detect { |field| field.id == id.to_sym }
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,24 @@
1
+ module Workarea
2
+ module Configuration
3
+ class AdministrableOptions < ActiveSupport::InheritableOptions
4
+ def method_missing(name, *args)
5
+ static_config = super
6
+ return static_config if static_config.present? || static_config.to_s == 'false'
7
+ return static_config unless check_fieldsets?(name)
8
+
9
+ Configuration::Admin.instance.send(name)
10
+ end
11
+
12
+ def respond_to_missing?(name, include_private)
13
+ true
14
+ end
15
+
16
+ private
17
+
18
+ def check_fieldsets?(name)
19
+ ::Mongoid.clients.any? &&
20
+ Configuration::Admin.fields.keys.include?(name.to_s)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -7,7 +7,9 @@ module Workarea
7
7
  if Rails.env.test?
8
8
  Rails.application.config.cache_store = :null_store
9
9
  elsif !Rails.env.development?
10
- Rails.application.config.cache_store = :redis_store, Workarea::Configuration::Redis.cache.to_url
10
+ Rails.application.config.cache_store = :redis_cache_store, {
11
+ url: Workarea::Configuration::Redis.cache.to_url
12
+ }
11
13
 
12
14
  require 'redis-rack-cache'
13
15
  Rails.application.config.action_dispatch.rack_cache = {
@@ -0,0 +1,17 @@
1
+ module Workarea
2
+ module Configuration
3
+ module ContentBlocks
4
+ extend self
5
+
6
+ def building_blocks
7
+ @building_blocks ||= []
8
+ end
9
+
10
+ def load
11
+ building_blocks.each do |block|
12
+ Content::BlockTypeDefinition.define(&block)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -13,10 +13,7 @@ module Workarea
13
13
  end
14
14
 
15
15
  def indexes_enforced?
16
- servers = ::Mongoid::Clients.default.cluster.servers
17
- addresses = servers.map(&:address).map(&:to_s)
18
-
19
- client = Mongo::Client.new(addresses, database: 'admin')
16
+ client = ::Mongoid::Clients.default.use('admin')
20
17
  result = client.command(getParameter: 1, notablescan: nil)
21
18
  client.close
22
19
 
@@ -0,0 +1,36 @@
1
+ module Workarea
2
+ module Configuration
3
+ module Session
4
+ class NoExpirationConfigured < StandardError; end
5
+ extend self
6
+
7
+ def cookie_store?
8
+ return @cookie_store if defined?(@cookie_store)
9
+ @cookie_store = Rails.application.config.session_store == ActionDispatch::Session::CookieStore
10
+ end
11
+
12
+ def key
13
+ Rails.application.config.session_options[:key]
14
+ end
15
+
16
+ def ttl
17
+ Rails.application.config.session_options[:expire_after]
18
+ end
19
+
20
+ def validate!
21
+ if ttl.blank?
22
+ raise(
23
+ NoExpirationConfigured,
24
+ <<~eos
25
+
26
+ Problem:
27
+ Workarea requires a session expiration to be set. We recommend 30 minutes.
28
+ Solution:
29
+ Add `expire_after: 30.minutes` to your session configuration in `config/initializers/session_store.rb`
30
+ eos
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -9,6 +9,7 @@ module Workarea
9
9
  require_dependency "#{Workarea::Core::Engine.root}/app/middleware/workarea/audit_log_client_middleware"
10
10
  require_dependency "#{Workarea::Core::Engine.root}/app/middleware/workarea/audit_log_server_middleware"
11
11
  require_dependency "#{Workarea::Core::Engine.root}/app/middleware/workarea/release_server_middleware"
12
+ require_dependency "#{Workarea::Core::Engine.root}/app/middleware/workarea/query_cache_middleware"
12
13
 
13
14
  unless manually_configured?
14
15
  ::Sidekiq.options.merge!(
@@ -34,6 +35,7 @@ module Workarea
34
35
  ::Sidekiq.configure_server do |config|
35
36
  config.server_middleware do |chain|
36
37
  chain.add I18nServerMiddleware
38
+ chain.add QueryCacheMiddleware
37
39
  chain.add AuditLogServerMiddleware
38
40
  chain.add ReleaseServerMiddleware
39
41
  end
@@ -96,7 +98,7 @@ module Workarea
96
98
 
97
99
  def queues
98
100
  ENV['WORKAREA_SIDEKIQ_QUEUES'].to_s.split(',').presence ||
99
- %w(high default low mailers)
101
+ %w(releases high default low mailers)
100
102
  end
101
103
 
102
104
  def pool_size