workarea-api-storefront 4.4.6

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 (203) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/README.md +58 -0
  4. data/Rakefile +10 -0
  5. data/app/controllers/workarea/api/storefront/accounts_controller.rb +31 -0
  6. data/app/controllers/workarea/api/storefront/analytics_controller.rb +41 -0
  7. data/app/controllers/workarea/api/storefront/application_controller.rb +65 -0
  8. data/app/controllers/workarea/api/storefront/assets_controller.rb +11 -0
  9. data/app/controllers/workarea/api/storefront/authentication.rb +30 -0
  10. data/app/controllers/workarea/api/storefront/authentication_tokens_controller.rb +50 -0
  11. data/app/controllers/workarea/api/storefront/cart_items_controller.rb +100 -0
  12. data/app/controllers/workarea/api/storefront/carts_controller.rb +47 -0
  13. data/app/controllers/workarea/api/storefront/categories_controller.rb +25 -0
  14. data/app/controllers/workarea/api/storefront/checkouts_controller.rb +117 -0
  15. data/app/controllers/workarea/api/storefront/contacts_controller.rb +20 -0
  16. data/app/controllers/workarea/api/storefront/current_checkout.rb +60 -0
  17. data/app/controllers/workarea/api/storefront/email_signups_controller.rb +15 -0
  18. data/app/controllers/workarea/api/storefront/menus_controller.rb +19 -0
  19. data/app/controllers/workarea/api/storefront/orders_controller.rb +32 -0
  20. data/app/controllers/workarea/api/storefront/pages_controller.rb +14 -0
  21. data/app/controllers/workarea/api/storefront/password_resets_controller.rb +17 -0
  22. data/app/controllers/workarea/api/storefront/products_controller.rb +17 -0
  23. data/app/controllers/workarea/api/storefront/recent_views_controller.rb +46 -0
  24. data/app/controllers/workarea/api/storefront/recommendations_controller.rb +22 -0
  25. data/app/controllers/workarea/api/storefront/saved_addresses_controller.rb +38 -0
  26. data/app/controllers/workarea/api/storefront/saved_credit_cards_controller.rb +54 -0
  27. data/app/controllers/workarea/api/storefront/searches_controller.rb +29 -0
  28. data/app/controllers/workarea/api/storefront/system_content_controller.rb +16 -0
  29. data/app/controllers/workarea/api/storefront/taxons_controller.rb +20 -0
  30. data/app/controllers/workarea/api/storefront/user_activity.rb +36 -0
  31. data/app/controllers/workarea/storefront/application_controller.decorator +12 -0
  32. data/app/helpers/workarea/api/storefront/application_helper.rb +15 -0
  33. data/app/helpers/workarea/api/storefront/checkouts_helper.rb +11 -0
  34. data/app/helpers/workarea/api/storefront/content_blocks_helper.rb +38 -0
  35. data/app/models/workarea/catalog/category.decorator +7 -0
  36. data/app/models/workarea/user/authentication_token.rb +33 -0
  37. data/app/models/workarea/user.decorator +8 -0
  38. data/app/view_models/workarea/api/storefront/search_suggestion_view_model.rb +21 -0
  39. data/app/views/workarea/api/storefront/accounts/_account.json.jbuilder +7 -0
  40. data/app/views/workarea/api/storefront/accounts/create.json.jbuilder +7 -0
  41. data/app/views/workarea/api/storefront/accounts/show.json.jbuilder +1 -0
  42. data/app/views/workarea/api/storefront/assets/show.json.jbuilder +4 -0
  43. data/app/views/workarea/api/storefront/authentication_tokens/_authentication_token.json.jbuilder +2 -0
  44. data/app/views/workarea/api/storefront/authentication_tokens/create.json.jbuilder +1 -0
  45. data/app/views/workarea/api/storefront/authentication_tokens/update.json.jbuilder +1 -0
  46. data/app/views/workarea/api/storefront/cart_items/item.json.jbuilder +9 -0
  47. data/app/views/workarea/api/storefront/carts/index.json.jbuilder +4 -0
  48. data/app/views/workarea/api/storefront/carts/show.json.jbuilder +1 -0
  49. data/app/views/workarea/api/storefront/categories/_category.json.jbuilder +4 -0
  50. data/app/views/workarea/api/storefront/categories/index.json.jbuilder +3 -0
  51. data/app/views/workarea/api/storefront/categories/show.json.jbuilder +30 -0
  52. data/app/views/workarea/api/storefront/checkouts/_shipping_options.json.jbuilder +4 -0
  53. data/app/views/workarea/api/storefront/checkouts/show.json.jbuilder +17 -0
  54. data/app/views/workarea/api/storefront/checkouts/steps/_addresses.json.jbuilder +19 -0
  55. data/app/views/workarea/api/storefront/checkouts/steps/_payment.json.jbuilder +9 -0
  56. data/app/views/workarea/api/storefront/checkouts/steps/_shipping.json.jbuilder +9 -0
  57. data/app/views/workarea/api/storefront/content_blocks/_block.json.jbuilder +7 -0
  58. data/app/views/workarea/api/storefront/email_signups/create.json.jbuilder +2 -0
  59. data/app/views/workarea/api/storefront/email_signups/show.json.jbuilder +4 -0
  60. data/app/views/workarea/api/storefront/facets/_range.json.jbuilder +8 -0
  61. data/app/views/workarea/api/storefront/facets/_terms.json.jbuilder +8 -0
  62. data/app/views/workarea/api/storefront/fulfillments/_fulfillment.json.jbuilder +18 -0
  63. data/app/views/workarea/api/storefront/menus/_menu.json.jbuilder +11 -0
  64. data/app/views/workarea/api/storefront/menus/index.json.jbuilder +3 -0
  65. data/app/views/workarea/api/storefront/menus/show.json.jbuilder +1 -0
  66. data/app/views/workarea/api/storefront/orders/_item.json.jbuilder +26 -0
  67. data/app/views/workarea/api/storefront/orders/_order.json.jbuilder +42 -0
  68. data/app/views/workarea/api/storefront/orders/index.json.jbuilder +4 -0
  69. data/app/views/workarea/api/storefront/orders/show.json.jbuilder +7 -0
  70. data/app/views/workarea/api/storefront/orders/tenders/_credit_card.json.jbuilder +6 -0
  71. data/app/views/workarea/api/storefront/orders/tenders/_store_credit.json.jbuilder +2 -0
  72. data/app/views/workarea/api/storefront/pages/show.json.jbuilder +16 -0
  73. data/app/views/workarea/api/storefront/products/_image_urls.json.jbuilder +5 -0
  74. data/app/views/workarea/api/storefront/products/_product.json.jbuilder +41 -0
  75. data/app/views/workarea/api/storefront/products/show.json.jbuilder +9 -0
  76. data/app/views/workarea/api/storefront/recent_views/show.json.jbuilder +8 -0
  77. data/app/views/workarea/api/storefront/recommendations/show.json.jbuilder +3 -0
  78. data/app/views/workarea/api/storefront/saved_addresses/_saved_address.json.jbuilder +2 -0
  79. data/app/views/workarea/api/storefront/saved_addresses/index.json.jbuilder +4 -0
  80. data/app/views/workarea/api/storefront/saved_addresses/show.json.jbuilder +2 -0
  81. data/app/views/workarea/api/storefront/saved_credit_cards/_card.json.jbuilder +9 -0
  82. data/app/views/workarea/api/storefront/saved_credit_cards/index.json.jbuilder +4 -0
  83. data/app/views/workarea/api/storefront/saved_credit_cards/show.json.jbuilder +2 -0
  84. data/app/views/workarea/api/storefront/searches/index.json.jbuilder +1 -0
  85. data/app/views/workarea/api/storefront/searches/show.json.jbuilder +19 -0
  86. data/app/views/workarea/api/storefront/shared/_address.json.jbuilder +12 -0
  87. data/app/views/workarea/api/storefront/shared/_pagination.json.jbuilder +11 -0
  88. data/app/views/workarea/api/storefront/system_content/show.json.jbuilder +12 -0
  89. data/app/views/workarea/api/storefront/taxons/_taxon.json.jbuilder +10 -0
  90. data/app/views/workarea/api/storefront/taxons/show.json.jbuilder +7 -0
  91. data/app/workers/workarea/remove_authentication_tokens_on_password_changes.rb +19 -0
  92. data/bin/rails +18 -0
  93. data/config/initializers/config.rb +2 -0
  94. data/config/locales/en.yml +13 -0
  95. data/config/routes.rb +41 -0
  96. data/lib/workarea/api/storefront/engine.rb +10 -0
  97. data/lib/workarea/api/storefront.rb +15 -0
  98. data/test/documentation/workarea/api/storefront/accounts_documentation_test.rb +70 -0
  99. data/test/documentation/workarea/api/storefront/analytics_documentation_test.rb +51 -0
  100. data/test/documentation/workarea/api/storefront/assets_documentation_test.rb +32 -0
  101. data/test/documentation/workarea/api/storefront/authentication_documentation_test.rb +84 -0
  102. data/test/documentation/workarea/api/storefront/cart_items_documentation_test.rb +104 -0
  103. data/test/documentation/workarea/api/storefront/carts_documentation_test.rb +121 -0
  104. data/test/documentation/workarea/api/storefront/categories_documentation_test.rb +90 -0
  105. data/test/documentation/workarea/api/storefront/checkouts_documentation_test.rb +142 -0
  106. data/test/documentation/workarea/api/storefront/contacts_documentation_test.rb +39 -0
  107. data/test/documentation/workarea/api/storefront/email_signups_documentation_test.rb +53 -0
  108. data/test/documentation/workarea/api/storefront/menus_documentation_test.rb +67 -0
  109. data/test/documentation/workarea/api/storefront/orders_documentation_test.rb +127 -0
  110. data/test/documentation/workarea/api/storefront/pages_documentation_test.rb +66 -0
  111. data/test/documentation/workarea/api/storefront/password_resets_documentation_test.rb +30 -0
  112. data/test/documentation/workarea/api/storefront/products_documentation_test.rb +64 -0
  113. data/test/documentation/workarea/api/storefront/recent_views_documentation_test.rb +116 -0
  114. data/test/documentation/workarea/api/storefront/recommendations_documentation_test.rb +68 -0
  115. data/test/documentation/workarea/api/storefront/saved_addresses_documentation_test.rb +129 -0
  116. data/test/documentation/workarea/api/storefront/saved_credit_cards_documentation_test.rb +129 -0
  117. data/test/documentation/workarea/api/storefront/searches_documentation_test.rb +88 -0
  118. data/test/documentation/workarea/api/storefront/system_content_documentation_test.rb +66 -0
  119. data/test/documentation/workarea/api/storefront/taxons_documentation_test.rb +37 -0
  120. data/test/documentation/workarea/api/storefront/validation_documentation_test.rb +81 -0
  121. data/test/dummy/Rakefile +7 -0
  122. data/test/dummy/app/assets/config/manifest.js +4 -0
  123. data/test/dummy/app/assets/images/.keep +0 -0
  124. data/test/dummy/app/assets/javascripts/application.js +13 -0
  125. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  126. data/test/dummy/app/controllers/application_controller.rb +3 -0
  127. data/test/dummy/app/controllers/concerns/.keep +0 -0
  128. data/test/dummy/app/helpers/application_helper.rb +2 -0
  129. data/test/dummy/app/jobs/application_job.rb +2 -0
  130. data/test/dummy/app/mailers/.keep +0 -0
  131. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  132. data/test/dummy/app/models/.keep +0 -0
  133. data/test/dummy/app/models/concerns/.keep +0 -0
  134. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  135. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  136. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  137. data/test/dummy/bin/bundle +3 -0
  138. data/test/dummy/bin/rails +4 -0
  139. data/test/dummy/bin/rake +4 -0
  140. data/test/dummy/bin/setup +34 -0
  141. data/test/dummy/bin/update +29 -0
  142. data/test/dummy/config/application.rb +25 -0
  143. data/test/dummy/config/boot.rb +5 -0
  144. data/test/dummy/config/cable.yml +9 -0
  145. data/test/dummy/config/environment.rb +5 -0
  146. data/test/dummy/config/environments/development.rb +55 -0
  147. data/test/dummy/config/environments/production.rb +86 -0
  148. data/test/dummy/config/environments/test.rb +43 -0
  149. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  150. data/test/dummy/config/initializers/assets.rb +11 -0
  151. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  152. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  153. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  154. data/test/dummy/config/initializers/inflections.rb +16 -0
  155. data/test/dummy/config/initializers/mime_types.rb +4 -0
  156. data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
  157. data/test/dummy/config/initializers/session_store.rb +3 -0
  158. data/test/dummy/config/initializers/workarea.rb +8 -0
  159. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  160. data/test/dummy/config/locales/en.yml +23 -0
  161. data/test/dummy/config/puma.rb +47 -0
  162. data/test/dummy/config/routes.rb +6 -0
  163. data/test/dummy/config/secrets.yml +22 -0
  164. data/test/dummy/config/spring.rb +6 -0
  165. data/test/dummy/config.ru +4 -0
  166. data/test/dummy/db/seeds.rb +2 -0
  167. data/test/dummy/log/.keep +0 -0
  168. data/test/dummy/public/404.html +67 -0
  169. data/test/dummy/public/422.html +67 -0
  170. data/test/dummy/public/500.html +66 -0
  171. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  172. data/test/dummy/public/apple-touch-icon.png +0 -0
  173. data/test/dummy/public/favicon.ico +1 -0
  174. data/test/integration/workarea/api/storefront/accounts_integration_test.rb +49 -0
  175. data/test/integration/workarea/api/storefront/analytics_integration_test.rb +36 -0
  176. data/test/integration/workarea/api/storefront/assets_integration_test.rb +24 -0
  177. data/test/integration/workarea/api/storefront/authentication_integration_test.rb +50 -0
  178. data/test/integration/workarea/api/storefront/authentication_tokens_integration_test.rb +87 -0
  179. data/test/integration/workarea/api/storefront/cart_items_integration_test.rb +149 -0
  180. data/test/integration/workarea/api/storefront/carts_integration_test.rb +114 -0
  181. data/test/integration/workarea/api/storefront/categories_integration_test.rb +84 -0
  182. data/test/integration/workarea/api/storefront/checkouts_integration_test.rb +203 -0
  183. data/test/integration/workarea/api/storefront/contacts_integration_test.rb +28 -0
  184. data/test/integration/workarea/api/storefront/email_signups_integration_test.rb +35 -0
  185. data/test/integration/workarea/api/storefront/menus_integration_test.rb +53 -0
  186. data/test/integration/workarea/api/storefront/orders_integration_test.rb +115 -0
  187. data/test/integration/workarea/api/storefront/pages_integration_test.rb +57 -0
  188. data/test/integration/workarea/api/storefront/password_resets_integration_test.rb +20 -0
  189. data/test/integration/workarea/api/storefront/products_integration_test.rb +50 -0
  190. data/test/integration/workarea/api/storefront/recent_views_integration_test.rb +118 -0
  191. data/test/integration/workarea/api/storefront/recommendations_integration_test.rb +51 -0
  192. data/test/integration/workarea/api/storefront/saved_addresses_integration_test.rb +100 -0
  193. data/test/integration/workarea/api/storefront/saved_credit_cards_integration_test.rb +107 -0
  194. data/test/integration/workarea/api/storefront/searches_integration_test.rb +128 -0
  195. data/test/integration/workarea/api/storefront/system_content_integration_test.rb +35 -0
  196. data/test/integration/workarea/api/storefront/taxons_integration_test.rb +44 -0
  197. data/test/integration/workarea/api/storefront/user_carts_integration_test.rb +55 -0
  198. data/test/models/workarea/user/authentication_token_test.rb +30 -0
  199. data/test/support/authentication_test.rb +25 -0
  200. data/test/support/orders_test.rb +18 -0
  201. data/test/test_helper.rb +10 -0
  202. data/workarea-api-storefront.gemspec +18 -0
  203. metadata +277 -0
