@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.
- package/.php-cs-fixer.php +29 -0
- package/LICENSE.md +16 -4
- package/README.md +106 -13
- package/addon/components/modals/add-store-to-category.hbs +5 -0
- package/addon/components/modals/create-network-category.hbs +28 -28
- package/addon/components/modals/share-network.hbs +3 -3
- package/addon/components/modals/store-details.hbs +22 -0
- package/addon/components/modals/store-form.hbs +22 -0
- package/addon/components/modals/store-form.js +21 -0
- package/addon/components/network-category-picker.hbs +40 -0
- package/addon/components/network-category-picker.js +83 -0
- package/addon/components/store-selector.hbs +4 -2
- package/addon/components/widget/orders.js +22 -17
- package/addon/controllers/networks/index/network/index.js +133 -9
- package/addon/controllers/networks/index/network/stores.js +422 -153
- package/addon/controllers/networks/index.js +66 -4
- package/addon/controllers/products/index/category.js +1 -1
- package/addon/controllers/settings/index.js +14 -7
- package/addon/controllers/settings/notifications.js +1 -1
- package/addon/models/store.js +44 -7
- package/addon/routes/networks/index/network/customers.js +4 -1
- package/addon/routes/networks/index/network/orders.js +4 -1
- package/addon/routes/networks/index/network/stores.js +19 -15
- package/addon/serializers/store.js +1 -0
- package/addon/templates/customers/index.hbs +0 -11
- package/addon/templates/networks/index/network/index.hbs +1 -1
- package/addon/templates/networks/index/network/stores.hbs +8 -163
- package/addon/templates/networks/index/network.hbs +2 -3
- package/addon/utils/create-shareable-link.js +21 -0
- package/app/adapters/addon-category.js +1 -1
- package/app/adapters/gateway.js +1 -1
- package/app/adapters/network.js +1 -1
- package/app/adapters/notification-channel.js +1 -1
- package/app/adapters/product-addon-category.js +1 -1
- package/app/adapters/product-addon.js +1 -1
- package/app/adapters/product-hour.js +1 -1
- package/app/adapters/product-store-location.js +1 -1
- package/app/adapters/product-variant-option.js +1 -1
- package/app/adapters/product-variant.js +1 -1
- package/app/adapters/product.js +1 -1
- package/app/adapters/store-hour.js +1 -1
- package/app/adapters/store-location.js +1 -1
- package/app/adapters/store.js +1 -1
- package/app/adapters/storefront.js +1 -1
- package/app/components/file-record.js +1 -1
- package/app/components/modals/add-store-hours.js +1 -1
- package/app/components/modals/add-store-to-category.js +1 -0
- package/app/components/modals/add-stores-to-network.js +1 -1
- package/app/components/modals/assign-driver.js +1 -1
- package/app/components/modals/create-first-store.js +1 -1
- package/app/components/modals/create-gateway.js +1 -1
- package/app/components/modals/create-network-category.js +1 -1
- package/app/components/modals/create-network.js +1 -1
- package/app/components/modals/create-new-variant.js +1 -1
- package/app/components/modals/create-notification-channel.js +1 -1
- package/app/components/modals/create-product-category.js +1 -1
- package/app/components/modals/create-store.js +1 -1
- package/app/components/modals/edit-network.js +1 -1
- package/app/components/modals/import-products.js +1 -1
- package/app/components/modals/incoming-order.js +1 -1
- package/app/components/modals/manage-addons.js +1 -1
- package/app/components/modals/order-ready-assign-driver.js +1 -1
- package/app/components/modals/select-addon-category.js +1 -1
- package/app/components/modals/share-network.js +1 -1
- package/app/components/modals/store-details.js +1 -0
- package/app/components/modals/store-form.js +1 -0
- package/app/components/modals/store-location-form.js +1 -1
- package/app/components/network-category-picker.js +1 -0
- package/app/components/order-card.js +1 -1
- package/app/components/schedule-manager.js +1 -1
- package/app/components/settings-container.js +1 -1
- package/app/components/store-selector.js +1 -1
- package/app/components/widget/customers.js +1 -1
- package/app/components/widget/orders.js +1 -1
- package/app/components/widget/storefront-metrics.js +1 -1
- package/app/controllers/application.js +1 -1
- package/app/controllers/customers/index.js +1 -1
- package/app/controllers/home.js +1 -1
- package/app/controllers/networks/index/network/customers.js +1 -1
- package/app/controllers/networks/index/network/index.js +1 -1
- package/app/controllers/networks/index/network/orders.js +1 -1
- package/app/controllers/networks/index/network/stores.js +1 -1
- package/app/controllers/networks/index/network.js +1 -1
- package/app/controllers/networks/index.js +1 -1
- package/app/controllers/orders/index.js +1 -1
- package/app/controllers/products/index/category/edit.js +1 -1
- package/app/controllers/products/index/category/new.js +1 -1
- package/app/controllers/products/index/category.js +1 -1
- package/app/controllers/products/index/index/edit.js +1 -1
- package/app/controllers/products/index/index.js +1 -1
- package/app/controllers/products/index.js +1 -1
- package/app/controllers/settings/api.js +1 -1
- package/app/controllers/settings/gateways.js +1 -1
- package/app/controllers/settings/index.js +1 -1
- package/app/controllers/settings/locations.js +1 -1
- package/app/controllers/settings/notifications.js +1 -1
- package/app/helpers/get-tip-amount.js +1 -1
- package/app/models/addon-category.js +1 -1
- package/app/models/gateway.js +1 -1
- package/app/models/network.js +1 -1
- package/app/models/notification-channel.js +1 -1
- package/app/models/product-addon-category.js +1 -1
- package/app/models/product-addon.js +1 -1
- package/app/models/product-hour.js +1 -1
- package/app/models/product-store-location.js +1 -1
- package/app/models/product-variant-option.js +1 -1
- package/app/models/product-variant.js +1 -1
- package/app/models/product.js +1 -1
- package/app/models/store-hour.js +1 -1
- package/app/models/store-location.js +1 -1
- package/app/models/store.js +1 -1
- package/app/routes/application.js +1 -1
- package/app/routes/customers/index/edit.js +1 -1
- package/app/routes/customers/index.js +1 -1
- package/app/routes/home.js +1 -1
- package/app/routes/networks/index/network/customers.js +1 -1
- package/app/routes/networks/index/network/index.js +1 -1
- package/app/routes/networks/index/network/orders.js +1 -1
- package/app/routes/networks/index/network/stores.js +1 -1
- package/app/routes/networks/index/network.js +1 -1
- package/app/routes/networks/index.js +1 -1
- package/app/routes/orders/index/edit.js +1 -1
- package/app/routes/orders/index/new.js +1 -1
- package/app/routes/orders/index/view.js +1 -1
- package/app/routes/orders/index.js +1 -1
- package/app/routes/products/index/category/edit.js +1 -1
- package/app/routes/products/index/category/new.js +1 -1
- package/app/routes/products/index/category.js +1 -1
- package/app/routes/products/index/index/edit.js +1 -1
- package/app/routes/products/index/index.js +1 -1
- package/app/routes/products/index.js +1 -1
- package/app/routes/settings/api.js +1 -1
- package/app/routes/settings/gateways.js +1 -1
- package/app/routes/settings/index.js +1 -1
- package/app/routes/settings/locations.js +1 -1
- package/app/routes/settings/notifications.js +1 -1
- package/app/serializers/addon-category.js +1 -1
- package/app/serializers/network.js +1 -1
- package/app/serializers/notification-channel.js +1 -1
- package/app/serializers/product-addon-category.js +1 -1
- package/app/serializers/product-variant.js +1 -1
- package/app/serializers/product.js +1 -1
- package/app/serializers/store-location.js +1 -1
- package/app/serializers/store.js +1 -1
- package/app/services/storefront.js +1 -1
- package/app/templates/customers/index/edit.js +1 -1
- package/app/templates/customers/index.js +1 -1
- package/app/templates/home.js +1 -1
- package/app/templates/networks/index/network/customers.js +1 -1
- package/app/templates/networks/index/network/index.js +1 -1
- package/app/templates/networks/index/network/orders.js +1 -1
- package/app/templates/networks/index/network/stores.js +1 -1
- package/app/templates/networks/index/network.js +1 -1
- package/app/templates/networks/index.js +1 -1
- package/app/templates/orders/index/edit.js +1 -1
- package/app/templates/orders/index/new.js +1 -1
- package/app/templates/orders/index/view.js +1 -1
- package/app/templates/orders/index.js +1 -1
- package/app/templates/products/index/category/edit.js +1 -1
- package/app/templates/products/index/category/new.js +1 -1
- package/app/templates/products/index/category.js +1 -1
- package/app/templates/products/index/index/edit.js +1 -1
- package/app/templates/products/index/index.js +1 -1
- package/app/templates/products/index.js +1 -1
- package/app/templates/settings/api.js +1 -1
- package/app/templates/settings/gateways.js +1 -1
- package/app/templates/settings/index.js +1 -1
- package/app/templates/settings/locations.js +1 -1
- package/app/templates/settings/notifications.js +1 -1
- package/app/templates/settings.js +1 -1
- package/app/utils/create-shareable-link.js +1 -0
- package/app/utils/get-gateway-schemas.js +1 -1
- package/app/utils/get-notification-schemas.js +1 -1
- package/composer.json +88 -0
- package/extension.json +10 -0
- package/package.json +6 -7
- 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,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
|
+
}
|