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
@@ -7,54 +7,6 @@ module Sidekiq
7
7
  class InvalidConfiguration < RuntimeError; end
8
8
 
9
9
  class << self
10
- # The list of workers that perform Sidekiq callbacks. Used for checking
11
- # whether one of them need to be fired off after a callback happens.
12
- #
13
- # @private
14
- # @return [Array<Class>]
15
- #
16
- def workers
17
- caching_classes? ? workers_list : workers_list.map(&:constantize)
18
- end
19
-
20
- # Add a {Class} to the list of workers to check when running callbacks.
21
- #
22
- # @private
23
- # @param [Class] worker
24
- #
25
- def add_worker(klass)
26
- if caching_classes?
27
- workers_list << klass
28
- elsif !workers_list.include?(klass.name)
29
- workers_list << klass.name
30
- end
31
- end
32
-
33
- # Whether Rails is caching classes, which matters when checking workers to
34
- # run by comparing the worker's configuration with the model running the
35
- # callback.
36
- #
37
- # When we aren't caching classes, we need to use the fully qualified
38
- # constant name to decide since the classes could have been reloaded due
39
- # to code changes.
40
- #
41
- # @return [Boolean]
42
- #
43
- def caching_classes?
44
- ::Rails.application.config.cache_classes
45
- end
46
-
47
- # Convenience reference to the tracked list of workers in the Rails config
48
- #
49
- # @private
50
- # @return [Array<String,Class>]
51
- #
52
- def workers_list
53
- config = ::Rails.application.config
54
- config.sidekiq_callbacks_workers = [] unless config.respond_to?(:sidekiq_callbacks_workers)
55
- config.sidekiq_callbacks_workers
56
- end
57
-
58
10
  # Permanently or temporarily enable callback workers. If
59
11
  # no workers are given, it will enable all callback
60
12
  # workers during the execution of the block or globally if no
@@ -196,7 +148,7 @@ module Sidekiq
196
148
  # finds a problem.
197
149
  #
198
150
  def assert_valid_config!
199
- Sidekiq::Callbacks.workers.each do |worker|
151
+ Sidekiq::CallbacksWorker.workers.each do |worker|
200
152
  if (worker.enqueue_on.values.flatten & [:find, 'find']).any?