@@ -0,0 +1,19 @@
1
+ json.addresses do
2
+ json.complete step.complete?
3
+ json.email summary.email
4
+ json.problems summary.order.errors.full_messages
5
+
6
+ json.shipping_address do
7
+ if summary.shipping_address.present?
8
+ json.partial! 'workarea/api/storefront/shared/address', address: summary.shipping_address
9
+ json.problems summary.shipping_address.errors.full_messages
10
+ end
11
+ end
12
+
13
+ json.billing_address do
14
+ if summary.billing_address.present?
15
+ json.partial! 'workarea/api/storefront/shared/address', address: summary.billing_address
16
+ json.problems summary.billing_address.errors.full_messages
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ json.payment do
2
+ json.complete step.complete?
3
+ json.problems step.payment.errors.full_messages
4
+
5
+ json.tenders summary.payment.tenders do |tender|
6
+ json.partial! "workarea/api/storefront/orders/tenders/#{tender.slug}", tender: tender
7
+ json.problems tender.errors.full_messages
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ json.shipping do
2
+ json.complete summary.shipping_service.present? && step.complete?
3
+ json.problems summary.shipping.errors.full_messages
4
+
5
+ json.shipping_service summary.shipping_service
6
+ json.shipping_total cart.shipping_total
7
+
8
+ json.partial! 'workarea/api/storefront/checkouts/shipping_options', cart: cart
9
+ end
@@ -0,0 +1,7 @@
1
+ json.id block.id
2
+ json.type block.type_id
3
+ json.area block.area
4
+ json.data block_data_with_urls(block)
5
+ json.hidden_breakpoints block.hidden_breakpoints
6
+ json.position block.position
7
+ json.html render_block_to_string(block)
@@ -0,0 +1,2 @@
1
+ json.id @signup.id
2
+ json.email @signup.email
@@ -0,0 +1,4 @@
1
+ json.title @email_signup.title
2
+ json.content_blocks @email_signup.content.blocks do |block|
3
+ json.partial! 'workarea/api/storefront/content_blocks/block', block: block
4
+ end
@@ -0,0 +1,8 @@
1
+ json.type facet.type
2
+ json.name facet.name
3
+ json.display_name facet.display_name
4
+
5
+ json.results facet.results do |range, count|
6
+ json.range range
7
+ json.count count
8
+ end
@@ -0,0 +1,8 @@
1
+ json.type facet.type
2
+ json.name facet.name
3
+ json.display_name facet.display_name
4
+
5
+ json.results facet.results do |name, count|
6
+ json.name name
7
+ json.count count
8
+ end
@@ -0,0 +1,18 @@
1
+ json.status order.try(:fulfillment_status)
2
+
3
+ json.packages order.packages do |package|
4
+ json.tracking_number package.tracking_number
5
+ json.tracking_link package.tracking_link
6
+
7
+ json.items package.items do |item|
8
+ json.partial! 'workarea/api/storefront/orders/item', item: item
9
+ end
10
+ end
11
+
12
+ json.pending_items order.pending_items do |item|
13
+ json.partial! 'workarea/api/storefront/orders/item', item: item
14
+ end
15
+
16
+ json.canceled_items order.canceled_items do |item|
17
+ json.partial! 'workarea/api/storefront/orders/item', item: item
18
+ end
@@ -0,0 +1,11 @@
1
+ json.cache! menu.cache_key, expires_in: 1.hour do
2
+ json.id menu.id
3
+ json.name menu.name
4
+ json.position menu.position
5
+ json.url menu_path(menu)
6
+ json.taxon_url menu.taxon.url.presence || storefront_api_url_for(menu.taxon)
7
+
8
+ json.content_blocks menu.content.blocks do |block|
9
+ json.partial! 'workarea/api/storefront/content_blocks/block', block: block
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ json.menus @menus do |menu|
2
+ json.partial! 'workarea/api/storefront/menus/menu', menu: menu
3
+ end
@@ -0,0 +1 @@
1
+ json.partial! 'workarea/api/storefront/menus/menu', menu: @menu
@@ -0,0 +1,26 @@
1
+ json.id item.id
2
+ json.product_id item.product_id
3
+ json.sku item.sku
4
+ json.quantity item.quantity
5
+ json.product_url product_url(item.product, sku: item.sku)
6
+ json.options item.details
7
+ json.customizations item.customizations
8
+
9
+ json.product_image do
10
+ json.partial! 'workarea/api/storefront/products/image_urls', image: item.image
11
+ end
12
+
13
+ json.pricing do
14
+ json.price_adjustments item.price_adjustments do |adjustment|
15
+ json.description adjustment.description
16
+ json.discount adjustment.discount?
17
+ json.amount adjustment.amount
18
+ end
19
+
20
+ json.total_price item.total_price
21
+ json.on_sale item.on_sale?
22
+ json.original_unit_price item.original_unit_price
23
+ json.original_price item.original_price
24
+ json.customized item.customized?
25
+ json.customizations_unit_price item.customizations_unit_price
26
+ end
@@ -0,0 +1,42 @@
1
+ json.id order.id
2
+ json.url order_url(order)
3
+ json.user_id order.user_id
4
+ json.email order.email
5
+ json.placed_at order.placed_at
6
+ json.canceled_at order.canceled_at
7
+ json.promo_codes order.promo_codes
8
+ json.requires_shipping order.requires_shipping?
9
+
10
+ json.items order.items do |item|
11
+ json.partial! 'workarea/api/storefront/orders/item', item: item
12
+ end
13
+
14
+ json.pricing do
15
+ json.price_adjustments order.total_adjustments do |adjustment|
16
+ json.description adjustment.description.titleize
17
+ json.amount adjustment.amount
18
+ end
19
+
20
+ json.shipping_total order.shipping_total
21
+ json.tax_total order.tax_total
22
+ json.subtotal_price order.subtotal_price
23
+ json.total_price order.total_price
24
+ json.paid_amount order.try(:paid_amount) || 0
25
+ end
26
+
27
+ json.shipping_service order.shipping_service
28
+ json.shipping_address do
29
+ if order.shipping_address.present?
30
+ json.partial! 'workarea/api/storefront/shared/address', address: order.shipping_address
31
+ end
32
+ end
33
+
34
+ json.billing_address do
35
+ if order.billing_address.present?
36
+ json.partial! 'workarea/api/storefront/shared/address', address: order.billing_address
37
+ end
38
+ end
39
+
40
+ json.tenders order.tenders do |tender|
41
+ json.partial! "workarea/api/storefront/orders/tenders/#{tender.slug}", tender: tender
42
+ end
@@ -0,0 +1,4 @@
1
+ json.user_id current_user.id
2
+ json.orders @orders do |order|
3
+ json.partial! 'workarea/api/storefront/orders/order', order: order
4
+ end
@@ -0,0 +1,7 @@
1
+ json.order do
2
+ json.partial! 'workarea/api/storefront/orders/order', order: @order
3
+ end
4
+
5
+ json.fulfillment do
6
+ json.partial! 'workarea/api/storefront/fulfillments/fulfillment', order: @order
7
+ end
@@ -0,0 +1,6 @@
1
+ json.type 'credit_card'
2
+ json.amount tender.amount
3
+ json.issuer tender.issuer
4
+ json.display_number tender.display_number
5
+ json.month tender.month
6
+ json.year tender.year
@@ -0,0 +1,2 @@
1
+ json.type 'store_credit'
2
+ json.amount tender.amount
@@ -0,0 +1,16 @@
1
+ json.cache! @page.cache_key, expires_in: 1.hour do
2
+ json.id @page.id
3
+ json.name @page.name
4
+ json.url page_url(@page)
5
+
6
+ json.browser_title @page.browser_title
7
+ json.meta_description @page.meta_description
8
+
9
+ json.breadcrumbs @page.breadcrumbs do |taxon|
10
+ json.partial! 'workarea/api/storefront/taxons/taxon', taxon: taxon
11
+ end
12
+
13
+ json.content_blocks @page.content.blocks do |block|
14
+ json.partial! 'workarea/api/storefront/content_blocks/block', block: block
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ processors = Dragonfly.app(:workarea).processors.items
2
+ json.urls processors.except(*Workarea.config.api_product_image_jobs_blacklist) do |name, _value|
3
+ json.type name
4
+ json.url product_image_url(image, name)
5
+ end
@@ -0,0 +1,41 @@
1
+ json.cache! product.cache_key, expires_in: 1.hour do
2
+ json.id product.id
3
+
4
+ json.name product.name
5
+ json.description product.description
6
+ json.slug product.slug
7
+
8
+ json.browser_title product.browser_title
9
+ json.meta_description product.meta_description
10
+
11
+ json.template product.template
12
+ json.customizations product.customizations
13
+ json.details product.details
14
+ json.digital product.digital?
15
+ json.filters product.filters
16
+ json.purchasable product.purchasable?
17
+ json.inventory_status product.inventory_status
18
+
19
+ json.variants product.variants do |variant|
20
+ json.id variant.id
21
+ json.name variant.name
22
+ json.sku variant.sku
23
+ json.details variant.details
24
+ end
25
+
26
+ json.sell_min_price json.sell_min_price
27
+ json.sell_max_price product.sell_max_price
28
+ json.on_sale product.on_sale?
29
+ json.original_min_price product.original_min_price
30
+ json.original_max_price product.original_max_price
31
+
32
+ json.images product.images do |image|
33
+ json.id image.id
34
+ json.option image.option
35
+ json.position image.position
36
+ json.primary image == product.primary_image
37
+ json.partial! 'workarea/api/storefront/products/image_urls', image: image
38
+ end
39
+
40
+ json.append_partials('api.storefront.product_details', product: product)
41
+ end
@@ -0,0 +1,9 @@
1
+ json.cache! @product.cache_key, expires_in: 1.hour do
2
+ json.product do
3
+ json.partial! 'workarea/api/storefront/products/product', product: @product
4
+ end
5
+
6
+ json.recommendations @product.recommendations do |product|
7
+ json.partial! 'workarea/api/storefront/products/product', product: product
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ json.id @recent_views.id
2
+ json.categories @recent_views.categories do |category|
3
+ json.partial! 'workarea/api/storefront/categories/category', category: category
4
+ end
5
+ json.products @recent_views.products do |product|
6
+ json.partial! 'workarea/api/storefront/products/product', product: product
7
+ end
8
+ json.searches @recent_views.searches
@@ -0,0 +1,3 @@
1
+ json.products @recommendations.products do |product|
2
+ json.partial! 'workarea/api/storefront/products/product', product: product
3
+ end
@@ -0,0 +1,2 @@
1
+ json.url saved_address_url(address)
2
+ json.partial! 'workarea/api/storefront/shared/address', address: address
@@ -0,0 +1,4 @@
1
+ json.user_id current_user.id
2
+ json.addresses @addresses do |address|
3
+ json.partial! 'workarea/api/storefront/saved_addresses/saved_address', address: address
4
+ end
@@ -0,0 +1,2 @@
1
+ json.user_id current_user.id
2
+ json.partial! 'workarea/api/storefront/saved_addresses/saved_address', address: @address
@@ -0,0 +1,9 @@
1
+ json.id card.id
2
+ json.url saved_credit_card_url(card)
3
+ json.default card.default?
4
+ json.issuer card.issuer
5
+ json.display_number card.display_number
6
+ json.month card.month
7
+ json.year card.year
8
+ json.first_name card.first_name
9
+ json.last_name card.last_name
@@ -0,0 +1,4 @@
1
+ json.user_id current_user.id
2
+ json.credit_cards @credit_cards do |credit_card|
3
+ json.partial! 'workarea/api/storefront/saved_credit_cards/card', card: credit_card
4
+ end
@@ -0,0 +1,2 @@
1
+ json.user_id current_user.id
2
+ json.partial! 'workarea/api/storefront/saved_credit_cards/card', card: @credit_card
@@ -0,0 +1 @@
1
+ json.results @results
@@ -0,0 +1,19 @@
1
+ json.query_string @search.query_string
2
+ json.message @search.message
3
+ json.redirect @search.redirect
4
+ json.sorts @search.sorts
5
+ json.sort @search.sort
6
+
7
+ json.content_blocks @search.content.blocks do |block|
8
+ json.partial! 'workarea/api/storefront/content_blocks/block', block: block
9
+ end
10
+
11
+ json.partial! 'workarea/api/storefront/shared/pagination', model: @search
12
+
13
+ json.facets @search.facets do |facet|
14
+ json.partial! "workarea/api/storefront/facets/#{facet.type}", facet: facet
15
+ end
16
+
17
+ json.products @search.products do |product|
18
+ json.partial! 'workarea/api/storefront/products/product', product: product
19
+ end
@@ -0,0 +1,12 @@
1
+ json.id address.id
2
+ json.first_name address.first_name
3
+ json.last_name address.last_name
4
+ json.company address.company
5
+ json.street address.street
6
+ json.street_2 address.street_2
7
+ json.city address.city
8
+ json.country address.country.try(:alpha2)
9
+ json.region address.region
10
+ json.postal_code address.postal_code
11
+ json.phone_number address.phone_number
12
+ json.phone_extension address.phone_extension
@@ -0,0 +1,11 @@
1
+ json.first_page model.first_page?
2
+ json.second_page model.second_page?
3
+ json.last_page model.last_page?
4
+
5
+ json.page model.page
6
+ json.next_page model.next_page
7
+ json.prev_page model.prev_page
8
+ json.per_page model.per_page
9
+
10
+ json.total_results model.total
11
+ json.total_pages model.total_pages
@@ -0,0 +1,12 @@
1
+ json.cache! @content.cache_key, expires_in: 1.hour do
2
+ json.id @content.id
3
+ json.name @content.name
4
+ json.url system_content_url(@content.name)
5
+
6
+ json.browser_title @content.browser_title
7
+ json.meta_description @content.meta_description
8
+
9
+ json.content_blocks @content.content.blocks do |block|
10
+ json.partial! 'workarea/api/storefront/content_blocks/block', block: block
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ json.cache! taxon.cache_key, expires_in: 1.day do
2
+ json.id taxon.id
3
+ json.url taxon_path(taxon)
4
+ json.name taxon.name
5
+ json.depth taxon.depth
6
+ json.navigable_url taxon.url.presence || storefront_api_url_for(taxon)
7
+ json.parent_id taxon.parent_id
8
+ json.parent_ids taxon.parent_ids
9
+ json.position taxon.position
10
+ end
@@ -0,0 +1,7 @@
1
+ json.taxon do
2
+ json.partial! 'workarea/api/storefront/taxons/taxon', taxon: @taxon
3
+ end
4
+
5
+ json.children @taxon.children.select(&:active?) do |child|
6
+ json.partial! 'workarea/api/storefront/taxons/taxon', taxon: child
7
+ end
@@ -0,0 +1,19 @@
1
+ module Workarea
2
+ class RemoveAuthenticationTokensOnPasswordChanges
3
+ include Sidekiq::Worker
4
+ include Sidekiq::CallbacksWorker
5
+
6
+ sidekiq_options(
7
+ enqueue_on: {
8
+ User => [:save],
9
+ ignore_if: -> { new_record? || changes['password_digest'].blank? },
10
+ with: -> { [id] }
11
+ },
12
+ unique: :until_executing
13
+ )
14
+
15
+ def perform(id)
16
+ User.find(id).authentication_tokens.destroy_all
17
+ end
18
+ end
19
+ end
data/bin/rails ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails gems
3
+ # installed from the root of your application.
4
+
5
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
6
+ ENGINE_PATH = File.expand_path('../../lib/workarea/api/storefront/engine', __FILE__)
7
+
8
+ # Set up gems listed in the Gemfile.
9
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../Gemfile', __FILE__)
10
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
11
+
12
+ require 'action_controller/railtie'
13
+ require 'action_view/railtie'
14
+ require 'action_mailer/railtie'
15
+ require 'rails/test_unit/railtie'
16
+ require 'sprockets/railtie'
17
+
18
+ require 'rails/engine/commands'
@@ -0,0 +1,2 @@
1
+ Workarea.config.api_product_image_jobs_blacklist ||= %i[convert encode rotate optim avatar thumb]
2
+ Workarea.config.authentication_token_expiration ||= 1.week
@@ -0,0 +1,13 @@
1
+ en:
2
+ workarea:
3
+ api:
4
+ storefront:
5
+ authentication_tokens:
6
+ error: Could not find a matching email and password
7
+ login_locked: This account has been locked for too many login attempts
8
+ recent_views:
9
+ missing_id: Recent views endpoints require either authentication or passing in a session_id in the parameters.
10
+ passwords:
11
+ error: Could not find a matching email and password
12
+ recommendations:
13
+ missing_id: Recommendation endpoints require either authentication or passing in a session_id in the parameters.
data/config/routes.rb ADDED
@@ -0,0 +1,41 @@
1
+ Workarea::Api::Storefront::Engine.routes.draw do
2
+ resource :account, except: [:new, :edit, :destroy]
3
+
4
+ post 'analytics/category_view/:category_id', to: 'analytics#category_view', as: :analytics_category_view
5
+ post 'analytics/product_view/:product_id', to: 'analytics#product_view', as: :analytics_product_view
6
+ post 'analytics/search', to: 'analytics#search', as: :analytics_search
7
+ post 'analytics/search_abandonment', to: 'analytics#search_abandonment', as: :analytics_search_abandonment
8
+ post 'analytics/filters', to: 'analytics#filters', as: :analytics_filters
9
+
10
+ resource :authentication_tokens, only: [:create, :update]
11
+ resources :assets, only: :show
12
+ resources :categories, only: [:index, :show]
13
+ resources :contacts, only: :create
14
+ resources :orders, only: [:index, :show]
15
+ resources :pages, only: :show
16
+ resource :recent_views, only: [:show, :update]
17
+ resources :saved_addresses, except: [:new, :edit]
18
+ resources :saved_credit_cards, except: [:new, :edit]
19
+ resource :search, only: :show
20
+ resources :searches, only: :index
21
+ resources :system_content, only: :show
22
+ resources :menus, only: [:index, :show]
23
+ resource :email_signups, only: [:show, :create]
24
+ resources :password_resets, only: :create
25
+ resources :products, only: :show
26
+ resource :recommendations, only: :show
27
+ resources :taxons, only: :show
28
+
29
+ resources :carts, only: [:index, :show, :create] do
30
+ resources :items, only: [:create, :update, :destroy], controller: :cart_items
31
+ member { post 'add_promo_code', as: :add_promo_code_to }
32
+ end
33
+
34
+ resources :checkouts, only: [:show, :update] do
35
+ member do
36
+ get 'start'
37
+ get 'reset'
38
+ post 'complete'
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,10 @@
1
+ module Workarea
2
+ module Api
3
+ module Storefront
4
+ class Engine < ::Rails::Engine
5
+ include Workarea::Plugin
6
+ isolate_namespace Workarea::Api::Storefront
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ require 'responders'
2
+ require 'raddocs'
3
+
4
+ require 'workarea'
5
+ require 'workarea/storefront'
6
+
7
+ module Workarea
8
+ module Api
9
+ module Storefront
10
+ end
11
+ end
12
+ end
13
+
14
+ require 'workarea/api/version'
15
+ require 'workarea/api/storefront/engine'
@@ -0,0 +1,70 @@
1
+ require 'test_helper'
2
+ require 'workarea/api/documentation_test'
3
+
4
+ module Workarea
5
+ module Api
6
+ module Storefront
7
+ class AccountsDocumentationTest < DocumentationTest
8
+ include AuthenticationTest
9
+
10
+ resource 'Accounts'
11
+
12
+ def test_showing_an_account
13
+ description 'Getting account details'
14
+ route storefront_api.account_path
15
+
16
+ user = create_user
17
+ auth = user.authentication_tokens.create!
18
+
19
+ record_request do
20
+ get storefront_api.account_path,
21
+ headers: { 'HTTP_AUTHORIZATION' => encode_credentials(auth.token) }
22
+
23
+ assert_equal(200, response.status)
24
+ end
25
+ end
26
+
27
+ def test_creating_an_account
28
+ description 'Creating an account'
29
+ route storefront_api.account_path
30
+ explanation <<-EOS
31
+ This endpoint does three things: it creates an account, it creates
32
+ an authentication token, and it sends an account creation email to
33
+ the customer.
34
+ EOS
35
+
36
+ record_request do
37
+ post storefront_api.account_path,
38
+ as: :json,
39
+ params: {
40
+ email: 'bob@workarea.com',
41
+ password: 'areallysecurepassword'
42
+ }
43
+
44
+ assert_equal(200, response.status)
45
+ end
46
+ end
47
+
48
+ def test_updating_an_account
49
+ description 'Updating an account'
50
+ route storefront_api.account_path
51
+
52
+ user = create_user
53
+ auth = user.authentication_tokens.create!
54
+
55
+ record_request do
56
+ get storefront_api.account_path,
57
+ headers: { 'HTTP_AUTHORIZATION' => encode_credentials(auth.token) },
58
+ as: :json,
59
+ params: {
60
+ email: 'billy@workarea.com',
61
+ password: 'adifferentbutstillreallysecurepassword'
62
+ }
63
+
64
+ assert_equal(200, response.status)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end