@fleetbase/storefront-engine 0.1.6 → 0.1.8

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 (333) hide show
  1. package/.php-cs-fixer.php +29 -0
  2. package/LICENSE.md +16 -4
  3. package/README.md +106 -13
  4. package/addon/components/modals/add-store-to-category.hbs +5 -0
  5. package/addon/components/modals/create-network-category.hbs +28 -28
  6. package/addon/components/modals/share-network.hbs +3 -3
  7. package/addon/components/modals/store-details.hbs +22 -0
  8. package/addon/components/modals/store-form.hbs +22 -0
  9. package/addon/components/modals/store-form.js +21 -0
  10. package/addon/components/network-category-picker.hbs +40 -0
  11. package/addon/components/network-category-picker.js +83 -0
  12. package/addon/components/store-selector.hbs +4 -2
  13. package/addon/components/widget/orders.js +22 -17
  14. package/addon/controllers/networks/index/network/index.js +133 -9
  15. package/addon/controllers/networks/index/network/stores.js +422 -153
  16. package/addon/controllers/networks/index.js +66 -4
  17. package/addon/controllers/products/index/category.js +1 -1
  18. package/addon/controllers/settings/index.js +14 -7
  19. package/addon/controllers/settings/notifications.js +1 -1
  20. package/addon/models/store.js +44 -7
  21. package/addon/routes/networks/index/network/customers.js +4 -1
  22. package/addon/routes/networks/index/network/orders.js +4 -1
  23. package/addon/routes/networks/index/network/stores.js +19 -15
  24. package/addon/serializers/store.js +1 -0
  25. package/addon/templates/customers/index.hbs +0 -11
  26. package/addon/templates/networks/index/network/index.hbs +1 -1
  27. package/addon/templates/networks/index/network/stores.hbs +8 -163
  28. package/addon/templates/networks/index/network.hbs +2 -3
  29. package/addon/utils/create-shareable-link.js +21 -0
  30. package/app/adapters/addon-category.js +1 -1
  31. package/app/adapters/gateway.js +1 -1
  32. package/app/adapters/network.js +1 -1
  33. package/app/adapters/notification-channel.js +1 -1
  34. package/app/adapters/product-addon-category.js +1 -1
  35. package/app/adapters/product-addon.js +1 -1
  36. package/app/adapters/product-hour.js +1 -1
  37. package/app/adapters/product-store-location.js +1 -1
  38. package/app/adapters/product-variant-option.js +1 -1
  39. package/app/adapters/product-variant.js +1 -1
  40. package/app/adapters/product.js +1 -1
  41. package/app/adapters/store-hour.js +1 -1
  42. package/app/adapters/store-location.js +1 -1
  43. package/app/adapters/store.js +1 -1
  44. package/app/adapters/storefront.js +1 -1
  45. package/app/components/file-record.js +1 -1
  46. package/app/components/modals/add-store-hours.js +1 -1
  47. package/app/components/modals/add-store-to-category.js +1 -0
  48. package/app/components/modals/add-stores-to-network.js +1 -1
  49. package/app/components/modals/assign-driver.js +1 -1
  50. package/app/components/modals/create-first-store.js +1 -1
  51. package/app/components/modals/create-gateway.js +1 -1
  52. package/app/components/modals/create-network-category.js +1 -1
  53. package/app/components/modals/create-network.js +1 -1
  54. package/app/components/modals/create-new-variant.js +1 -1
  55. package/app/components/modals/create-notification-channel.js +1 -1
  56. package/app/components/modals/create-product-category.js +1 -1
  57. package/app/components/modals/create-store.js +1 -1
  58. package/app/components/modals/edit-network.js +1 -1
  59. package/app/components/modals/import-products.js +1 -1
  60. package/app/components/modals/incoming-order.js +1 -1
  61. package/app/components/modals/manage-addons.js +1 -1
  62. package/app/components/modals/order-ready-assign-driver.js +1 -1
  63. package/app/components/modals/select-addon-category.js +1 -1
  64. package/app/components/modals/share-network.js +1 -1
  65. package/app/components/modals/store-details.js +1 -0
  66. package/app/components/modals/store-form.js +1 -0
  67. package/app/components/modals/store-location-form.js +1 -1
  68. package/app/components/network-category-picker.js +1 -0
  69. package/app/components/order-card.js +1 -1
  70. package/app/components/schedule-manager.js +1 -1
  71. package/app/components/settings-container.js +1 -1
  72. package/app/components/store-selector.js +1 -1
  73. package/app/components/widget/customers.js +1 -1
  74. package/app/components/widget/orders.js +1 -1
  75. package/app/components/widget/storefront-metrics.js +1 -1
  76. package/app/controllers/application.js +1 -1
  77. package/app/controllers/customers/index.js +1 -1
  78. package/app/controllers/home.js +1 -1
  79. package/app/controllers/networks/index/network/customers.js +1 -1
  80. package/app/controllers/networks/index/network/index.js +1 -1
  81. package/app/controllers/networks/index/network/orders.js +1 -1
  82. package/app/controllers/networks/index/network/stores.js +1 -1
  83. package/app/controllers/networks/index/network.js +1 -1
  84. package/app/controllers/networks/index.js +1 -1
  85. package/app/controllers/orders/index.js +1 -1
  86. package/app/controllers/products/index/category/edit.js +1 -1
  87. package/app/controllers/products/index/category/new.js +1 -1
  88. package/app/controllers/products/index/category.js +1 -1
  89. package/app/controllers/products/index/index/edit.js +1 -1
  90. package/app/controllers/products/index/index.js +1 -1
  91. package/app/controllers/products/index.js +1 -1
  92. package/app/controllers/settings/api.js +1 -1
  93. package/app/controllers/settings/gateways.js +1 -1
  94. package/app/controllers/settings/index.js +1 -1
  95. package/app/controllers/settings/locations.js +1 -1
  96. package/app/controllers/settings/notifications.js +1 -1
  97. package/app/helpers/get-tip-amount.js +1 -1
  98. package/app/models/addon-category.js +1 -1
  99. package/app/models/gateway.js +1 -1
  100. package/app/models/network.js +1 -1
  101. package/app/models/notification-channel.js +1 -1
  102. package/app/models/product-addon-category.js +1 -1
  103. package/app/models/product-addon.js +1 -1
  104. package/app/models/product-hour.js +1 -1
  105. package/app/models/product-store-location.js +1 -1
  106. package/app/models/product-variant-option.js +1 -1
  107. package/app/models/product-variant.js +1 -1
  108. package/app/models/product.js +1 -1
  109. package/app/models/store-hour.js +1 -1
  110. package/app/models/store-location.js +1 -1
  111. package/app/models/store.js +1 -1
  112. package/app/routes/application.js +1 -1
  113. package/app/routes/customers/index/edit.js +1 -1
  114. package/app/routes/customers/index.js +1 -1
  115. package/app/routes/home.js +1 -1
  116. package/app/routes/networks/index/network/customers.js +1 -1
  117. package/app/routes/networks/index/network/index.js +1 -1
  118. package/app/routes/networks/index/network/orders.js +1 -1
  119. package/app/routes/networks/index/network/stores.js +1 -1
  120. package/app/routes/networks/index/network.js +1 -1
  121. package/app/routes/networks/index.js +1 -1
  122. package/app/routes/orders/index/edit.js +1 -1
  123. package/app/routes/orders/index/new.js +1 -1
  124. package/app/routes/orders/index/view.js +1 -1
  125. package/app/routes/orders/index.js +1 -1
  126. package/app/routes/products/index/category/edit.js +1 -1
  127. package/app/routes/products/index/category/new.js +1 -1
  128. package/app/routes/products/index/category.js +1 -1
  129. package/app/routes/products/index/index/edit.js +1 -1
  130. package/app/routes/products/index/index.js +1 -1
  131. package/app/routes/products/index.js +1 -1
  132. package/app/routes/settings/api.js +1 -1
  133. package/app/routes/settings/gateways.js +1 -1
  134. package/app/routes/settings/index.js +1 -1
  135. package/app/routes/settings/locations.js +1 -1
  136. package/app/routes/settings/notifications.js +1 -1
  137. package/app/serializers/addon-category.js +1 -1
  138. package/app/serializers/network.js +1 -1
  139. package/app/serializers/notification-channel.js +1 -1
  140. package/app/serializers/product-addon-category.js +1 -1
  141. package/app/serializers/product-variant.js +1 -1
  142. package/app/serializers/product.js +1 -1
  143. package/app/serializers/store-location.js +1 -1
  144. package/app/serializers/store.js +1 -1
  145. package/app/services/storefront.js +1 -1
  146. package/app/templates/customers/index/edit.js +1 -1
  147. package/app/templates/customers/index.js +1 -1
  148. package/app/templates/home.js +1 -1
  149. package/app/templates/networks/index/network/customers.js +1 -1
  150. package/app/templates/networks/index/network/index.js +1 -1
  151. package/app/templates/networks/index/network/orders.js +1 -1
  152. package/app/templates/networks/index/network/stores.js +1 -1
  153. package/app/templates/networks/index/network.js +1 -1
  154. package/app/templates/networks/index.js +1 -1
  155. package/app/templates/orders/index/edit.js +1 -1
  156. package/app/templates/orders/index/new.js +1 -1
  157. package/app/templates/orders/index/view.js +1 -1
  158. package/app/templates/orders/index.js +1 -1
  159. package/app/templates/products/index/category/edit.js +1 -1
  160. package/app/templates/products/index/category/new.js +1 -1
  161. package/app/templates/products/index/category.js +1 -1
  162. package/app/templates/products/index/index/edit.js +1 -1
  163. package/app/templates/products/index/index.js +1 -1
  164. package/app/templates/products/index.js +1 -1
  165. package/app/templates/settings/api.js +1 -1
  166. package/app/templates/settings/gateways.js +1 -1
  167. package/app/templates/settings/index.js +1 -1
  168. package/app/templates/settings/locations.js +1 -1
  169. package/app/templates/settings/notifications.js +1 -1
  170. package/app/templates/settings.js +1 -1
  171. package/app/utils/create-shareable-link.js +1 -0
  172. package/app/utils/get-gateway-schemas.js +1 -1
  173. package/app/utils/get-notification-schemas.js +1 -1
  174. package/composer.json +88 -0
  175. package/extension.json +10 -0
  176. package/package.json +6 -7
  177. package/phpstan.neon.dist +8 -0
  178. package/phpunit.xml.dist +16 -0
  179. package/server/.gitattributes +14 -0
  180. package/server/README.md +40 -0
  181. package/server/config/api.php +101 -0
  182. package/server/config/database.connections.php +57 -0
  183. package/server/config/storefront.php +19 -0
  184. package/server/config/twilio-notification-channel.php +36 -0
  185. package/server/migrations/2023_05_03_025307_create_carts_table.php +44 -0
  186. package/server/migrations/2023_05_03_025307_create_checkouts_table.php +51 -0
  187. package/server/migrations/2023_05_03_025307_create_gateways_table.php +48 -0
  188. package/server/migrations/2023_05_03_025307_create_network_stores_table.php +36 -0
  189. package/server/migrations/2023_05_03_025307_create_networks_table.php +56 -0
  190. package/server/migrations/2023_05_03_025307_create_notification_channels_table.php +43 -0
  191. package/server/migrations/2023_05_03_025307_create_payment_methods_table.php +44 -0
  192. package/server/migrations/2023_05_03_025307_create_product_addon_categories_table.php +38 -0
  193. package/server/migrations/2023_05_03_025307_create_product_addons_table.php +43 -0
  194. package/server/migrations/2023_05_03_025307_create_product_hours_table.php +37 -0
  195. package/server/migrations/2023_05_03_025307_create_product_store_locations_table.php +34 -0
  196. package/server/migrations/2023_05_03_025307_create_product_variant_options_table.php +40 -0
  197. package/server/migrations/2023_05_03_025307_create_product_variants_table.php +44 -0
  198. package/server/migrations/2023_05_03_025307_create_products_table.php +59 -0
  199. package/server/migrations/2023_05_03_025307_create_reviews_table.php +41 -0
  200. package/server/migrations/2023_05_03_025307_create_store_hours_table.php +37 -0
  201. package/server/migrations/2023_05_03_025307_create_store_locations_table.php +38 -0
  202. package/server/migrations/2023_05_03_025307_create_stores_table.php +57 -0
  203. package/server/migrations/2023_05_03_025307_create_votes_table.php +39 -0
  204. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_carts_table.php +40 -0
  205. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_checkouts_table.php +48 -0
  206. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_gateways_table.php +40 -0
  207. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_network_stores_table.php +40 -0
  208. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_networks_table.php +42 -0
  209. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_notification_channels_table.php +40 -0
  210. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_payment_methods_table.php +40 -0
  211. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_addon_categories_table.php +38 -0
  212. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_addons_table.php +38 -0
  213. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_hours_table.php +32 -0
  214. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_store_locations_table.php +34 -0
  215. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_variant_options_table.php +32 -0
  216. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_variants_table.php +32 -0
  217. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_products_table.php +44 -0
  218. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_reviews_table.php +38 -0
  219. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_store_hours_table.php +32 -0
  220. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_store_locations_table.php +40 -0
  221. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_stores_table.php +42 -0
  222. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_votes_table.php +38 -0
  223. package/server/src/Auth/Schemas/Storefront.php +95 -0
  224. package/server/src/Console/Commands/NotifyStorefrontOrderNearby.php +86 -0
  225. package/server/src/Expansions/EntityExpansion.php +44 -0
  226. package/server/src/Http/Controllers/ActionController.php +119 -0
  227. package/server/src/Http/Controllers/AddonCategoryController.php +13 -0
  228. package/server/src/Http/Controllers/CustomerController.php +13 -0
  229. package/server/src/Http/Controllers/GatewayController.php +13 -0
  230. package/server/src/Http/Controllers/MetricsController.php +71 -0
  231. package/server/src/Http/Controllers/NetworkController.php +170 -0
  232. package/server/src/Http/Controllers/NotificationChannelController.php +13 -0
  233. package/server/src/Http/Controllers/OrderController.php +154 -0
  234. package/server/src/Http/Controllers/ProductAddonCategoryController.php +14 -0
  235. package/server/src/Http/Controllers/ProductAddonController.php +14 -0
  236. package/server/src/Http/Controllers/ProductController.php +123 -0
  237. package/server/src/Http/Controllers/ProductHourController.php +13 -0
  238. package/server/src/Http/Controllers/ProductVariantController.php +13 -0
  239. package/server/src/Http/Controllers/ProductVariantOptionController.php +13 -0
  240. package/server/src/Http/Controllers/ReviewController.php +13 -0
  241. package/server/src/Http/Controllers/StoreController.php +26 -0
  242. package/server/src/Http/Controllers/StoreHourController.php +13 -0
  243. package/server/src/Http/Controllers/StoreLocationController.php +13 -0
  244. package/server/src/Http/Controllers/StorefrontController.php +15 -0
  245. package/server/src/Http/Controllers/VoteController.php +13 -0
  246. package/server/src/Http/Controllers/v1/CartController.php +161 -0
  247. package/server/src/Http/Controllers/v1/CategoryController.php +138 -0
  248. package/server/src/Http/Controllers/v1/CheckoutController.php +957 -0
  249. package/server/src/Http/Controllers/v1/CustomerController.php +482 -0
  250. package/server/src/Http/Controllers/v1/GatewayControllerController.php +11 -0
  251. package/server/src/Http/Controllers/v1/NetworkController.php +281 -0
  252. package/server/src/Http/Controllers/v1/PaymentMethodController.php +11 -0
  253. package/server/src/Http/Controllers/v1/ProductController.php +94 -0
  254. package/server/src/Http/Controllers/v1/ReviewController.php +270 -0
  255. package/server/src/Http/Controllers/v1/ServiceQuoteController.php +402 -0
  256. package/server/src/Http/Controllers/v1/StoreController.php +176 -0
  257. package/server/src/Http/Filter/AddonCategoryFilter.php +19 -0
  258. package/server/src/Http/Filter/CustomerFilter.php +18 -0
  259. package/server/src/Http/Filter/GatewayFilter.php +13 -0
  260. package/server/src/Http/Filter/NetworkFilter.php +18 -0
  261. package/server/src/Http/Filter/NotificationChannelFilter.php +13 -0
  262. package/server/src/Http/Filter/OrderFilter.php +46 -0
  263. package/server/src/Http/Filter/ProductFilter.php +28 -0
  264. package/server/src/Http/Filter/StoreFilter.php +42 -0
  265. package/server/src/Http/Filter/StoreLocationFilter.php +23 -0
  266. package/server/src/Http/Middleware/SetStorefrontSession.php +130 -0
  267. package/server/src/Http/Requests/AddStoreToNetworkCategory.php +45 -0
  268. package/server/src/Http/Requests/CaptureOrderRequest.php +30 -0
  269. package/server/src/Http/Requests/CreateCustomerRequest.php +44 -0
  270. package/server/src/Http/Requests/CreateReviewRequest.php +34 -0
  271. package/server/src/Http/Requests/GetServiceQuoteFromCart.php +40 -0
  272. package/server/src/Http/Requests/InitializeCheckoutRequest.php +38 -0
  273. package/server/src/Http/Requests/NetworkActionRequest.php +43 -0
  274. package/server/src/Http/Requests/VerifyCreateCustomerRequest.php +31 -0
  275. package/server/src/Http/Resources/Cart.php +31 -0
  276. package/server/src/Http/Resources/Category.php +48 -0
  277. package/server/src/Http/Resources/Customer.php +36 -0
  278. package/server/src/Http/Resources/Gateway.php +32 -0
  279. package/server/src/Http/Resources/Media.php +29 -0
  280. package/server/src/Http/Resources/Network.php +48 -0
  281. package/server/src/Http/Resources/Product.php +209 -0
  282. package/server/src/Http/Resources/Review.php +45 -0
  283. package/server/src/Http/Resources/ReviewCustomer.php +60 -0
  284. package/server/src/Http/Resources/Store.php +76 -0
  285. package/server/src/Http/Resources/StoreHour.php +29 -0
  286. package/server/src/Http/Resources/StoreLocation.php +33 -0
  287. package/server/src/Imports/ProductsImport.php +20 -0
  288. package/server/src/Jobs/DownloadProductImageUrl.php +60 -0
  289. package/server/src/Listeners/HandleOrderCompleted.php +31 -0
  290. package/server/src/Listeners/HandleOrderDispatched.php +34 -0
  291. package/server/src/Listeners/HandleOrderDriverAssigned.php +37 -0
  292. package/server/src/Listeners/HandleOrderStarted.php +27 -0
  293. package/server/src/Mail/StorefrontNetworkInvite.php +48 -0
  294. package/server/src/Models/AddonCategory.php +30 -0
  295. package/server/src/Models/Cart.php +691 -0
  296. package/server/src/Models/Checkout.php +166 -0
  297. package/server/src/Models/Customer.php +88 -0
  298. package/server/src/Models/Gateway.php +165 -0
  299. package/server/src/Models/Network.php +300 -0
  300. package/server/src/Models/NetworkStore.php +86 -0
  301. package/server/src/Models/NotificationChannel.php +147 -0
  302. package/server/src/Models/PaymentMethod.php +99 -0
  303. package/server/src/Models/Product.php +315 -0
  304. package/server/src/Models/ProductAddon.php +128 -0
  305. package/server/src/Models/ProductAddonCategory.php +90 -0
  306. package/server/src/Models/ProductHour.php +59 -0
  307. package/server/src/Models/ProductStoreLocation.php +77 -0
  308. package/server/src/Models/ProductVariant.php +125 -0
  309. package/server/src/Models/ProductVariantOption.php +86 -0
  310. package/server/src/Models/Review.php +127 -0
  311. package/server/src/Models/Store.php +478 -0
  312. package/server/src/Models/StoreHour.php +59 -0
  313. package/server/src/Models/StoreLocation.php +126 -0
  314. package/server/src/Models/StorefrontModel.php +22 -0
  315. package/server/src/Models/Vote.php +84 -0
  316. package/server/src/Notifications/StorefrontOrderCanceled.php +196 -0
  317. package/server/src/Notifications/StorefrontOrderCompleted.php +201 -0
  318. package/server/src/Notifications/StorefrontOrderCreated.php +157 -0
  319. package/server/src/Notifications/StorefrontOrderDriverAssigned.php +200 -0
  320. package/server/src/Notifications/StorefrontOrderEnroute.php +199 -0
  321. package/server/src/Notifications/StorefrontOrderNearby.php +201 -0
  322. package/server/src/Notifications/StorefrontOrderPreparing.php +202 -0
  323. package/server/src/Notifications/StorefrontOrderReadyForPickup.php +202 -0
  324. package/server/src/Observers/NetworkObserver.php +40 -0
  325. package/server/src/Observers/ProductObserver.php +118 -0
  326. package/server/src/Providers/EventServiceProvider.php +23 -0
  327. package/server/src/Providers/StorefrontServiceProvider.php +103 -0
  328. package/server/src/Support/Metrics.php +193 -0
  329. package/server/src/Support/OrderConfig.php +13 -0
  330. package/server/src/Support/QPay.php +208 -0
  331. package/server/src/Support/Storefront.php +201 -0
  332. package/server/src/routes.php +180 -0
  333. package/server/tests/Feature.php +5 -0
