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