workarea-core 3.4.44 → 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.rb +18 -6
  26. data/app/models/workarea/checkout/collect_payment.rb +10 -1
  27. data/app/models/workarea/checkout/fraud/analyzer.rb +44 -0
  28. data/app/models/workarea/checkout/fraud/no_decision_analyzer.rb +14 -0
  29. data/app/models/workarea/checkout/fraud/test_analyzer.rb +26 -0
  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.rb +12 -82
  33. data/app/models/workarea/content/asset.rb +5 -18
  34. data/app/models/workarea/content/block.rb +8 -2
  35. data/app/models/workarea/content/block_draft.rb +7 -2
  36. data/app/models/workarea/content/block_type.rb +2 -2
  37. data/app/models/workarea/content/block_type_definition.rb +4 -0
  38. data/app/models/workarea/content/preset.rb +1 -1
  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.rb +47 -4
  72. data/app/models/workarea/order/fraud_decision.rb +18 -0
  73. data/app/models/workarea/order/item.rb +5 -0
  74. data/app/models/workarea/order/queries.rb +1 -0
  75. data/app/models/workarea/order/status.rb +10 -1
  76. data/app/models/workarea/payment.rb +7 -2
  77. data/app/models/workarea/payment/credit_card.rb +12 -0
  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.rb +2 -3
  82. data/app/models/workarea/pricing/discount/application_group.rb +8 -3
  83. data/app/models/workarea/pricing/discount/free_gift.rb +2 -1
  84. data/app/models/workarea/pricing/discount/redemption.rb +1 -1
  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.rb +72 -99
  95. data/app/models/workarea/release/activation.rb +45 -0
  96. data/app/models/workarea/release/changes.rb +45 -0
  97. data/app/models/workarea/release/changeset.rb +42 -52
  98. data/app/models/workarea/release/preview.rb +28 -0
  99. data/app/models/workarea/release/status.rb +2 -24
  100. data/app/models/workarea/release_session.rb +11 -11
  101. data/app/models/workarea/search/admin.rb +17 -39
  102. data/app/models/workarea/search/admin/catalog_product.rb +1 -2
  103. data/app/models/workarea/search/admin/fulfillment_sku.rb +27 -0
  104. data/app/models/workarea/search/admin/order.rb +1 -1
  105. data/app/models/workarea/search/admin/pricing_discount.rb +1 -1
  106. data/app/models/workarea/search/admin/release.rb +1 -4
  107. data/app/models/workarea/search/admin/segment.rb +19 -0
  108. data/app/models/workarea/search/order_text.rb +23 -6
  109. data/app/models/workarea/search/storefront.rb +33 -29
  110. data/app/models/workarea/search/storefront/category_query.rb +152 -0
  111. data/app/models/workarea/search/storefront/product/categories.rb +11 -45
  112. data/app/models/workarea/segment.rb +54 -0
  113. data/app/models/workarea/segment/first_time_customer.rb +8 -0
  114. data/app/models/workarea/segment/first_time_visitor.rb +12 -0
  115. data/app/models/workarea/segment/life_cycle.rb +44 -0
  116. data/app/models/workarea/segment/loyal_customer.rb +12 -0
  117. data/app/models/workarea/segment/returning_customer.rb +14 -0
  118. data/app/models/workarea/segment/returning_visitor.rb +12 -0
  119. data/app/models/workarea/segment/rules/base.rb +16 -0
  120. data/app/models/workarea/segment/rules/browser_info.rb +29 -0
  121. data/app/models/workarea/segment/rules/geolocation.rb +29 -0
  122. data/app/models/workarea/segment/rules/geolocation_option.rb +53 -0
  123. data/app/models/workarea/segment/rules/last_order.rb +14 -0
  124. data/app/models/workarea/segment/rules/logged_in.rb +13 -0
  125. data/app/models/workarea/segment/rules/orders.rb +17 -0
  126. data/app/models/workarea/segment/rules/revenue.rb +17 -0
  127. data/app/models/workarea/segment/rules/sessions.rb +17 -0
  128. data/app/models/workarea/segment/rules/tags.rb +14 -0
  129. data/app/models/workarea/segment/rules/traffic_referrer.rb +18 -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.rb +5 -4
  170. data/app/queries/workarea/search/storefront_search/exact_matches.rb +1 -1
  171. data/app/queries/workarea/search/storefront_search/response.rb +6 -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.rb +102 -3
  236. data/lib/workarea/cache.rb +6 -35
  237. data/lib/workarea/changelog.rake +2 -2
  238. data/lib/workarea/configuration.rb +121 -148
  239. data/lib/workarea/configuration/administrable/definition.rb +42 -0
  240. data/lib/workarea/configuration/administrable/field.rb +79 -0
  241. data/lib/workarea/configuration/administrable/fieldset.rb +44 -0
  242. data/lib/workarea/configuration/administrable_options.rb +24 -0
  243. data/lib/workarea/configuration/cache_store.rb +3 -1
  244. data/lib/workarea/configuration/content_blocks.rb +17 -0
  245. data/lib/workarea/configuration/mongoid.rb +1 -4
  246. data/lib/workarea/configuration/session.rb +36 -0
  247. data/lib/workarea/configuration/sidekiq.rb +3 -1
  248. data/lib/workarea/core.rb +15 -11
  249. data/lib/workarea/core/engine.rb +3 -58
  250. data/lib/workarea/elasticsearch/document.rb +8 -15
  251. data/lib/workarea/ext/freedom_patches/action_view_cache_helper.rb +4 -6
  252. data/lib/workarea/ext/freedom_patches/active_support_duration.rb +14 -0
  253. data/lib/workarea/ext/freedom_patches/money.rb +11 -0
  254. data/lib/workarea/ext/freedom_patches/premailer.rb +6 -0
  255. data/lib/workarea/ext/freedom_patches/string.rb +19 -4
  256. data/lib/workarea/ext/mongoid/find_ordered.rb +2 -2
  257. data/lib/workarea/ext/mongoid/lookup_hash.rb +30 -0
  258. data/lib/workarea/geolocation.rb +24 -6
  259. data/lib/workarea/routes_constraints/super_admin.rb +1 -1
  260. data/lib/workarea/version.rb +3 -4
  261. data/lib/workarea/visit.rb +92 -0
  262. data/lib/workarea/warnings.rb +95 -0
  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 +12 -10
  394. metadata +188 -78
  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