@@ -0,0 +1,46 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Filter;
4
+
5
+ use Fleetbase\FleetOps\Http\Filter\OrderFilter as FleetOpsOrderFilter;
6
+
7
+ class OrderFilter extends FleetOpsOrderFilter
8
+ {
9
+ public function queryForInternal()
10
+ {
11
+ $this->builder
12
+ ->where(
13
+ [
14
+ 'company_uuid' => $this->session->get('company'),
15
+ 'type' => 'storefront'
16
+ ]
17
+ )
18
+ ->whereHas(
19
+ 'payload',
20
+ function ($q) {
21
+ $q->where(
22
+ function ($q) {
23
+ $q->whereHas('waypoints');
24
+ $q->orWhereHas('pickup');
25
+ $q->orWhereHas('dropoff');
26
+ }
27
+ );
28
+ $q->with(['entities', 'waypoints', 'dropoff', 'pickup', 'return']);
29
+ }
30
+ )
31
+ ->whereHas('trackingNumber')
32
+ ->whereHas('trackingStatuses')
33
+ ->with(
34
+ [
35
+ 'payload',
36
+ 'trackingNumber',
37
+ 'trackingStatuses'
38
+ ]
39
+ );
40
+ }
41
+
42
+ public function storefront(string $storefront)
43
+ {
44
+ $this->builder->where('meta->storefront_id', $storefront);
45
+ }
46
+ }
@@ -0,0 +1,28 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Filter;
4
+
5
+ use Fleetbase\Http\Filter\Filter;
6
+ use Fleetbase\Models\Category;
7
+
8
+ class ProductFilter extends Filter
9
+ {
10
+ public function queryForInternal()
11
+ {
12
+ $this->builder->where('company_uuid', $this->session->get('company'));
13
+ }
14
+
15
+ public function query(?string $query)
16
+ {
17
+ $this->builder->search($query);
18
+ }
19
+
20
+ public function categorySlug(?string $categorySlug)
21
+ {
22
+ $category = Category::where(['slug' => $categorySlug, 'for' => 'storefront_product'])->first();
23
+
24
+ if ($category) {
25
+ $this->builder->where('category_uuid', $category->uuid);
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,42 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Filter;
4
+
5
+ use Fleetbase\Http\Filter\Filter;
6
+
7
+ class StoreFilter extends Filter
8
+ {
9
+ public function queryForInternal()
10
+ {
11
+ $this->builder->where('company_uuid', $this->session->get('company'));
12
+ }
13
+
14
+ public function storeQuery(?string $searchQuery)
15
+ {
16
+ $this->builder->search($searchQuery);
17
+ }
18
+
19
+ public function network(?string $network)
20
+ {
21
+ $this->builder->whereHas(
22
+ 'networks',
23
+ function ($query) use ($network) {
24
+ $query->where('network_uuid', $network);
25
+
26
+ // Query stores without a category
27
+ if ($this->request->filled('without_category')) {
28
+ $query->whereNull('category_uuid');
29
+ }
30
+
31
+ // Query stores by category
32
+ if ($this->request->filled('category')) {
33
+ if ($this->request->input('category') === '_parent') {
34
+ $query->whereNull('category_uuid');
35
+ } else {
36
+ $query->where('category_uuid', $this->request->input('category'));
37
+ }
38
+ }
39
+ }
40
+ );
41
+ }
42
+ }
@@ -0,0 +1,23 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Filter;
4
+
5
+ use Fleetbase\Http\Filter\Filter;
6
+
7
+ class StoreLocationFilter extends Filter
8
+ {
9
+ public function queryForInternal()
10
+ {
11
+ $this->builder->whereHas(
12
+ 'store',
13
+ function ($query) {
14
+ $query->where('company_uuid', $this->session->get('company'));
15
+ }
16
+ );
17
+ }
18
+
19
+ public function store(string $store)
20
+ {
21
+ $this->builder->where('store_uuid', $store);
22
+ }
23
+ }
@@ -0,0 +1,130 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Middleware;
4
+
5
+ use Fleetbase\Storefront\Models\Network;
6
+ use Fleetbase\Storefront\Models\Store;
7
+ use Fleetbase\FleetOps\Models\Contact;
8
+ use Illuminate\Http\Request;
9
+ use Illuminate\Support\Str;
10
+ use Laravel\Sanctum\PersonalAccessToken;
11
+
12
+ class SetStorefrontSession
13
+ {
14
+ /**
15
+ * Handle an incoming request.
16
+ *
17
+ * @param \Illuminate\Http\Request $request
18
+ * @param \Closure $next
19
+ * @return mixed
20
+ */
21
+ public function handle(Request $request, \Closure $next)
22
+ {
23
+ $key = $request->bearerToken();
24
+
25
+ if (!$key) {
26
+ return response()->error('Oops! No Storefront key found with this request', 401);
27
+ }
28
+
29
+ if ($this->isValidKey($key)) {
30
+ $this->setKey($key);
31
+ $this->setupCustomerSession($request);
32
+
33
+ return $next($request);
34
+ }
35
+
36
+ return response()->error('Oops! The Storefront key provided was not valid', 401);
37
+ }
38
+
39
+ /**
40
+ * Checks if storefront key is valid.
41
+ *
42
+ * @param string $key
43
+ * @return boolean
44
+ */
45
+ public function isValidKey(string $key): bool
46
+ {
47
+ if (!Str::startsWith($key, ['network', 'store'])) {
48
+ return false;
49
+ }
50
+
51
+ if (Str::startsWith($key, 'store')) {
52
+ return Store::select(['key'])->where('key', $key)->exists();
53
+ }
54
+
55
+ return Network::select(['key'])->where('key', $key)->exists();
56
+ }
57
+
58
+ /**
59
+ * Sets the storefront key to session.
60
+ *
61
+ * @param string $key
62
+ * @return void
63
+ */
64
+ public function setKey(string $key): void
65
+ {
66
+ $session = ['storefront_key' => $key];
67
+
68
+ if (Str::startsWith($key, 'store')) {
69
+ $store = Store::select(['uuid', 'company_uuid', 'currency'])->where('key', $key)->first();
70
+
71
+ if ($store) {
72
+ $session['storefront_store'] = $store->uuid;
73
+ $session['storefront_currency'] = $store->currency;
74
+ $session['company'] = $store->company_uuid;
75
+ }
76
+ } else if (Str::startsWith($key, 'network')) {
77
+ $network = Network::select(['uuid', 'company_uuid', 'currency'])->where('key', $key)->first();
78
+
79
+ if ($network) {
80
+ $session['storefront_network'] = $network->uuid;
81
+ $session['storefront_currency'] = $network->currency;
82
+ $session['company'] = $network->company_uuid;
83
+ }
84
+ }
85
+
86
+ $session['api_credential'] = $key;
87
+
88
+ session($session);
89
+ }
90
+
91
+ /**
92
+ * Set the customer id to session if applicable
93
+ *
94
+ * @param Request $request
95
+ * @return void
96
+ */
97
+ public function setupCustomerSession(Request $request)
98
+ {
99
+ $token = $request->header('Customer-Token');
100
+
101
+ if ($token) {
102
+ $accessToken = PersonalAccessToken::findToken($token);
103
+
104
+ if ($accessToken) {
105
+ $tokenable = $this->getTokenableFromAccessToken($accessToken);
106
+
107
+ if (!$tokenable) {
108
+ return;
109
+ }
110
+
111
+ $contact = Contact::select(['uuid', 'public_id'])->where('user_uuid', $tokenable->uuid)->first();
112
+
113
+ session([
114
+ 'customer_id' => Str::replaceFirst('contact', 'customer', $contact->public_id),
115
+ 'contact_id' => $contact->public_id,
116
+ 'customer' => $contact->uuid
117
+ ]);
118
+ }
119
+ }
120
+ }
121
+
122
+ public function getTokenableFromAccessToken(PersonalAccessToken $personalAccessToken)
123
+ {
124
+ if ($personalAccessToken->tokenable) {
125
+ return $personalAccessToken->tokenable;
126
+ }
127
+
128
+ return app($personalAccessToken->tokenable_type)->where('uuid', $personalAccessToken->tokenable_id)->withoutGlobalScopes()->first();
129
+ }
130
+ }
@@ -0,0 +1,45 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Requests;
4
+
5
+ use Fleetbase\Http\Requests\FleetbaseRequest;
6
+
7
+ class AddStoreToNetworkCategory extends FleetbaseRequest
8
+ {
9
+ /**
10
+ * Override the all method to include $id.
11
+ *
12
+ * @return array
13
+ */
14
+ public function all($keys = null)
15
+ {
16
+ $data = parent::all($keys);
17
+ $data['id'] = $this->route('id');
18
+
19
+ return $data;
20
+ }
21
+
22
+ /**
23
+ * Determine if the user is authorized to make this request.
24
+ *
25
+ * @return bool
26
+ */
27
+ public function authorize()
28
+ {
29
+ return (bool) session('user');
30
+ }
31
+
32
+ /**
33
+ * Get the validation rules that apply to the request.
34
+ *
35
+ * @return array
36
+ */
37
+ public function rules()
38
+ {
39
+ return [
40
+ 'id' => ['required', 'exists:storefront.networks,uuid'],
41
+ 'category' => ['required', 'exists:categories,uuid'],
42
+ 'store' => ['required', 'exists:storefront.stores,uuid', 'exists:storefront.network_stores,store_uuid'],
43
+ ];
44
+ }
45
+ }
@@ -0,0 +1,30 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Requests;
4
+
5
+ use Fleetbase\Http\Requests\FleetbaseRequest;
6
+
7
+ class CaptureOrderRequest extends FleetbaseRequest
8
+ {
9
+ /**
10
+ * Determine if the user is authorized to make this request.
11
+ *
12
+ * @return bool
13
+ */
14
+ public function authorize()
15
+ {
16
+ return session('storefront_key');
17
+ }
18
+
19
+ /**
20
+ * Get the validation rules that apply to the request.
21
+ *
22
+ * @return array
23
+ */
24
+ public function rules()
25
+ {
26
+ return [
27
+ 'token' => ['required', 'exists:storefront.checkouts,token'],
28
+ ];
29
+ }
30
+ }
@@ -0,0 +1,44 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Requests;
4
+
5
+ use Fleetbase\Http\Requests\FleetbaseRequest;
6
+ use Fleetbase\Rules\ExistsInAny;
7
+ use Illuminate\Validation\Rule;
8
+
9
+
10
+ class CreateCustomerRequest extends FleetbaseRequest
11
+ {
12
+ /**
13
+ * Determine if the user is authorized to make this request.
14
+ *
15
+ * @return bool
16
+ */
17
+ public function authorize()
18
+ {
19
+ return session('storefront_key') || request()->session()->has('api_credential');
20
+ }
21
+
22
+ /**
23
+ * Get the validation rules that apply to the request.
24
+ *
25
+ * @return array
26
+ */
27
+ public function rules()
28
+ {
29
+ return [
30
+ 'code' => 'required|exists:verification_codes,code',
31
+ 'name' => 'required',
32
+ 'email' => [
33
+ 'email', 'nullable', Rule::unique('contacts')->where(function ($query) {
34
+ return $query->whereNull('deleted_at');
35
+ })
36
+ ],
37
+ 'phone' => [
38
+ 'nullable', Rule::unique('contacts')->where(function ($query) {
39
+ return $query->whereNull('deleted_at');
40
+ })
41
+ ]
42
+ ];
43
+ }
44
+ }
@@ -0,0 +1,34 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Requests;
4
+
5
+ use Fleetbase\Http\Requests\FleetbaseRequest;
6
+
7
+ class CreateReviewRequest extends FleetbaseRequest
8
+ {
9
+ /**
10
+ * Determine if the user is authorized to make this request.
11
+ *
12
+ *
13
+ * @return bool
14
+ */
15
+ public function authorize()
16
+ {
17
+ return session('storefront_key') || request()->session()->has('api_credential');
18
+ }
19
+
20
+ /**
21
+ * Get the validation rules that apply to the request.
22
+ *
23
+ * @return array
24
+ */
25
+ public function rules()
26
+ {
27
+ return [
28
+ 'rating' => 'required|numeric',
29
+ 'content' => 'required',
30
+ 'files' => 'sometimes|array',
31
+ 'rejected' => 'sometimes|boolean'
32
+ ];
33
+ }
34
+ }
@@ -0,0 +1,40 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Requests;
4
+
5
+ use Fleetbase\Http\Requests\FleetbaseRequest;
6
+ use Fleetbase\Rules\IsValidLocation;
7
+ use Illuminate\Support\Str;
8
+
9
+ class GetServiceQuoteFromCart extends FleetbaseRequest
10
+ {
11
+ /**
12
+ * Determine if the user is authorized to make this request.
13
+ *
14
+ * @return bool
15
+ */
16
+ public function authorize()
17
+ {
18
+ return session('storefront_key');
19
+ }
20
+
21
+ /**
22
+ * Get the validation rules that apply to the request.
23
+ *
24
+ * @return array
25
+ */
26
+ public function rules()
27
+ {
28
+ // valid origin is only required if store_ key
29
+ return [
30
+ 'origin' => $this->isStoreKey() ? ['required', new IsValidLocation()] : [],
31
+ 'destination' => ['required', new IsValidLocation()],
32
+ 'cart' => 'required'
33
+ ];
34
+ }
35
+
36
+ private function isStoreKey()
37
+ {
38
+ return Str::startsWith(session('storefront_key'), 'store_');
39
+ }
40
+ }
@@ -0,0 +1,38 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Requests;
4
+
5
+ use Fleetbase\Http\Requests\FleetbaseRequest;
6
+ // use Fleetbase\Rules\Storefront\CartExists;
7
+ use Fleetbase\Rules\Storefront\CustomerExists;
8
+ use Fleetbase\Rules\Storefront\GatewayExists;
9
+
10
+ class InitializeCheckoutRequest extends FleetbaseRequest
11
+ {
12
+ /**
13
+ * Determine if the user is authorized to make this request.
14
+ *
15
+ * @return bool
16
+ */
17
+ public function authorize()
18
+ {
19
+ return session('storefront_key');
20
+ }
21
+
22
+ /**
23
+ * Get the validation rules that apply to the request.
24
+ *
25
+ * @return array
26
+ */
27
+ public function rules()
28
+ {
29
+ return [
30
+ 'gateway' => ['required', new GatewayExists],
31
+ 'customer' => ['required', new CustomerExists],
32
+ 'cart' => ['required', 'exists:storefront.carts,public_id'],
33
+ 'serviceQuote' => ['required', 'exists:service_quotes,public_id'],
34
+ 'cash' => ['sometimes', 'boolean'],
35
+ 'pickup' => ['sometimes', 'boolean'],
36
+ ];
37
+ }
38
+ }
@@ -0,0 +1,43 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Requests;
4
+
5
+ use Fleetbase\Http\Requests\FleetbaseRequest;
6
+
7
+ class NetworkActionRequest extends FleetbaseRequest
8
+ {
9
+ /**
10
+ * Override the all method to include $id.
11
+ *
12
+ * @return array
13
+ */
14
+ public function all($keys = null)
15
+ {
16
+ $data = parent::all($keys);
17
+ $data['id'] = $this->route('id');
18
+
19
+ return $data;
20
+ }
21
+
22
+ /**
23
+ * Determine if the user is authorized to make this request.
24
+ *
25
+ * @return bool
26
+ */
27
+ public function authorize()
28
+ {
29
+ return (bool) session('user');
30
+ }
31
+
32
+ /**
33
+ * Get the validation rules that apply to the request.
34
+ *
35
+ * @return array
36
+ */
37
+ public function rules()
38
+ {
39
+ return [
40
+ 'id' => ['required', 'exists:storefront.networks,uuid']
41
+ ];
42
+ }
43
+ }
@@ -0,0 +1,31 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Requests;
4
+
5
+ use Fleetbase\Http\Requests\FleetbaseRequest;
6
+
7
+ class VerifyCreateCustomerRequest extends FleetbaseRequest
8
+ {
9
+ /**
10
+ * Determine if the user is authorized to make this request.
11
+ *
12
+ * @return bool
13
+ */
14
+ public function authorize()
15
+ {
16
+ return session('storefront_key') || request()->session()->has('api_credential');
17
+ }
18
+
19
+ /**
20
+ * Get the validation rules that apply to the request.
21
+ *
22
+ * @return array
23
+ */
24
+ public function rules()
25
+ {
26
+ return [
27
+ 'mode' => 'required|in:email,sms',
28
+ 'identity' => 'required'
29
+ ];
30
+ }
31
+ }
@@ -0,0 +1,31 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Resources;
4
+
5
+ use Fleetbase\Http\Resources\FleetbaseResource;
6
+
7
+ class Cart extends FleetbaseResource
8
+ {
9
+ /**
10
+ * Transform the resource into an array.
11
+ *
12
+ * @param \Illuminate\Http\Request $request
13
+ * @return array
14
+ */
15
+ public function toArray($request)
16
+ {
17
+ return [
18
+ 'id' => $this->public_id,
19
+ 'currency' => $this->currency,
20
+ 'subtotal' => $this->subtotal,
21
+ 'total_items' => $this->total_items,
22
+ 'total_unique_items' => $this->total_unique_items,
23
+ 'items' => $this->items ?? [],
24
+ 'events' => $this->events ?? [],
25
+ 'discount_code' => $this->discount_code,
26
+ 'expires_at' => $this->expires_at,
27
+ 'created_at' => $this->created_at,
28
+ 'updated_at' => $this->updated_at,
29
+ ];
30
+ }
31
+ }
@@ -0,0 +1,48 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Resources;
4
+
5
+ use Fleetbase\Http\Resources\FleetbaseResource;
6
+ use Fleetbase\Support\Http;
7
+
8
+ class Category extends FleetbaseResource
9
+ {
10
+ /**
11
+ * Transform the resource into an array.
12
+ *
13
+ * @param \Illuminate\Http\Request $request
14
+ * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
15
+ */
16
+ public function toArray($request)
17
+ {
18
+ return [
19
+ 'id' => $this->public_id,
20
+ 'uuid' => $this->when(Http::isInternalRequest(), $this->uuid),
21
+ 'name' => $this->name,
22
+ 'description' => $this->description,
23
+ 'icon_url' => $this->icon_url,
24
+ 'parent' => $this->whenLoaded(
25
+ 'parentCategory',
26
+ function ($parentCategory) {
27
+ return $parentCategory->public_id;
28
+ }
29
+ ),
30
+ 'tags' => $this->tags ?? [],
31
+ 'translations' => $this->translations ?? [],
32
+ 'products' => Product::collection($this->whenLoaded('products')),
33
+ 'subcategories' => $this->when(
34
+ $request->has('with_subcategories'),
35
+ array_map(
36
+ function ($subCategory) {
37
+ return new Category($subCategory);
38
+ },
39
+ $this->subCategories->toArray()
40
+ )
41
+ ),
42
+ 'order' => $this->order,
43
+ 'slug' => $this->slug,
44
+ 'created_at' => $this->created_at,
45
+ 'updated_at' => $this->updated_at,
46
+ ];
47
+ }
48
+ }