PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.7.0
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.7.0
1.7.0 1.6.6 1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 1.3.20 All 50 releases
← All changes | app/Http/Routes/api.php +241 -76 1.3.23 → 1.7.0 View file →
@@ -6,17 +6,20 @@
6 6 */
7 7
8 8 use FluentCart\App\Http\Controllers\AddonsController;
9 9 use FluentCart\App\Http\Controllers\AddressInfoController;
10 +use FluentCart\App\Http\Controllers\AttributesController;
10 11 use FluentCart\App\Http\Controllers\AppControllers\AppController;
11 -use FluentCart\App\Http\Controllers\AttributesController;
12 12 use FluentCart\App\Http\Controllers\CheckoutFieldsController;
13 13 use FluentCart\App\Http\Controllers\CustomerController;
14 14 use FluentCart\App\Http\Controllers\DashboardController;
15 +use FluentCart\App\Http\Controllers\DataBackfillController;
15 16 use FluentCart\App\Http\Controllers\EmailNotificationController;
16 17 use FluentCart\App\Http\Controllers\FileUploadController;
17 18 use FluentCart\App\Http\Controllers\IntegrationController;
19 +use FluentCart\App\Http\Controllers\RenewalController;
18 20 use FluentCart\App\Http\Controllers\LabelController;
21 +use FluentCart\App\Http\Controllers\McpSettingsController;
19 22 use FluentCart\App\Http\Controllers\ModuleSettingsController;
20 23 use FluentCart\App\Http\Controllers\NotesController;
21 24 use FluentCart\App\Http\Controllers\OnboardingController;
22 25 use FluentCart\App\Http\Controllers\OrderController;
@@ -26,14 +29,14 @@
26 29 use FluentCart\App\Http\Controllers\ProductVariationController;
27 30 use FluentCart\App\Http\Controllers\StorageController;
28 31 use FluentCart\App\Http\Controllers\SettingsController;
29 32 use FluentCart\App\Http\Controllers\CouponsController;
30 -use FluentCart\App\Http\Controllers\TaxClassController;
31 33 use FluentCart\App\Http\Controllers\TaxConfigurationController;
32 34 use FluentCart\App\Http\Controllers\TaxRateController;
33 35 use FluentCart\App\Http\Controllers\TemplateController;
34 36 use FluentCart\App\Http\Controllers\VariantController;
35 37 use FluentCart\App\Http\Controllers\WidgetsController;
38 +use FluentCart\App\Http\Controllers\ProductReviewController;
36 39 use FluentCart\App\Modules\PaymentMethods\PayPalGateway\ConnectConfig;
37 40 use FluentCart\Framework\Http\Router;
38 41 use \FluentCart\App\Http\Controllers\PaymentMethodController;
39 42 use \FluentCart\App\Http\Controllers\ActivityController;
@@ -49,8 +52,12 @@
49 52 $router->prefix('dashboard')->withPolicy('AdminPolicy')->group(function (Router $router) {
50 53 $router->get('/', [DashboardController::class, 'getOnboardingData']);
51 54 });
52 55
56 +$router->prefix('data-backfills')->withPolicy('AdminPolicy')->group(function (Router $router) {
57 + $router->post('/run', [DataBackfillController::class, 'run']);
58 +});
59 +
53 60 $router->prefix('dashboard')->withPolicy('DashboardPolicy')->group(function (Router $router) {
54 61 $router->get('/stats', [DashboardController::class, 'getDashboardStats'])->meta([
55 62 'permissions' => 'dashboard_stats/view'
56 63 ]);
@@ -165,8 +172,11 @@
165 172 ]);
166 173 $router->post('/{postId}/tax-class/remove', [ProductController::class, 'removeTaxClass'])->meta([
167 174 'permissions' => 'products/edit'
168 175 ]);
176 + $router->post('/{postId}/tax-exempt', [ProductController::class, 'toggleTaxExempt'])->meta([
177 + 'permissions' => 'products/edit'
178 + ]);
169 179
170 180 $router->post('/{postId}/shipping-class', [ProductController::class, 'updateShippingClass'])->meta([
171 181 'permissions' => 'products/edit'
172 182 ]);
@@ -232,11 +242,27 @@
232 242 $router->post('/variants', [ProductVariationController::class, 'create'])->meta([
233 243 'permissions' => 'products/create'
234 244 ]);
235 245
246 + // Advanced Variation — bulk price/stock/status edit for variant combinations.
247 + // Registered BEFORE the /variants/{variantId} routes so the first-match
248 + // router doesn't capture 'bulk-update' as a {variantId}.
249 + $router->post('/variants/bulk-update', [ProductVariationController::class, 'bulkUpdate'])->meta([
250 + 'permissions' => 'products/edit'
251 + ]);
252 +
253 + // Group bulk update — PATCH semantics: only non-null fields are written.
254 + // Registered BEFORE /variants/{variantId} to avoid the param capturing 'group-bulk-update'.
255 + $router->post('/variants/group-bulk-update', [ProductVariationController::class, 'groupBulkUpdate'])->meta([
256 + 'permissions' => 'products/edit'
257 + ]);
258 +
236 259 $router->post('/variants/{variantId}', [ProductVariationController::class, 'update'])->meta([
237 260 'permissions' => 'products/edit'
238 261 ]);
262 + $router->post('/variants/{variantId}/tax-exempt', [ProductVariationController::class, 'updateTaxSettings'])->meta([
263 + 'permissions' => 'products/edit'
264 + ]);
239 265
240 266 $router->delete('/variants/{variantId}', [ProductVariationController::class, 'delete'])->meta([
241 267 'permissions' => 'products/delete'
242 268 ]);
@@ -255,8 +281,54 @@
255 281 $router->get('/', [VariantController::class, 'index'])->meta([
256 282 'permissions' => 'products/view'
257 283 ]);
258 284 });
285 +
286 +// Advanced Variation — attribute library (groups + terms)
287 +$router->prefix('options')->withPolicy('ProductPolicy')->group(function (Router $router) {
288 + // Library endpoint — single payload powering the Advanced Variation library
289 + // picker (full group list with terms + the frequently-used IDs for chips).
290 + // Registered BEFORE 'attr/groups' to ensure the more-specific path wins.
291 + $router->get('attr/groups/library', [AttributesController::class, 'getLibrary'])->meta([
292 + 'permissions' => 'products/view'
293 + ]);
294 + $router->get('attr/groups', [AttributesController::class, 'getGroups'])->meta([
295 + 'permissions' => 'products/view'
296 + ]);
297 + // Plural 'attr/groups/reorder' doesn't collide with the singular
298 + // 'attr/group/{group_id}' routes below; kept here next to its list sibling.
299 + $router->post('attr/groups/reorder', [AttributesController::class, 'reorderGroups'])->meta([
300 + 'permissions' => 'products/edit'
301 + ]);
302 + $router->post('attr/group/', [AttributesController::class, 'createGroup'])->meta([
303 + 'permissions' => 'products/create'
304 + ]);
305 + $router->get('attr/group/{group_id}', [AttributesController::class, 'getGroup'])->meta([
306 + 'permissions' => 'products/view'
307 + ]);
308 + $router->put('attr/group/{group_id}', [AttributesController::class, 'updateGroup'])->meta([
309 + 'permissions' => 'products/edit'
310 + ]);
311 + $router->delete('attr/group/{group_id}', [AttributesController::class, 'deleteGroup'])->meta([
312 + 'permissions' => 'products/delete'
313 + ]);
314 + $router->get('attr/group/{group_id}/terms', [AttributesController::class, 'getTerms'])->meta([
315 + 'permissions' => 'products/view'
316 + ]);
317 + $router->post('attr/group/{group_id}/terms', [AttributesController::class, 'createTerms'])->meta([
318 + 'permissions' => 'products/create'
319 + ]);
320 + $router->post('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'updateTerm'])->meta([
321 + 'permissions' => 'products/edit'
322 + ]);
323 + $router->delete('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'deleteTerm'])->meta([
324 + 'permissions' => 'products/delete'
325 + ]);
326 + $router->post('attr/group/{group_id}/terms/reorder', [AttributesController::class, 'reorderTerms'])->meta([
327 + 'permissions' => 'products/edit'
328 + ]);
329 +});
330 +
259 331 //Integration route declaration
260 332 $router->prefix('integration')->withPolicy('IntegrationPolicy')->group(function (Router $router) {
261 333
262 334 $router->get('addons', [AddonsController::class, 'getAddons'])->meta([
@@ -406,9 +478,23 @@
406 478 $router->post('modules', [ModuleSettingsController::class, 'saveSettings'])->meta([
407 479 'permissions' => 'is_super_admin'
408 480 ]);
409 481
482 + // MCP (Features & addon → MCP card): status, on/off toggle, connection snippet.
483 + $router->get('mcp', [McpSettingsController::class, 'status'])->meta([
484 + 'permissions' => 'is_super_admin'
485 + ]);
486 + $router->post('mcp/toggle', [McpSettingsController::class, 'toggle'])->meta([
487 + 'permissions' => 'is_super_admin'
488 + ]);
489 + $router->post('mcp/install-adapter', [McpSettingsController::class, 'installAdapter'])->meta([
490 + 'permissions' => 'is_super_admin'
491 + ]);
492 + $router->get('mcp/config-snippets', [McpSettingsController::class, 'getConfigSnippets'])->meta([
493 + 'permissions' => 'is_super_admin'
494 + ]);
410 495
496 +
411 497 $router->post('confirmation', [SettingsController::class, 'saveConfirmation'])->meta([
412 498 'permissions' => 'is_super_admin'
413 499 ]);
414 500 //shortcode get
@@ -456,14 +542,21 @@
456 542 $router->post('/calculate-shipping', [OrderController::class, 'updateShipping'])->meta([
457 543 'permissions' => ['orders/create', 'orders/manage']
458 544 ]);
459 545
546 + // Public utility: pure tax calculation, no DB writes. No longer called by the admin Vue
547 + // (tax is now auto-applied server-side on save). Available for third-party integrations.
548 + $router->post('/calculate-tax', [OrderController::class, 'calculateTax'])->meta([
549 + 'permissions' => ['orders/create', 'orders/manage'],
550 + 'permissions_type' => 'any',
551 + ]);
552 +
460 553 $router->post('/', [OrderController::class, 'store'])->meta([
461 554 'permissions' => 'orders/create'
462 555 ]);
463 556
464 557 $router->post('/do-bulk-action', [OrderController::class, 'handleBulkActions'])->meta([
465 - 'permissions' => 'orders/manage'
558 + 'permissions' => 'orders/delete' // every accepted action deletes orders — same gate as DELETE /{order_id}
466 559 ]);
467 560
468 561 $router->post('/{order}/mark-as-paid', [OrderController::class, 'markAsPaid'])->meta([
469 562 'permissions' => 'orders/manage'
@@ -518,11 +611,13 @@
518 611 $router->post('/{order}/transactions/{transaction_id}/accept-dispute/', [OrderController::class, 'acceptDispute'])->meta([
519 612 'permissions' => 'orders/manage'
520 613 ]);
521 614
522 - $router->get('/{id}/transactions/{transaction_id}', [OrderController::class, 'getDetails'])->meta([
523 - 'permissions' => 'orders/view'
524 - ]);
615 + $router->get('/{id}/transactions/{transaction_id}', [OrderController::class, 'getTransactionDetails'])
616 + ->int('id', 'transaction_id')
617 + ->meta([
618 + 'permissions' => 'orders/view'
619 + ]);
525 620
526 621 $router->put('/{order}/address/{id}', [OrderController::class, 'updateOrderAddress'])->meta([
527 622 'permissions' => 'orders/manage'
528 623 ]);
@@ -530,8 +625,12 @@
530 625 $router->put('/{order}/transactions/{transaction}/status', [OrderController::class, 'updateTransactionStatus'])->meta([
531 626 'permissions' => 'orders/manage'
532 627 ]);
533 628
629 + $router->post('/{order}/transactions/{transaction}/sync', [OrderController::class, 'syncPendingTransaction'])->meta([
630 + 'permissions' => 'orders/manage'
631 + ]);
632 +
534 633 $router->post('/{order}/create-custom', [OrderController::class, 'createCustom'])->int('id')->meta([
535 634 'permissions' => 'orders/create'
536 635 ]);
537 636
@@ -544,9 +643,26 @@
544 643 ]);
545 644
546 645 });
547 646
647 +$router->prefix('renewals')->withPolicy('OrderPolicy')->group(function (Router $router) {
648 + $router->get('/', [RenewalController::class, 'index'])->meta([
649 + 'permissions' => 'orders/view'
650 + ]);
548 651
652 + $router->get('/{id}', [RenewalController::class, 'show'])->int('id')->meta([
653 + 'permissions' => 'orders/view'
654 + ]);
655 +
656 + $router->post('/{order}/void', [RenewalController::class, 'void'])->meta([
657 + 'permissions' => 'orders/manage'
658 + ]);
659 +
660 + $router->post('/{order}/resend', [RenewalController::class, 'resend'])->meta([
661 + 'permissions' => 'orders/manage'
662 + ]);
663 +});
664 +
549 665 $router->prefix('labels')->withPolicy('LabelPolicy')->group(function (Router $router) {
550 666 $router->get('/', [LabelController::class, 'index'])->meta([
551 667 'permissions' => 'labels/view'
552 668 ]);
@@ -633,56 +749,15 @@
633 749
634 750 });
635 751
636 752
637 -$router->prefix('options')->withPolicy('ProductPolicy')->group(function (Router $router) {
638 - $router->get('attr/groups', [AttributesController::class, 'getGroups'])->meta([
639 - 'permissions' => 'products/view'
640 - ]);
641 753
642 - $router->post('attr/group/', [AttributesController::class, 'createGroup'])->meta([
643 - 'permissions' => 'products/create'
644 - ]);
645 -
646 - $router->get('attr/group/{group_id}', [AttributesController::class, 'getGroup'])->meta([
647 - 'permissions' => 'products/view'
648 - ]);
649 -
650 - $router->put('attr/group/{group_id}', [AttributesController::class, 'updateGroup'])->meta([
651 - 'permissions' => 'products/edit'
652 - ]);
653 -
654 - $router->delete('attr/group/{group_id}', [AttributesController::class, 'deleteGroup'])->meta([
655 - 'permissions' => 'products/delete'
656 - ]);
657 -
658 - $router->get('attr/group/{group_id}/terms', [AttributesController::class, 'getTerms'])->meta([
659 - 'permissions' => 'products/view'
660 - ]);
661 -
662 - $router->post('attr/group/{group_id}/term', [AttributesController::class, 'createTerm'])->meta([
663 - 'permissions' => 'products/create'
664 - ]);
665 -
666 - $router->post('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'updateTerm'])->meta([
667 - 'permissions' => 'products/edit'
668 - ]);
669 -
670 - $router->delete('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'deleteTerm'])->meta([
671 - 'permissions' => 'products/delete'
672 - ]);
673 -
674 - $router->post('attr/group/{group_id}/term/{term_id}/serial', [AttributesController::class, 'changeTermSerial'])->meta([
675 - 'permissions' => 'products/edit'
676 - ]);
677 -});
678 -
679 -
680 754 $router->prefix('onboarding')->withPolicy('AdminPolicy')->group(function (Router $router) {
681 755 $router->get('/', [OnboardingController::class, 'index']);
682 756 $router->post('/', [OnboardingController::class, 'saveSettings']);
683 757 $router->post('/create-pages', [OnboardingController::class, 'createPages']);
684 758 $router->post('/create-page', [OnboardingController::class, 'createPage']);
759 + $router->post('/save-tax', [OnboardingController::class, 'saveTaxSettings']);
685 760 });
686 761 $router->prefix('email-notification')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) {
687 762 $router->get('/', [EmailNotificationController::class, 'index']);
688 763 $router->get('/get-short-codes', [EmailNotificationController::class, 'getShortCodes']);
@@ -689,8 +764,11 @@
689 764 $router->get('/get-settings', [EmailNotificationController::class, 'getSettings']);
690 765 $router->post('/save-settings', [EmailNotificationController::class, 'saveSettings']);
691 766 $router->get('/reminders', [EmailNotificationController::class, 'getSchedulingSettings']);
692 767 $router->post('/reminders', [EmailNotificationController::class, 'saveSchedulingSettings']);
768 + $router->get('/digest-settings', [EmailNotificationController::class, 'getDigestSettings']);
769 + $router->post('/digest-settings', [EmailNotificationController::class, 'saveDigestSettings']);
770 + $router->post('/digest-settings/send-test', [EmailNotificationController::class, 'sendDigestTest']);
693 771 $router->post('/enable-notification/{name}', [EmailNotificationController::class, 'enableNotification']);
694 772 $router->post('/send-manual-reminder', [EmailNotificationController::class, 'sendManualReminder']);
695 773 $router->post('/preview-default-template', [EmailNotificationController::class, 'previewDefaultTemplate']);
696 774 $router->get('/{notification}', [EmailNotificationController::class, 'find']);
@@ -756,10 +834,10 @@
756 834 });
757 835
758 836 $router->post('/upload-editor-file', [FileUploadController::class, 'uploadEditorFile'])->withPolicy('AdminPolicy');
759 837
760 -$router->prefix('notes')->withPolicy('AdminPolicy')->group(function (Router $router) {
761 - $router->post('/attach', [NotesController::class, 'attach']);
838 +$router->prefix('notes')->withPolicy('OrderPolicy')->group(function (Router $router) {
839 + $router->post('/attach', [NotesController::class, 'attach'])->meta(['permissions' => 'orders/manage']);
762 840 });
763 841
764 842 $router->prefix('app')->withPolicy('AdminPolicy')->group(function (Router $router) {
765 843 $router->get('init', [AppController::class, 'init']);
@@ -809,42 +887,129 @@
809 887 });
810 888
811 889
812 890 // Tax Routes
813 -$router->prefix('tax')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) {
814 - // TaxClasses routes
815 - $router->get('classes', [TaxClassController::class, 'index']);
816 - $router->post('classes', [TaxClassController::class, 'store']);
817 - $router->put('classes/{id}', [TaxClassController::class, 'update'])->int('id');
818 - $router->delete('classes/{id}', [TaxClassController::class, 'delete'])->int('id');
891 +$router->prefix('tax')->withPolicy('StoreSettingsPolicy')->group(function (Router $router) {
892 + // TaxClass routes
893 + $router->get('classes', [TaxRateController::class, 'getClasses'])->meta([
894 + 'permissions' => 'store/settings'
895 + ]);
896 + $router->post('classes', [TaxRateController::class, 'createClass'])->meta([
897 + 'permissions' => 'store/sensitive'
898 + ]);
899 + $router->delete('classes/{id}', [TaxRateController::class, 'deleteClass'])->int('id')->meta([
900 + 'permissions' => 'store/sensitive'
901 + ]);
819 902
820 903 // TaxRates routes
821 - $router->get('rates', [TaxRateController::class, 'index']);
822 - $router->get('rates/country/rates/{country_code}', [TaxRateController::class, 'show']);
823 - $router->post('rates/country/override', [TaxRateController::class, 'saveShippingOverride']);
824 - $router->delete('rates/country/override/{id}', [TaxRateController::class, 'deleteShippingOverride'])->int('id');
825 - $router->put('country/rate/{id}', [TaxRateController::class, 'update'])->int('id');
826 - $router->post('country/rate', [TaxRateController::class, 'store']);
827 - $router->delete('country/rate/{id}', [TaxRateController::class, 'delete'])->int('id');
828 - $router->delete('country/{country_code}', [TaxRateController::class, 'deleteCountry']);
829 - $router->get('country-tax-id/{country_code}', [TaxRateController::class, 'getCountryTaxId']);
830 - $router->post('country-tax-id/{country_code}', [TaxRateController::class, 'saveCountryTaxId']);
904 + $router->get('rates', [TaxRateController::class, 'index'])->meta([
905 + 'permissions' => 'store/settings'
906 + ]);
907 + $router->get('rates/country/rates/{country_code}', [TaxRateController::class, 'show'])->meta([
908 + 'permissions' => 'store/settings'
909 + ]);
910 + $router->post('rates/country/override', [TaxRateController::class, 'saveShippingOverride'])->meta([
911 + 'permissions' => 'store/sensitive'
912 + ]);
913 + $router->delete('rates/country/override/{id}', [TaxRateController::class, 'deleteShippingOverride'])->int('id')->meta([
914 + 'permissions' => 'store/sensitive'
915 + ]);
916 + $router->put('country/rate/{id}', [TaxRateController::class, 'update'])->int('id')->meta([
917 + 'permissions' => 'store/sensitive'
918 + ]);
919 + $router->post('country/rate', [TaxRateController::class, 'store'])->meta([
920 + 'permissions' => 'store/sensitive'
921 + ]);
922 + $router->delete('country/rate/{id}', [TaxRateController::class, 'delete'])->int('id')->meta([
923 + 'permissions' => 'store/sensitive'
924 + ]);
925 + $router->post('country-status/{country_code}', [TaxRateController::class, 'updateCountryStatus'])->meta([
926 + 'permissions' => 'store/sensitive'
927 + ]);
928 + $router->get('country-tax-id/{country_code}', [TaxRateController::class, 'getCountryTaxId'])->meta([
929 + 'permissions' => 'store/settings'
930 + ]);
931 + $router->post('country-tax-id/{country_code}', [TaxRateController::class, 'saveCountryTaxId'])->meta([
932 + 'permissions' => 'store/sensitive'
933 + ]);
831 934
935 + // Product category tax overrides
936 + $router->get('product-overrides/{country_code}', [TaxRateController::class, 'getProductOverrides'])->meta([
937 + 'permissions' => 'store/settings'
938 + ]);
939 + $router->post('product-overrides', [TaxRateController::class, 'saveProductOverride'])->meta([
940 + 'permissions' => 'store/sensitive'
941 + ]);
942 + $router->delete('product-overrides/{id}', [TaxRateController::class, 'deleteProductOverride'])->int('id')->meta([
943 + 'permissions' => 'store/sensitive'
944 + ]);
945 +
832 946 // $router->post('rates/country', [TaxRateController::class, 'addCountry']);
833 947
834 948 // TaxConfiguration routes
835 - $router->get('configuration/rates', [TaxConfigurationController::class, 'getTaxRates']);
836 - $router->post('configuration/countries', [TaxConfigurationController::class, 'saveConfiguredCountries']);
837 - $router->get('configuration/settings', [TaxConfigurationController::class, 'getSettings']);
838 - $router->post('configuration/settings', [TaxConfigurationController::class, 'saveSettings']);
839 - $router->post('configuration/settings/eu-vat', [TaxEUController::class, 'saveEuVatSettings']);
840 - $router->get('configuration/settings/eu-vat/rates', [TaxEUController::class, 'getEuTaxRates']);
841 - $router->post('configuration/settings/eu-vat/oss/override', [TaxEUController::class, 'saveOssTaxOverride']);
842 - $router->post('configuration/settings/eu-vat/oss/shipping-override', [TaxEUController::class, 'saveOssShippingOverride']);
843 - $router->delete('configuration/settings/eu-vat/oss/override', [TaxEUController::class, 'deleteOssTaxOverride'])->int('id');
844 - $router->delete('configuration/settings/eu-vat/oss/shipping-override', [TaxEUController::class, 'deleteOssShippingOverride'])->int('id');
949 + $router->get('configuration/rates', [TaxConfigurationController::class, 'getTaxRates'])->meta([
950 + 'permissions' => 'store/settings'
951 + ]);
952 + $router->post('configuration/countries', [TaxConfigurationController::class, 'saveConfiguredCountries'])->meta([
953 + 'permissions' => 'store/sensitive'
954 + ]);
955 + $router->get('configuration/settings', [TaxConfigurationController::class, 'getSettings'])->meta([
956 + 'permissions' => 'store/settings'
957 + ]);
958 + $router->post('configuration/settings', [TaxConfigurationController::class, 'saveSettings'])->meta([
959 + 'permissions' => 'store/sensitive'
960 + ]);
961 + $router->post('configuration/settings/eu-vat', [TaxEUController::class, 'saveEuVatSettings'])->meta([
962 + 'permissions' => 'store/sensitive'
963 + ]);
964 + $router->post('configuration/settings/eu-vat/reset-rates', [TaxEUController::class, 'resetEuRatesToDefaults'])->meta([
965 + 'permissions' => 'store/sensitive'
966 + ]);
967 + $router->get('configuration/settings/eu-vat/product-overrides', [TaxEUController::class, 'getEuProductOverrides'])->meta([
968 + 'permissions' => 'store/settings'
969 + ]);
970 + $router->get('configuration/settings/eu-vat/oss-rates', [TaxEUController::class, 'getOssCountryRates'])->meta([
971 + 'permissions' => 'store/settings'
972 + ]);
973 + $router->post('configuration/settings/eu-vat/oss-rates', [TaxEUController::class, 'saveOssCountryRates'])->meta([
974 + 'permissions' => 'store/sensitive'
975 + ]);
845 976 });
846 977
847 978 $router->prefix('checkout-fields')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) {
848 979 $router->get('get-fields', [CheckoutFieldsController::class, 'getFields']);
849 980 $router->post('save-fields', [CheckoutFieldsController::class, 'saveFields']);
981 +});
982 +
983 +// Product Reviews routes
984 +$router->prefix('reviews')->withPolicy('ReviewPolicy')->group(function (Router $router) {
985 + $router->get('/', [ProductReviewController::class, 'index'])->meta([
986 + 'permissions' => 'reviews/manage'
987 + ]);
988 + $router->get('/stats', [ProductReviewController::class, 'stats'])->meta([
989 + 'permissions' => 'reviews/manage'
990 + ]);
991 + $router->get('/{id}', [ProductReviewController::class, 'find'])->int('id')->meta([
992 + 'permissions' => 'reviews/manage'
993 + ]);
994 + $router->put('/{id}', [ProductReviewController::class, 'update'])->int('id')->meta([
995 + 'permissions' => 'reviews/manage'
996 + ]);
997 + $router->delete('/{id}', [ProductReviewController::class, 'delete'])->int('id')->meta([
998 + 'permissions' => 'reviews/manage'
999 + ]);
1000 + $router->post('/bulk-action', [ProductReviewController::class, 'bulkAction'])->meta([
1001 + 'permissions' => 'reviews/manage'
1002 + ]);
1003 + $router->post('/{id}/reply', [ProductReviewController::class, 'reply'])->int('id')->meta([
1004 + 'permissions' => 'reviews/manage'
1005 + ]);
1006 + $router->delete('/{reviewId}/replies/{replyId}', [ProductReviewController::class, 'deleteReply'])->int('reviewId')->int('replyId')->meta([
1007 + 'permissions' => 'reviews/manage'
1008 + ]);
1009 + $router->post('/bulk-reply', [ProductReviewController::class, 'bulkReply'])->meta([
1010 + 'permissions' => 'reviews/manage'
1011 + ]);
1012 + $router->post('/', [ProductReviewController::class, 'create'])->meta([
1013 + 'permissions' => 'reviews/manage'
1014 + ]);
850 1015 });