@@ -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
@@ -92,6 +92,7 @@ require 'haml'
92
92
  require 'ejs'
93
93
  require 'jbuilder'
94
94
  require 'redcarpet'
95
+ require 'tribute'
95
96
  require 'turbolinks'
96
97
  require 'csv'
97
98
  require 'icalendar'
@@ -106,6 +107,8 @@ require 'dragonfly/s3_data_store'
106
107
  require 'serviceworker-rails'
107
108
  require 'chartkick'
108
109
  require 'logstasher' if ENV['WORKAREA_LOGSTASH'] =~ /true/i
110
+ require 'mongoid/encrypted'
111
+ require 'browser'
109
112
 
110
113
  #
111
114
  # Extensions
@@ -126,21 +129,20 @@ require 'workarea/ext/freedom_patches/country'
126
129
  require 'workarea/ext/freedom_patches/net_http_ssl_connection'
127
130
  require 'workarea/ext/freedom_patches/dragonfly_job_fetch_url'
128
131
  require 'workarea/ext/freedom_patches/dragonfly_callable_url_host'
129
- require 'workarea/ext/freedom_patches/mongoid_localized_defaults'
130
- require 'workarea/ext/freedom_patches/i18n_js'
132
+ require 'workarea/ext/freedom_patches/active_support_duration'
133
+ require 'workarea/ext/freedom_patches/premailer'
131
134
  require 'workarea/ext/mongoid/list_field'
132
135
  require 'workarea/ext/mongoid/each_by'
133
136
  require 'workarea/ext/mongoid/except'
134
137
  require 'workarea/ext/mongoid/moped_bson'
135
138
  require 'workarea/ext/mongoid/timestamps_timeless'
136
139
  require 'workarea/ext/mongoid/error'
140
+ require 'workarea/ext/mongoid/lookup_hash'
137
141
  require 'workarea/ext/active_shipping/workarea'
138
142
  require 'workarea/ext/mongoid/audit_log_entry.decorator'
139
143
  require 'workarea/ext/mongoid/find_ordered'
140
144
  require 'workarea/ext/sprockets/ruby_processor'
141
145
  require 'workarea/ext/jbuilder/jbuilder_append_partials'
142
- require 'workarea/ext/jbuilder/jbuilder_cache'
143
- require 'workarea/ext/referer_parser/parser.decorator'
144
146
 
145
147
  if Rails.env.development?
146
148
  require 'workarea/ext/freedom_patches/routes_reloader'
@@ -157,6 +159,10 @@ end
157
159
  #
158
160
 
159
161
  require 'workarea/configuration'
162
+ require 'workarea/configuration/administrable/field'
163
+ require 'workarea/configuration/administrable/fieldset'
164
+ require 'workarea/configuration/administrable/definition'
165
+ require 'workarea/configuration/administrable_options'
160
166
  require 'workarea/configuration/mongoid_client'
161
167
  require 'workarea/configuration/mongoid'
162
168
  require 'workarea/configuration/elasticsearch'
@@ -171,7 +177,8 @@ require 'workarea/configuration/action_mailer'
171
177
  require 'workarea/configuration/logstasher'
172
178
  require 'workarea/configuration/error_handling'
173
179
  require 'workarea/configuration/i18n'