201
153
  raise(
202
154
  InvalidConfiguration,
@@ -209,7 +161,7 @@ module Sidekiq
209
161
  private
210
162
 
211
163
  def set_workers(workers, action)
212
- workers = Sidekiq::Callbacks.workers if workers.blank?
164
+ workers = Sidekiq::CallbacksWorker.workers if workers.blank?
213
165
 
214
166
  if !block_given?
215
167
  workers.each(&action)
@@ -245,7 +197,7 @@ module Sidekiq
245
197
  private
246
198
 
247
199
  def _enqueue_callback_workers(kind)
248
- Sidekiq::Callbacks.workers.select(&:enabled?).each do |worker|
200
+ Sidekiq::CallbacksWorker.workers.select(&:enabled?).each do |worker|
249
201
  worker.callbacks.each do |klass, callbacks|
250
202
  if _perform_callback_worker?(klass, callbacks, kind, worker)
251
203
  args = worker.find_callback_args(self)
@@ -267,7 +219,7 @@ module Sidekiq
267
219
  end
268
220
 
269
221
  def _is_a_callback_type_match?(model_class)
270
- return is_a?(model_class) if Sidekiq::Callbacks.caching_classes?
222
+ return is_a?(model_class) if ::Rails.application.config.cache_classes
271
223
 
272
224
  # This is a funny way of doing the same check as `is_a?`.
273
225
  #
@@ -4,17 +4,15 @@ module Sidekiq
4
4
  module CallbacksWorker
5
5
  extend ActiveSupport::Concern
6
6
 
7
+ mattr_accessor :workers
8
+ self.workers = []
9
+
7
10
  included do
8
11
  thread_cattr_accessor :enabled, :inlined
9
- Sidekiq::Callbacks.add_worker(self)
12
+ CallbacksWorker.workers << self
10
13
  end
11
14
 
12
15
  class_methods do
13
- # @deprecated TODO remove this in v3.6
14
- def workers
15
- Sidekiq::Callbacks.workers
16
- end
17
-
18
16
  def enabled?
19
17
  enabled.nil? || !!enabled
20
18
  end
@@ -6,14 +6,14 @@ module Workarea
6
6
 
7
7
  class << self
8
8
  def perform(klass, ids)
9
- ids.each_slice(100) do |group|
9
+ ids.each_slice(Workarea.config.bulk_index_batch_size) do |group|
10
10
  perform_by_models(klass.constantize.in(id: group).to_a)
11
11
  end
12
12
  end
13
13
 
14
14
  def perform_by_models(models)
15
15
  return if models.empty?
16
- Workarea::Search::Admin.bulk { documents_for(models) }
16
+ Workarea::Search::Admin.bulk(documents_for(models))
17
17
  end
18
18
 
19
19
  private
@@ -6,20 +6,21 @@ module Workarea
6
6
 
7
7
  class << self
8
8
  def perform(ids = Catalog::Product.pluck(:id))
9
- ids.each_slice(100) do |group|
9
+ ids.each_slice(Workarea.config.bulk_index_batch_size) do |group|
10
10
  perform_by_models(Catalog::Product.in(id: group).to_a)
11
11
  end
12
12
  end
13
13
 
14
14
  def perform_by_models(products)
15
15
  return if products.blank?
16
+ products = Array.wrap(products)
16
17
 
17
- Search::Storefront.bulk do
18
- Search::ProductEntries.new(products).map(&:as_bulk_document)
19
- end
18
+ documents = Search::ProductEntries.new(products).map(&:as_bulk_document)
19
+ Search::Storefront.bulk(documents)
20
20
 
21
- products.each { |p| p.set(last_indexed_at: Time.current) }
21
+ Catalog::Product.in(id: products.map(&:id)).set(last_indexed_at: Time.current)
22
22
  end
23
+ alias_method :perform_by_model, :perform_by_models
23
24
  end
24
25
 
25
26
  def perform(ids)
@@ -4,7 +4,7 @@ module Workarea
4
4
 
5
5
  class << self
6
6
  def perform(ids = popular_searches.pluck(:id))
7
- ids.each_slice(100) do |group|
7
+ ids.each_slice(Workarea.config.bulk_index_batch_size) do |group|
8
8
  perform_by_models(Metrics::SearchByWeek.in(id: group).to_a)
9
9
  end
10
10
  end
@@ -18,11 +18,11 @@ module Workarea
18
18
  end
19
19
 
20
20
  def perform_by_models(searches)
21
- Search::Storefront.bulk do
22
- searches.map do |model|
23
- Search::Storefront::Search.new(model).as_bulk_document
24
- end
21
+ documents = searches.map do |model|
22
+ Search::Storefront::Search.new(model).as_bulk_document
25
23
  end
24
+
25
+ Search::Storefront.bulk(documents)
26
26
  end
27
27
  end
28
28
 
@@ -29,9 +29,9 @@ module Workarea
29
29
 
30
30
  def all_active_discount_ids
31
31
  Pricing::Discount
32
- .where(:updated_at.lt => Workarea.config.discount_staleness_ttl.ago)
33
- .active
34
- .pluck(:id)
32
+ .where(:created_at.lt => Workarea.config.discount_staleness_ttl.ago)
33
+ .select(&:active?)
34
+ .map(&:id)
35
35
  .map(&:to_s)
36
36
  end
37
37
  end
@@ -25,7 +25,7 @@ module Workarea
25
25
  Metrics::ProductByWeek.append_last_week!
26
26
  Metrics::SearchForLastWeek.aggregate!
27
27
  Metrics::SearchByWeek.append_last_week!
28
- Metrics::User.update_aggregations!
28
+ Metrics::UpdateUserAggregations.update!
29
29
  Insights::Base.subclasses.each(&:generate_weekly!)
30
30
  end
31
31
 
@@ -6,6 +6,7 @@ module Workarea
6
6
  sidekiq_options(
7
7
  queue: 'low',
8
8
  lock: :until_executing,
9
+ query_cache: true,
9
10
  enqueue_on: {
10
11
  ApplicationDocument => [:save, :touch, :destroy],
11
12
  with: -> { [self.class.name, id] },
@@ -4,16 +4,13 @@ module Workarea
4
4
  include Sidekiq::CallbacksWorker
5
5
 
6
6
  sidekiq_options(
7
- enqueue_on: { Catalog::Category => :save },
8
- lock: :until_executing
7
+ enqueue_on: { Catalog::Category => [:save, :save_release_changes] },
8
+ lock: :until_executing,
9
+ query_cache: true
9
10
  )
10
11
 
11
12
  def self.perform(category)
12
- Search::Storefront::Product.delete_category(category.id)
13
-
14
- return unless category.product_rules.present?
15
-
16
- Search::Storefront::Product.add_category(category)
13
+ Search::Storefront::CategoryQuery.new(category).update
17
14
  end
18
15
 
19
16
  def perform(id)
@@ -5,7 +5,8 @@ module Workarea
5
5
 
6
6
  sidekiq_options(
7
7
  enqueue_on: { Catalog::Category => [:save, :destroy] },
8
- lock: :until_executing
8
+ lock: :until_executing,
9
+ query_cache: true
9
10
  )
10
11
 
11
12
  def perform(id)
@@ -4,9 +4,10 @@ module Workarea
4
4
  include Sidekiq::CallbacksWorker
5
5
 
6
6
  sidekiq_options(
7
- enqueue_on: { Catalog::Category => :save, with: -> { [changes] } },
7
+ enqueue_on: { Catalog::Category => [:save, :save_release_changes], with: -> { [changes] } },
8
8
  ignore_if: -> { changes['product_ids'].blank? },
9
- lock: :until_executing
9
+ lock: :until_executing,
10
+ query_cache: true
10
11
  )
11
12
 
12
13
  def perform(changes)
@@ -15,11 +16,15 @@ module Workarea
15
16
  ids = require_index_ids(*changes['product_ids'])
16
17
 
17
18
  if ids.size > max_count
18
- ids.each_slice(max_count) do |ids|
19
- BulkIndexProducts.perform_async(ids)
20
- end
19
+ ids.each { |id| IndexProduct.perform_async(id) }
21
20
  else
22
- BulkIndexProducts.perform(ids)
21
+ Catalog::Product.in(id: ids).each do |product|
22
+ begin
23
+ IndexProduct.perform(product)
24
+ rescue
25
+ IndexProduct.perform_async(product.id)
26
+ end
27
+ end
23
28
  end
24
29
  end
25
30
 
@@ -5,7 +5,8 @@ module Workarea
5
5
 
6
6
  sidekiq_options(
7
7
  enqueue_on: { Fulfillment => :save }, queue: 'low',
8
- lock: :until_executing
8
+ lock: :until_executing,
9
+ query_cache: true
9
10
  )
10
11
 
11
12
  def perform(order_id)
@@ -4,7 +4,8 @@ module Workarea
4
4
  include Sidekiq::CallbacksWorker
5
5
 
6
6
  sidekiq_options(
7
- enqueue_on: { Help::Article => [:save, :destroy] }
7
+ enqueue_on: { Help::Article => [:save, :destroy] },
8
+ query_cache: true
8
9
  )
9
10
 
10
11
  def perform(id)
@@ -5,7 +5,8 @@ module Workarea
5
5
 
6
6
  sidekiq_options(
7
7
  enqueue_on: { Content::Page => [:save, :destroy] },
8
- lock: :until_executing
8
+ lock: :until_executing,
9
+ query_cache: true
9
10
  )
10
11
 
11
12
  def perform(id)
@@ -9,7 +9,8 @@ module Workarea
9
9
  with: -> { [payment_id] },
10
10
  ignore_if: -> { !success? }
11
11
  },
12
- lock: :until_executing
12
+ lock: :until_executing,
13
+ query_cache: true
13
14
  )
14
15
 
15
16
  def perform(order_id)
@@ -4,14 +4,14 @@ module Workarea
4
4
  include Sidekiq::CallbacksWorker
5
5
 
6
6
  sidekiq_options(
7
- enqueue_on: { Catalog::Product => [:save, :destroy] },
8
- lock: :until_executing
7
+ enqueue_on: { Catalog::Product => [:save, :save_release_changes, :destroy] },
8
+ lock: :until_executing,
9
+ query_cache: true
9
10
  )
10
11
 
11
12
  class << self
12
13
  def perform(product)
13
- Search::ProductEntries.new(product).each(&:save)
14
- product.set(last_indexed_at: Time.current)
14
+ BulkIndexProducts.perform_by_model(product)
15
15
  end
16
16
  end
17
17
 
@@ -5,11 +5,12 @@ module Workarea
5
5
 
6
6
  sidekiq_options(
7
7
  enqueue_on: {
8
- Catalog::Variant => [:save, :destroy],
9
- Catalog::ProductImage => [:save, :destroy],
8
+ Catalog::Variant => [:save, :save_release_changes, :destroy],
9
+ Catalog::ProductImage => [:save, :save_release_changes, :destroy],
10
10
  with: -> { [_parent.id.to_s] }
11
11
  },
12
- lock: :until_executing
12
+ lock: :until_executing,
13
+ query_cache: true
13
14
  )
14
15
 
15
16
  def perform(id)
@@ -5,13 +5,14 @@ module Workarea
5
5
 
6
6
  sidekiq_options(
7
7
  enqueue_on: {
8
- ProductRule => %i[save destroy],
8
+ ProductRule => %i[save save_release_changes destroy],
9
9
  ignore_if: -> {
10
10
  product_list.class.name != 'Workarea::Catalog::Category'
11
11
  },
12
12
  with: -> { [product_list.id] }
13
13
  },
14
- unique: :until_executing
14
+ unique: :until_executing,
15
+ query_cache: true
15
16
  )
16
17
 
17
18
  def perform(id)
@@ -5,10 +5,11 @@ module Workarea
5
5
 
6
6
  sidekiq_options(
7
7
  enqueue_on: {
8
- Search::Customization => [:save, :destroy],
8
+ Search::Customization => [:save, :save_release_changes, :destroy],
9
9
  with: -> { [product_ids] }
10
10
  },
11
- lock: :until_executing
11
+ lock: :until_executing,
12
+ query_cache: true
12
13
  )
13
14
 
14
15
  def perform(product_ids)
@@ -5,16 +5,15 @@ module Workarea
5
5
 
6
6
  sidekiq_options(
7
7
  enqueue_on: {
8
- Inventory::Sku => [:touch, :save, :destroy],
9
- Pricing::Sku => [:touch, :save, :destroy]
8
+ Inventory::Sku => [:touch, :save, :save_release_changes, :destroy],
9
+ Pricing::Sku => [:touch, :save, :save_release_changes, :destroy]
10
10
  },
11
- lock: :until_executing
11
+ lock: :until_executing,
12
+ query_cache: true
12
13
  )
13
14
 
14
15
  def perform(sku)
15
- Catalog::Product.find_for_update_by_sku(sku).each do |product|
16
- IndexProduct.perform(product)
17
- end
16
+ BulkIndexProducts.perform_by_models(Catalog::Product.find_for_update_by_sku(sku))
18
17
  end
19
18
  end
20
19
  end
@@ -4,15 +4,13 @@ module Workarea
4
4
 
5
5
  sidekiq_options(
6
6
  lock: :until_executing,
7
- retry: false
7
+ retry: false,
8
+ query_cache: true
8
9
  )
9
10
 
10
11
  def perform(*args)
11
12
  all = never_indexed + stale
12
-
13
- all.take(Workarea.config.stale_products_size).each do |product|
14
- IndexProduct.perform(product)
15
- end
13
+ BulkIndexProducts.perform_by_models(all.take(Workarea.config.stale_products_size))
16
14
  end
17
15
 
18
16
  def never_indexed
@@ -17,11 +17,11 @@ module Workarea
17
17
  import.process!
18
18
 
19
19
  ensure
20
- if import&.error?
20
+ if import.error?
21
21
  Admin::DataFileMailer.import_error(id).deliver_now
22
- elsif import&.failure?
22
+ elsif import.failure?
23
23
  Admin::DataFileMailer.import_failure(id).deliver_now
24
- elsif import.present?
24
+ else
25
25
  Admin::DataFileMailer.import(id).deliver_now
26
26
  end
27
27
  end
@@ -7,10 +7,10 @@ module Workarea
7
7
 
8
8
  start = Workarea.config.recommendation_expiration.ago
9
9
 
10
- Recommendation::UserActivity
10
+ Metrics::User
11
11
  .where(:updated_at.gte => start)
12
12
  .desc(:updated_at) # sort by updated_at to ensure use of that index
13
- .each_by(page_size) { |activity| add(activity) }
13
+ .each_by(page_size) { |metrics| add(metrics) }
14
14
 
15
15
  predictor.process!
16
16
  end
@@ -19,13 +19,9 @@ module Workarea
19
19
  @predictor ||= Recommendation::SearchPredictor.new
20
20
  end
21
21
 
22
- def add(activity)
23
- searches = activity
24
- .searches
25
- .map { |s| QueryString.new(s).id }
26
- .reject(&:blank?)
27
-
28
- predictor.sessions.add_set(activity.id.to_s, searches) if searches.many?
22
+ def add(metrics)
23
+ return unless metrics.viewed.search_ids.many?
24
+ predictor.sessions.add_set(metrics.id, metrics.viewed.search_ids)
29
25
  end
30
26
 
31
27
  def page_size
@@ -1,6 +1,7 @@
1
1
  module Workarea
2
2
  class PublishRelease
3
3
  include Sidekiq::Worker
4
+ sidekiq_options queue: 'releases'
4
5
 
5
6
  def perform(release_id)
6
7
  release = Release.find(release_id)
@@ -0,0 +1,116 @@
1
+ module Workarea
2
+ module SaveMetrics
3
+ extend ActiveSupport::Concern
4
+
5
+ class_methods do
6
+ def save_sales(metrics)
7
+ Metrics::SalesByDay.inc(at: metrics.occured_at, **metrics.sales_data)
8
+ end
9
+
10
+ def save_catalog(metrics)
11
+ save_products(metrics)
12
+ save_categories(metrics)
13
+ save_skus(metrics)
14
+ end
15
+
16
+ def save_products(metrics)
17
+ metrics.products.each do |product_id, data|
18
+ Metrics::ProductByDay.inc(
19
+ key: { product_id: product_id },
20
+ at: metrics.occured_at,
21
+ **data
22
+ )
23
+ end
24
+ end
25
+
26
+ def save_categories(metrics)
27
+ metrics.categories.each do |category_id, data|
28
+ Metrics::CategoryByDay.inc(
29
+ key: { category_id: category_id },
30
+ at: metrics.occured_at,
31
+ **data
32
+ )
33
+ end
34
+ end
35
+
36
+ def save_skus(metrics)
37
+ metrics.skus.each do |sku, data|
38
+ Metrics::SkuByDay.inc(
39
+ key: { sku: sku },
40
+ at: metrics.occured_at,
41
+ **data
42
+ )
43
+ end
44
+ end
45
+
46
+ def save_traffic(metrics)
47
+ save_country(metrics)
48
+ save_searches(metrics)
49
+ save_traffic_referrer(metrics)
50
+ end
51
+
52
+ def save_country(metrics)
53
+ if metrics.country.present?
54
+ Metrics::CountryByDay.inc(
55
+ key: { country: metrics.country },
56
+ at: metrics.occured_at,
57
+ **metrics.sales_data
58
+ )
59
+ end
60
+ end
61
+
62
+ def save_searches(metrics)
63
+ metrics.searches.each do |query_id, data|
64
+ Metrics::SearchByDay.inc(
65
+ key: { query_id: query_id },
66
+ at: metrics.occured_at,
67
+ **metrics.sales_data
68
+ )
69
+ end
70
+ end
71
+
72
+ def save_traffic_referrer(metrics)
73
+ if metrics.traffic_referrer.present?
74
+ Metrics::TrafficReferrerByDay.inc(
75
+ key: {
76
+ medium: metrics.traffic_referrer.medium,
77
+ source: metrics.traffic_referrer.source
78
+ },
79
+ at: metrics.occured_at,
80
+ **metrics.sales_data
81
+ )
82
+ end
83
+ end
84
+
85
+ def save_pricing(metrics)
86
+ metrics.discounts.each do |discount_id, data|
87
+ Metrics::DiscountByDay.inc(
88
+ key: { discount_id: discount_id },
89
+ at: metrics.occured_at,
90
+ **data
91
+ )
92
+ end
93
+ end
94
+
95
+ def save_tenders(metrics)
96
+ metrics.tenders.each do |tender, data|
97
+ Metrics::TenderByDay.inc(
98
+ key: { tender: tender },
99
+ at: metrics.occured_at,
100
+ **data
101
+ )
102
+ end
103
+ end
104
+
105
+ def save_segments(metrics)
106
+ metrics.segments.each do |segment_id, data|
107
+ Metrics::SegmentByDay.inc(
108
+ key: { segment_id: segment_id },
109
+ at: metrics.occured_at,
110
+ **data
111
+ )
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,35 @@
1
+ module Workarea
2
+ class SaveOrderCancellationMetrics
3
+ include Sidekiq::Worker
4
+ include SaveMetrics
5
+
6
+ class << self
7
+ def perform(order, cancel_data = {})
8
+ metrics = OrderCancellationMetrics.new(
9
+ order,
10
+ **cancel_data.symbolize_keys
11
+ )
12
+
13
+ save_sales(metrics)
14
+ save_user(metrics)
15
+ save_products(metrics)
16
+ save_skus(metrics)
17
+ save_country(metrics)
18
+ save_segments(metrics)
19
+
20
+ order.metrics_saved!
21
+ end
22
+
23
+ def save_user(metrics)
24
+ Metrics::User.save_cancellation(
25
+ at: metrics.occured_at,
26
+ **metrics.user_data
27
+ )
28
+ end
29
+ end
30
+
31
+ def perform(order_id, cancel_data = {})
32
+ self.class.perform(Order.find(order_id), cancel_data)
33
+ end
34
+ end
35
+ end