@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.
- package/.php-cs-fixer.php +29 -0
- package/LICENSE.md +16 -4
- package/README.md +106 -13
- package/composer.json +88 -0
- package/extension.json +10 -0
- package/package.json +6 -6
- package/phpstan.neon.dist +8 -0
- package/phpunit.xml.dist +16 -0
- package/server/.gitattributes +14 -0
- package/server/README.md +40 -0
- package/server/config/api.php +101 -0
- package/server/config/database.connections.php +57 -0
- package/server/config/storefront.php +19 -0
- package/server/config/twilio-notification-channel.php +36 -0
- package/server/migrations/2023_05_03_025307_create_carts_table.php +44 -0
- package/server/migrations/2023_05_03_025307_create_checkouts_table.php +51 -0
- package/server/migrations/2023_05_03_025307_create_gateways_table.php +48 -0
- package/server/migrations/2023_05_03_025307_create_network_stores_table.php +36 -0
- package/server/migrations/2023_05_03_025307_create_networks_table.php +56 -0
- package/server/migrations/2023_05_03_025307_create_notification_channels_table.php +43 -0
- package/server/migrations/2023_05_03_025307_create_payment_methods_table.php +44 -0
- package/server/migrations/2023_05_03_025307_create_product_addon_categories_table.php +38 -0
- package/server/migrations/2023_05_03_025307_create_product_addons_table.php +43 -0
- package/server/migrations/2023_05_03_025307_create_product_hours_table.php +37 -0
- package/server/migrations/2023_05_03_025307_create_product_store_locations_table.php +34 -0
- package/server/migrations/2023_05_03_025307_create_product_variant_options_table.php +40 -0
- package/server/migrations/2023_05_03_025307_create_product_variants_table.php +44 -0
- package/server/migrations/2023_05_03_025307_create_products_table.php +59 -0
- package/server/migrations/2023_05_03_025307_create_reviews_table.php +41 -0
- package/server/migrations/2023_05_03_025307_create_store_hours_table.php +37 -0
- package/server/migrations/2023_05_03_025307_create_store_locations_table.php +38 -0
- package/server/migrations/2023_05_03_025307_create_stores_table.php +57 -0
- package/server/migrations/2023_05_03_025307_create_votes_table.php +39 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_carts_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_checkouts_table.php +48 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_gateways_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_network_stores_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_networks_table.php +42 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_notification_channels_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_payment_methods_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_addon_categories_table.php +38 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_addons_table.php +38 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_hours_table.php +32 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_store_locations_table.php +34 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_variant_options_table.php +32 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_product_variants_table.php +32 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_products_table.php +44 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_reviews_table.php +38 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_store_hours_table.php +32 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_store_locations_table.php +40 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_stores_table.php +42 -0
- package/server/migrations/2023_05_03_025310_add_foreign_keys_to_votes_table.php +38 -0
- package/server/src/Auth/Schemas/Storefront.php +95 -0
- package/server/src/Console/Commands/NotifyStorefrontOrderNearby.php +86 -0
- package/server/src/Expansions/EntityExpansion.php +44 -0
- package/server/src/Http/Controllers/ActionController.php +119 -0
- package/server/src/Http/Controllers/AddonCategoryController.php +13 -0
- package/server/src/Http/Controllers/CustomerController.php +13 -0
- package/server/src/Http/Controllers/GatewayController.php +13 -0
- package/server/src/Http/Controllers/MetricsController.php +71 -0
- package/server/src/Http/Controllers/NetworkController.php +170 -0
- package/server/src/Http/Controllers/NotificationChannelController.php +13 -0
- package/server/src/Http/Controllers/OrderController.php +154 -0
- package/server/src/Http/Controllers/ProductAddonCategoryController.php +14 -0
- package/server/src/Http/Controllers/ProductAddonController.php +14 -0
- package/server/src/Http/Controllers/ProductController.php +123 -0
- package/server/src/Http/Controllers/ProductHourController.php +13 -0
- package/server/src/Http/Controllers/ProductVariantController.php +13 -0
- package/server/src/Http/Controllers/ProductVariantOptionController.php +13 -0
- package/server/src/Http/Controllers/ReviewController.php +13 -0
- package/server/src/Http/Controllers/StoreController.php +26 -0
- package/server/src/Http/Controllers/StoreHourController.php +13 -0
- package/server/src/Http/Controllers/StoreLocationController.php +13 -0
- package/server/src/Http/Controllers/StorefrontController.php +15 -0
- package/server/src/Http/Controllers/VoteController.php +13 -0
- package/server/src/Http/Controllers/v1/CartController.php +161 -0
- package/server/src/Http/Controllers/v1/CategoryController.php +138 -0
- package/server/src/Http/Controllers/v1/CheckoutController.php +957 -0
- package/server/src/Http/Controllers/v1/CustomerController.php +482 -0
- package/server/src/Http/Controllers/v1/GatewayControllerController.php +11 -0
- package/server/src/Http/Controllers/v1/NetworkController.php +281 -0
- package/server/src/Http/Controllers/v1/PaymentMethodController.php +11 -0
- package/server/src/Http/Controllers/v1/ProductController.php +94 -0
- package/server/src/Http/Controllers/v1/ReviewController.php +270 -0
- package/server/src/Http/Controllers/v1/ServiceQuoteController.php +402 -0
- package/server/src/Http/Controllers/v1/StoreController.php +176 -0
- package/server/src/Http/Filter/AddonCategoryFilter.php +19 -0
- package/server/src/Http/Filter/CustomerFilter.php +18 -0
- package/server/src/Http/Filter/GatewayFilter.php +13 -0
- package/server/src/Http/Filter/NetworkFilter.php +18 -0
- package/server/src/Http/Filter/NotificationChannelFilter.php +13 -0
- package/server/src/Http/Filter/OrderFilter.php +46 -0
- package/server/src/Http/Filter/ProductFilter.php +28 -0
- package/server/src/Http/Filter/StoreFilter.php +42 -0
- package/server/src/Http/Filter/StoreLocationFilter.php +23 -0
- package/server/src/Http/Middleware/SetStorefrontSession.php +130 -0
- package/server/src/Http/Requests/AddStoreToNetworkCategory.php +45 -0
- package/server/src/Http/Requests/CaptureOrderRequest.php +30 -0
- package/server/src/Http/Requests/CreateCustomerRequest.php +44 -0
- package/server/src/Http/Requests/CreateReviewRequest.php +34 -0
- package/server/src/Http/Requests/GetServiceQuoteFromCart.php +40 -0
- package/server/src/Http/Requests/InitializeCheckoutRequest.php +38 -0
- package/server/src/Http/Requests/NetworkActionRequest.php +43 -0
- package/server/src/Http/Requests/VerifyCreateCustomerRequest.php +31 -0
- package/server/src/Http/Resources/Cart.php +31 -0
- package/server/src/Http/Resources/Category.php +48 -0
- package/server/src/Http/Resources/Customer.php +36 -0
- package/server/src/Http/Resources/Gateway.php +32 -0
- package/server/src/Http/Resources/Media.php +29 -0
- package/server/src/Http/Resources/Network.php +48 -0
- package/server/src/Http/Resources/Product.php +209 -0
- package/server/src/Http/Resources/Review.php +45 -0
- package/server/src/Http/Resources/ReviewCustomer.php +60 -0
- package/server/src/Http/Resources/Store.php +76 -0
- package/server/src/Http/Resources/StoreHour.php +29 -0
- package/server/src/Http/Resources/StoreLocation.php +33 -0
- package/server/src/Imports/ProductsImport.php +20 -0
- package/server/src/Jobs/DownloadProductImageUrl.php +60 -0
- package/server/src/Listeners/HandleOrderCompleted.php +31 -0
- package/server/src/Listeners/HandleOrderDispatched.php +34 -0
- package/server/src/Listeners/HandleOrderDriverAssigned.php +37 -0
- package/server/src/Listeners/HandleOrderStarted.php +27 -0
- package/server/src/Mail/StorefrontNetworkInvite.php +48 -0
- package/server/src/Models/AddonCategory.php +30 -0
- package/server/src/Models/Cart.php +691 -0
- package/server/src/Models/Checkout.php +166 -0
- package/server/src/Models/Customer.php +88 -0
- package/server/src/Models/Gateway.php +165 -0
- package/server/src/Models/Network.php +300 -0
- package/server/src/Models/NetworkStore.php +86 -0
- package/server/src/Models/NotificationChannel.php +147 -0
- package/server/src/Models/PaymentMethod.php +99 -0
- package/server/src/Models/Product.php +315 -0
- package/server/src/Models/ProductAddon.php +128 -0
- package/server/src/Models/ProductAddonCategory.php +90 -0
- package/server/src/Models/ProductHour.php +59 -0
- package/server/src/Models/ProductStoreLocation.php +77 -0
- package/server/src/Models/ProductVariant.php +125 -0
- package/server/src/Models/ProductVariantOption.php +86 -0
- package/server/src/Models/Review.php +127 -0
- package/server/src/Models/Store.php +478 -0
- package/server/src/Models/StoreHour.php +59 -0
- package/server/src/Models/StoreLocation.php +126 -0
- package/server/src/Models/StorefrontModel.php +22 -0
- package/server/src/Models/Vote.php +84 -0
- package/server/src/Notifications/StorefrontOrderCanceled.php +196 -0
- package/server/src/Notifications/StorefrontOrderCompleted.php +201 -0
- package/server/src/Notifications/StorefrontOrderCreated.php +157 -0
- package/server/src/Notifications/StorefrontOrderDriverAssigned.php +200 -0
- package/server/src/Notifications/StorefrontOrderEnroute.php +199 -0
- package/server/src/Notifications/StorefrontOrderNearby.php +201 -0
- package/server/src/Notifications/StorefrontOrderPreparing.php +202 -0
- package/server/src/Notifications/StorefrontOrderReadyForPickup.php +202 -0
- package/server/src/Observers/NetworkObserver.php +40 -0
- package/server/src/Observers/ProductObserver.php +118 -0
- package/server/src/Providers/EventServiceProvider.php +23 -0
- package/server/src/Providers/StorefrontServiceProvider.php +103 -0
- package/server/src/Support/Metrics.php +193 -0
- package/server/src/Support/OrderConfig.php +13 -0
- package/server/src/Support/QPay.php +208 -0
- package/server/src/Support/Storefront.php +201 -0
- package/server/src/routes.php +180 -0
- 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,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
|
+
}
|