174
- require 'workarea/configuration/headless_chrome'
180
+ require 'workarea/configuration/session'
181
+ require 'workarea/configuration/content_blocks'
175
182
  require 'workarea/elasticsearch/index'
176
183
  require 'workarea/elasticsearch/document'
177
184
  require 'workarea/elasticsearch/query_cache'
@@ -189,7 +196,6 @@ require 'workarea/plugin'
189
196
  require 'workarea/plugin/asset_appends_helper'
190
197
  require 'workarea/image_optim_processor'
191
198
  require 'workarea/url_token'
192
- require 'workarea/robots'
193
199
  require 'workarea/paged_array'
194
200
  require 'workarea/geolocation'
195
201
  require 'workarea/autoexpire_cache_redis'
@@ -210,17 +216,15 @@ require 'workarea/cache'
210
216
  require 'workarea/scheduled_jobs'
211
217
  require 'workarea/string_id'
212
218
  require 'workarea/mail_interceptor'
213
- require 'workarea/queues_pauser'
219
+ require 'workarea/visit'
220
+ require 'workarea/warnings'
214
221
 
215
222
  #
216
- # Engines
223
+ # Core
217
224
  #
218
225
  #
219
226
  require 'workarea/version'
220
227
  require 'workarea/core/engine'
221
- require 'workarea/admin/engine'
222
- require 'workarea/storefront/engine'
223
- require 'workarea/testing/engine' if Rails.env.test?
224
228
 
225
229
  #
226
230
  # Testing
@@ -49,9 +49,6 @@ module Workarea
49
49
  PingHomeBase.ping unless Rails.env.development? || Rails.env.test?
50
50
 
51
51
  if Rails.env.test?
52
- # This is here to help transition a poorly named configuration
53
- Configuration::HeadlessChrome.load
54
-
55
52
  # System tests can timeout without this, due to slow template resolution
56
53
  # if you have many plugins installed.
57
54
  ActionView::Resolver.caching = true
@@ -70,63 +67,11 @@ module Workarea
70
67
  Configuration::Mongoid.load unless Mongoid::Config.configured?
71
68
  Configuration::Dragonfly.load
72
69
  Configuration::LocalizedActiveFields.load
70
+ Configuration::ContentBlocks.load
73
71
 
74
72
  Workarea::ScheduledJobs.clean
75
-
76
- if Rails.application.config.time_zone == 'UTC'
77
- warn <<~eos
78
- **************************************************
79
- ⛔️ WARNING: Rails.application.config.time_zone is set to UTC, which you \
80
- probably don't want.
81
- As of Workarea 3.2, we use that value as the standard \
82
- timezone for the admin side of the application.
83
- We recommend setting this to the timezone of the retailer. Contact them to \
84
- find their preference.
85
- **************************************************
86
- eos
87
- end
88
-
89
- auto_redirect = 'Workarea::Search::StorefrontSearch::ProductAutoRedirect'
90
- if Workarea.config.storefront_search_middleware.include?(auto_redirect)
91
- warn <<~eos
92
- DEPRECATION WARNING: #{auto_redirect} is deprecated and will be removed in Workarea 3.3. \
93
- Remove it from Workarea.config.storefront_search_middleware.
94
- eos
95
- end
96
-
97
- if (!Rails.env.test? &&
98
- !Workarea.config.skip_service_connections &&
99
- Configuration::Mongoid.indexes_enforced?)
100
- warn <<~eos
101
- **************************************************
102
- ⛔️ WARNING: MongoDB is configured with notablescan.
103
-
104
- This means that MongoDB won't run queries that require a collection scan and will return an error.
105
- Workarea turns this on for running tests to assert that queries have indexes, and turns it off at the end of the test run.
106
- Since you're not running in the test environment and this is turned on, it might mean the test process was killed, preventing Workarea from turning it off.
107
-
108
- To turn this off, start the mongo shell and run this command:
109
- db.getSiblingDB("admin").runCommand( { setParameter: 1, notablescan: 0 } )
110
- **************************************************
111
- eos
112
- end
113
-
114
- if !Rails.env.test? && !Rails.env.development? &&
115
- Dragonfly.app(:workarea).datastore.is_a?(Dragonfly::FileDataStore)
116
-
117
- warn <<~eos
118
- **************************************************
119
- ⛔️ WARNING: Dragonfly is configured to use the filesystem.
120
-
121
- This means all Dragonfly assets (assets, product images, etc.) will be stored
122
- locally and not accessible to all servers within your environment.
123
-
124
- We recommend using S3 when running in a live environment by setting
125
- WORKAREA_S3_REGION and WORKAREA_S3_BUCKET_NAME in your environment variables,
126
- and setting `Workarea.config.asset_store = :s3` in an initializer.
127
- **************************************************
128
- eos
129
- end
73
+ Workarea::Warnings.check
74
+ Configuration::Session.validate!
130
75
  end
131
76
  end
132
77
  end