@fleetbase/storefront-engine 0.1.7 → 0.1.9

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 (163) hide show
  1. package/.php-cs-fixer.php +29 -0
  2. package/LICENSE.md +16 -4
  3. package/README.md +106 -13
  4. package/composer.json +88 -0
  5. package/extension.json +10 -0
  6. package/package.json +6 -6
  7. package/phpstan.neon.dist +8 -0
  8. package/phpunit.xml.dist +16 -0
  9. package/server/.gitattributes +14 -0
  10. package/server/README.md +40 -0
  11. package/server/config/api.php +101 -0
  12. package/server/config/database.connections.php +57 -0
  13. package/server/config/storefront.php +19 -0
  14. package/server/config/twilio-notification-channel.php +36 -0
  15. package/server/migrations/2023_05_03_025307_create_carts_table.php +44 -0
  16. package/server/migrations/2023_05_03_025307_create_checkouts_table.php +51 -0
  17. package/server/migrations/2023_05_03_025307_create_gateways_table.php +48 -0
  18. package/server/migrations/2023_05_03_025307_create_network_stores_table.php +36 -0
  19. package/server/migrations/2023_05_03_025307_create_networks_table.php +56 -0
  20. package/server/migrations/2023_05_03_025307_create_notification_channels_table.php +43 -0
  21. package/server/migrations/2023_05_03_025307_create_payment_methods_table.php +44 -0
  22. package/server/migrations/2023_05_03_025307_create_product_addon_categories_table.php +38 -0
  23. package/server/migrations/2023_05_03_025307_create_product_addons_table.php +43 -0
  24. package/server/migrations/2023_05_03_025307_create_product_hours_table.php +37 -0
  25. package/server/migrations/2023_05_03_025307_create_product_store_locations_table.php +34 -0
  26. package/server/migrations/2023_05_03_025307_create_product_variant_options_table.php +40 -0
  27. package/server/migrations/2023_05_03_025307_create_product_variants_table.php +44 -0
  28. package/server/migrations/2023_05_03_025307_create_products_table.php +59 -0
  29. package/server/migrations/2023_05_03_025307_create_reviews_table.php +41 -0
  30. package/server/migrations/2023_05_03_025307_create_store_hours_table.php +37 -0
  31. package/server/migrations/2023_05_03_025307_create_store_locations_table.php +38 -0
  32. package/server/migrations/2023_05_03_025307_create_stores_table.php +57 -0
  33. package/server/migrations/2023_05_03_025307_create_votes_table.php +39 -0
  34. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_carts_table.php +40 -0
  35. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_checkouts_table.php +48 -0
  36. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_gateways_table.php +40 -0
  37. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_network_stores_table.php +40 -0
  38. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_networks_table.php +42 -0
  39. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_notification_channels_table.php +40 -0
  40. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_payment_methods_table.php +40 -0
  41. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_addon_categories_table.php +38 -0
  42. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_addons_table.php +38 -0
  43. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_hours_table.php +32 -0
  44. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_store_locations_table.php +34 -0
  45. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_variant_options_table.php +32 -0
  46. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_variants_table.php +32 -0
  47. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_products_table.php +44 -0
  48. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_reviews_table.php +38 -0
  49. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_store_hours_table.php +32 -0
  50. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_store_locations_table.php +40 -0
  51. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_stores_table.php +42 -0
  52. package/server/migrations/2023_05_03_025310_add_foreign_keys_to_votes_table.php +38 -0
  53. package/server/src/Auth/Schemas/Storefront.php +95 -0
  54. package/server/src/Console/Commands/NotifyStorefrontOrderNearby.php +86 -0
  55. package/server/src/Expansions/EntityExpansion.php +44 -0
  56. package/server/src/Http/Controllers/ActionController.php +119 -0
  57. package/server/src/Http/Controllers/AddonCategoryController.php +13 -0
  58. package/server/src/Http/Controllers/CustomerController.php +13 -0
  59. package/server/src/Http/Controllers/GatewayController.php +13 -0
  60. package/server/src/Http/Controllers/MetricsController.php +71 -0
  61. package/server/src/Http/Controllers/NetworkController.php +170 -0
  62. package/server/src/Http/Controllers/NotificationChannelController.php +13 -0
  63. package/server/src/Http/Controllers/OrderController.php +154 -0
  64. package/server/src/Http/Controllers/ProductAddonCategoryController.php +14 -0
  65. package/server/src/Http/Controllers/ProductAddonController.php +14 -0
  66. package/server/src/Http/Controllers/ProductController.php +123 -0
  67. package/server/src/Http/Controllers/ProductHourController.php +13 -0
  68. package/server/src/Http/Controllers/ProductVariantController.php +13 -0
  69. package/server/src/Http/Controllers/ProductVariantOptionController.php +13 -0
  70. package/server/src/Http/Controllers/ReviewController.php +13 -0
  71. package/server/src/Http/Controllers/StoreController.php +26 -0
  72. package/server/src/Http/Controllers/StoreHourController.php +13 -0
  73. package/server/src/Http/Controllers/StoreLocationController.php +13 -0
  74. package/server/src/Http/Controllers/StorefrontController.php +15 -0
  75. package/server/src/Http/Controllers/VoteController.php +13 -0
  76. package/server/src/Http/Controllers/v1/CartController.php +161 -0
  77. package/server/src/Http/Controllers/v1/CategoryController.php +138 -0
  78. package/server/src/Http/Controllers/v1/CheckoutController.php +957 -0
  79. package/server/src/Http/Controllers/v1/CustomerController.php +482 -0
  80. package/server/src/Http/Controllers/v1/GatewayControllerController.php +11 -0
  81. package/server/src/Http/Controllers/v1/NetworkController.php +281 -0
  82. package/server/src/Http/Controllers/v1/PaymentMethodController.php +11 -0
  83. package/server/src/Http/Controllers/v1/ProductController.php +94 -0
  84. package/server/src/Http/Controllers/v1/ReviewController.php +270 -0
  85. package/server/src/Http/Controllers/v1/ServiceQuoteController.php +402 -0
  86. package/server/src/Http/Controllers/v1/StoreController.php +176 -0
  87. package/server/src/Http/Filter/AddonCategoryFilter.php +19 -0
  88. package/server/src/Http/Filter/CustomerFilter.php +18 -0
  89. package/server/src/Http/Filter/GatewayFilter.php +13 -0
  90. package/server/src/Http/Filter/NetworkFilter.php +18 -0
  91. package/server/src/Http/Filter/NotificationChannelFilter.php +13 -0
  92. package/server/src/Http/Filter/OrderFilter.php +46 -0
  93. package/server/src/Http/Filter/ProductFilter.php +28 -0
  94. package/server/src/Http/Filter/StoreFilter.php +42 -0
  95. package/server/src/Http/Filter/StoreLocationFilter.php +23 -0
  96. package/server/src/Http/Middleware/SetStorefrontSession.php +130 -0
  97. package/server/src/Http/Requests/AddStoreToNetworkCategory.php +45 -0
  98. package/server/src/Http/Requests/CaptureOrderRequest.php +30 -0
  99. package/server/src/Http/Requests/CreateCustomerRequest.php +44 -0
  100. package/server/src/Http/Requests/CreateReviewRequest.php +34 -0
  101. package/server/src/Http/Requests/GetServiceQuoteFromCart.php +40 -0
  102. package/server/src/Http/Requests/InitializeCheckoutRequest.php +38 -0
  103. package/server/src/Http/Requests/NetworkActionRequest.php +43 -0
  104. package/server/src/Http/Requests/VerifyCreateCustomerRequest.php +31 -0
  105. package/server/src/Http/Resources/Cart.php +31 -0
  106. package/server/src/Http/Resources/Category.php +48 -0
  107. package/server/src/Http/Resources/Customer.php +36 -0
  108. package/server/src/Http/Resources/Gateway.php +32 -0
  109. package/server/src/Http/Resources/Media.php +29 -0
  110. package/server/src/Http/Resources/Network.php +48 -0
  111. package/server/src/Http/Resources/Product.php +209 -0
  112. package/server/src/Http/Resources/Review.php +45 -0
  113. package/server/src/Http/Resources/ReviewCustomer.php +60 -0
  114. package/server/src/Http/Resources/Store.php +76 -0
  115. package/server/src/Http/Resources/StoreHour.php +29 -0
  116. package/server/src/Http/Resources/StoreLocation.php +33 -0
  117. package/server/src/Imports/ProductsImport.php +20 -0
  118. package/server/src/Jobs/DownloadProductImageUrl.php +60 -0
  119. package/server/src/Listeners/HandleOrderCompleted.php +31 -0
  120. package/server/src/Listeners/HandleOrderDispatched.php +34 -0
  121. package/server/src/Listeners/HandleOrderDriverAssigned.php +37 -0
  122. package/server/src/Listeners/HandleOrderStarted.php +27 -0
  123. package/server/src/Mail/StorefrontNetworkInvite.php +48 -0
  124. package/server/src/Models/AddonCategory.php +30 -0
  125. package/server/src/Models/Cart.php +691 -0
  126. package/server/src/Models/Checkout.php +166 -0
  127. package/server/src/Models/Customer.php +88 -0
  128. package/server/src/Models/Gateway.php +165 -0
  129. package/server/src/Models/Network.php +300 -0
  130. package/server/src/Models/NetworkStore.php +86 -0
  131. package/server/src/Models/NotificationChannel.php +147 -0
  132. package/server/src/Models/PaymentMethod.php +99 -0
  133. package/server/src/Models/Product.php +315 -0
  134. package/server/src/Models/ProductAddon.php +128 -0
  135. package/server/src/Models/ProductAddonCategory.php +90 -0
  136. package/server/src/Models/ProductHour.php +59 -0
  137. package/server/src/Models/ProductStoreLocation.php +77 -0
  138. package/server/src/Models/ProductVariant.php +125 -0
  139. package/server/src/Models/ProductVariantOption.php +86 -0
  140. package/server/src/Models/Review.php +127 -0
  141. package/server/src/Models/Store.php +478 -0
  142. package/server/src/Models/StoreHour.php +59 -0
  143. package/server/src/Models/StoreLocation.php +126 -0
  144. package/server/src/Models/StorefrontModel.php +22 -0
  145. package/server/src/Models/Vote.php +84 -0
  146. package/server/src/Notifications/StorefrontOrderCanceled.php +196 -0
  147. package/server/src/Notifications/StorefrontOrderCompleted.php +201 -0
  148. package/server/src/Notifications/StorefrontOrderCreated.php +157 -0
  149. package/server/src/Notifications/StorefrontOrderDriverAssigned.php +200 -0
  150. package/server/src/Notifications/StorefrontOrderEnroute.php +199 -0
  151. package/server/src/Notifications/StorefrontOrderNearby.php +201 -0
  152. package/server/src/Notifications/StorefrontOrderPreparing.php +202 -0
  153. package/server/src/Notifications/StorefrontOrderReadyForPickup.php +202 -0
  154. package/server/src/Observers/NetworkObserver.php +40 -0
  155. package/server/src/Observers/ProductObserver.php +118 -0
  156. package/server/src/Providers/EventServiceProvider.php +23 -0
  157. package/server/src/Providers/StorefrontServiceProvider.php +103 -0
  158. package/server/src/Support/Metrics.php +193 -0
  159. package/server/src/Support/OrderConfig.php +13 -0
  160. package/server/src/Support/QPay.php +208 -0
  161. package/server/src/Support/Storefront.php +201 -0
  162. package/server/src/routes.php +180 -0
  163. package/server/tests/Feature.php +5 -0
