| @@ -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 | }); |