@@ -0,0 +1,15 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Controllers;
4
+
5
+ use Fleetbase\Http\Controllers\FleetbaseController;
6
+
7
+ class StorefrontController extends FleetbaseController
8
+ {
9
+ /**
10
+ * The package namespace used to resolve from.
11
+ *
12
+ * @var string
13
+ */
14
+ public string $namespace = '\\Fleetbase\\Storefront';
15
+ }
@@ -0,0 +1,13 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Controllers;
4
+
5
+ class VoteController extends StorefrontController
6
+ {
7
+ /**
8
+ * The resource to query
9
+ *
10
+ * @var string
11
+ */
12
+ public $resource = 'votes';
13
+ }
@@ -0,0 +1,161 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Controllers\v1;
4
+
5
+ use Fleetbase\Http\Controllers\Controller;
6
+ use Fleetbase\Storefront\Models\Cart;
7
+ use Fleetbase\Storefront\Http\Resources\Cart as StorefrontCart;
8
+ use Illuminate\Http\Request;
9
+
10
+ class CartController extends Controller
11
+ {
12
+ /**
13
+ * Retrieve or create a cart using a unique identifier. If no unique identifier is provided
14
+ * one will be created.
15
+ *
16
+ * @param string|null $uniqueId
17
+ * @param \Illuminate\Http\Request $request
18
+ * @return \Illuminate\Http\Response
19
+ */
20
+ public function retrieve(?string $uniqueId = null, Request $request)
21
+ {
22
+ $cart = Cart::retrieve($uniqueId, true);
23
+
24
+ // reset currency
25
+ $cart->resetCurrency();
26
+
27
+ return new StorefrontCart($cart);
28
+ }
29
+
30
+ /**
31
+ * Adds a product to cart and creates a line item for the product.
32
+ *
33
+ * @param string $cartId
34
+ * @param string $productId
35
+ * @param \Illuminate\Http\Request $request
36
+ * @return \Illuminate\Http\Response
37
+ */
38
+ public function add(string $cartId, string $productId, Request $request)
39
+ {
40
+ $quantity = $request->input('quantity', 1);
41
+ $variants = $request->input('variants', []);
42
+ $addons = $request->input('addons', []);
43
+ $scheduledAt = $request->input('scheduled_at');
44
+ $storeLocationId = $request->input('store_location');
45
+ $cart = Cart::retrieve($cartId);
46
+
47
+ if (!$cart) {
48
+ return response()->error('Cart was not found or has already been checkout out.');
49
+ }
50
+
51
+ try {
52
+ $cart->add($productId, $quantity, $variants, $addons, $storeLocationId, $scheduledAt);
53
+ } catch (\Exception $e) {
54
+ return response()->error($e->getMessage());
55
+ }
56
+
57
+ // reset currency
58
+ $cart->resetCurrency();
59
+
60
+ return new StorefrontCart($cart);
61
+ }
62
+
63
+ /**
64
+ * Update a line item in the cart
65
+ *
66
+ * @param string $cartId
67
+ * @param string $cartItemId - can be either product id or line item id
68
+ * @param \Illuminate\Http\Request $request
69
+ * @return \Illuminate\Http\Response
70
+ */
71
+ public function update(string $cartId, string $cartItemId, Request $request)
72
+ {
73
+ $quantity = $request->input('quantity', null);
74
+ $variants = $request->input('variants', null);
75
+ $addons = $request->input('addons', null);
76
+ $scheduledAt = $request->input('scheduled_at');
77
+ $cart = Cart::retrieve($cartId);
78
+
79
+ if (!$cart) {
80
+ return response()->error('Cart was not found or has already been checkout out.');
81
+ }
82
+
83
+ try {
84
+ $cart->updateItem($cartItemId, $quantity, $variants, $addons, $scheduledAt);
85
+ } catch (\Exception $e) {
86
+ return response()->error($e->getMessage());
87
+ }
88
+
89
+ // reset currency
90
+ $cart->resetCurrency();
91
+
92
+ return new StorefrontCart($cart);
93
+ }
94
+
95
+ /**
96
+ * Removes a line item in the cart
97
+ *
98
+ * @param string $cartId
99
+ * @param string $cartItemId - can be either product id or line item id
100
+ * @param \Illuminate\Http\Request $request
101
+ * @return \Illuminate\Http\Response
102
+ */
103
+ public function remove(?string $cartId, ?string $cartItemId, Request $request)
104
+ {
105
+ $cart = Cart::retrieve($cartId);
106
+
107
+ if (!$cart) {
108
+ return response()->error('Cart was not found or has already been checkout out.');
109
+ }
110
+
111
+ try {
112
+ $cart->remove($cartItemId);
113
+ } catch (\Exception $e) {
114
+ return response()->error($e->getMessage());
115
+ }
116
+
117
+ // reset currency
118
+ $cart->resetCurrency();
119
+
120
+ return new StorefrontCart($cart);
121
+ }
122
+
123
+ /**
124
+ * Empties a cart
125
+ *
126
+ * @param string $cartId
127
+ * @return \Illuminate\Http\Response
128
+ */
129
+ public function empty(string $cartId)
130
+ {
131
+ $cart = Cart::retrieve($cartId);
132
+
133
+ if (!$cart) {
134
+ return response()->error('Unable to empty cart.');
135
+ }
136
+
137
+ $cart->empty();
138
+
139
+ return new StorefrontCart($cart);
140
+ }
141
+
142
+ /**
143
+ * Deletes a cart.
144
+ *
145
+ * @param string $cartId
146
+ * @param \Illuminate\Http\Request $request
147
+ * @return \Illuminate\Http\Response
148
+ */
149
+ public function delete(string $cartId)
150
+ {
151
+ $cart = Cart::retrieve($cartId);
152
+
153
+ if (!$cart) {
154
+ return response()->error('Cart was not found or has already been checkout out.');
155
+ }
156
+
157
+ $cart->delete();
158
+
159
+ return response()->json([]);
160
+ }
161
+ }
@@ -0,0 +1,138 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\Storefront\Http\Controllers\v1;
4
+
5
+ use Fleetbase\Http\Controllers\Controller;
6
+ use Fleetbase\Storefront\Http\Resources\Category as StorefrontCategory;
7
+ use Fleetbase\Storefront\Http\Resources\Product as ProductResource;
8
+ use Fleetbase\Storefront\Models\Store;
9
+ use Fleetbase\Storefront\Models\Product;
10
+ use Fleetbase\Models\Category;
11
+ use Illuminate\Http\Request;
12
+ use Illuminate\Support\Facades\DB;
13
+
14
+ class CategoryController extends Controller
15
+ {
16
+ /**
17
+ * Query for Storefront Product resources.
18
+ *
19
+ * @param \Illuminate\Http\Request $request
20
+ * @return \Illuminate\Http\Response
21
+ */
22
+ public function query(Request $request)
23
+ {
24
+ $results = [];
25
+
26
+ if (session('storefront_store')) {
27
+ $results = Category::queryWithRequest($request, function (&$query) use ($request) {
28
+ $query->select([DB::raw('public_id as id'), 'public_id', 'uuid', 'parent_uuid', 'icon_file_uuid', 'name', 'description', 'tags', 'translations', 'icon', 'slug', 'created_at'])->where(['owner_uuid' => session('storefront_store'), 'for' => 'storefront_product']);
29
+
30
+ // only parent categories
31
+ if ($request->has('parents_only')) {
32
+ $query->whereNull('parent_uuid');
33
+ }
34
+
35
+ // get categories with parent
36
+ if ($request->has('parent')) {
37
+ $query->whereHas('parentCategory', function ($q) use ($request) {
38
+ $q->where('public_id', $request->input('parent'));
39
+ });
40
+ }
41
+ });
42
+
43
+ // if we want to get categories with products
44
+ if ($request->has('with_products')) {
45
+ // get all category ids
46
+ $categoryIds = $results->map(function ($category) {
47
+ return $category->uuid;
48
+ })->toArray();
49
+
50
+ // get all products in these categories
51
+ $products = Product::whereIn('category_uuid', $categoryIds)->where('is_available', 1)->with(['addonCategories', 'variants', 'files'])->get();
52
+
53
+ $results = $results->map(function ($category) use ($products) {
54
+ $category->products = $products->where('category_uuid', $category->uuid)->mapInto(ProductResource::class)->values();
55
+
56
+ return $category;
57
+ });
58
+ }
59
+ }
60
+
61
+ if (session('storefront_network')) {
62
+ if ($request->filled('store')) {
63
+ $store = Store::where([
64
+ 'company_uuid' => session('company'),
65
+ 'public_id' => $request->input('store')
66
+ ])->whereHas('networks', function ($q) {
67
+ $q->where('network_uuid', session('storefront_network'));
68
+ })->first();
69
+
70
+ if ($store) {
71
+ $results = Category::queryWithRequest($request, function (&$query) use ($store, $request) {
72
+ $query->select([DB::raw('public_id as id'), 'public_id', 'uuid', 'parent_uuid', 'icon_file_uuid', 'name', 'icon', 'description', 'tags', 'translations', 'slug', 'created_at'])->where(['owner_uuid' => $store->uuid, 'for' => 'storefront_product']);
73
+
74
+ // only parent categories
75
+ if ($request->has('parents_only')) {
76
+ $query->whereNull('parent_uuid');
77
+ }
78
+
79
+ // get categories with parent
80
+ if ($request->has('parent')) {
81
+ $query->whereHas('parentCategory', function ($q) use ($request) {
82
+ $q->where('public_id', $request->input('parent'));
83
+ });
84
+ }
85
+ });
86
+
87
+ // if we want to get categories with products
88
+ if ($request->has('with_products')) {
89
+ // get all category ids
90
+ $categoryIds = $results->map(function ($category) {
91
+ return $category->uuid;
92
+ })->toArray();
93
+
94
+ // get all products in these categories
95
+ $products = Product::whereIn('category_uuid', $categoryIds)->where('is_available', 1)->with(['addonCategories', 'variants', 'files'])->get();
96
+
97
+ $results = $results->map(function ($category) use ($products) {
98
+ // $category->products = Product::where('category_uuid', $category->uuid)->get()->mapInto(ProductResource::class);
99
+ $category->products = $products->where('category_uuid', $category->uuid)->mapInto(ProductResource::class)->values();
100
+
101
+ return $category;
102
+ });
103
+ }
104
+ }
105
+ } else {
106
+ $results = Category::queryWithRequest($request, function (&$query) use ($request) {
107
+ $query->select([DB::raw('public_id as id'), 'public_id', 'uuid', 'parent_uuid', 'name', 'icon', 'description', 'tags', 'translations', 'slug', 'created_at'])->where(['owner_uuid' => session('storefront_network'), 'for' => 'storefront_network']);
108
+
109
+ // only parent categories
110
+ if ($request->has('parents_only')) {
111
+ $query->whereNull('parent_uuid');
112
+ }
113
+
114
+ // get categories with parent
115
+ if ($request->has('parent')) {
116
+ $query->whereHas('parentCategory', function ($q) use ($request) {
117
+ $q->where('public_id', $request->input('parent'));
118
+ });
119
+ }
120
+ });
121
+
122
+ // if we want to get categories with stores
123
+ if ($request->has('with_stores')) {
124
+ $results = $results->map(function ($category) {
125
+ $category->stores = Store::whereHas('networks', function ($q) use ($category) {
126
+ $q->where('network_uuid', session('storefront_network'));
127
+ $q->where('category_uuid', $category->uuid);
128
+ })->get();
129
+
130
+ return $category;
131
+ });
132
+ }
133
+ }
134
+ }
135
+
136
+ return StorefrontCategory::collection($results);
137
+ }
138
+ }