| @@ -11,11 +11,13 @@ | ||
| 11 | 11 | use FluentCart\App\Http\Controllers\AppControllers\AppController; |
| 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; |
| 19 | 21 | use FluentCart\App\Http\Controllers\McpSettingsController; |
| 20 | 22 | use FluentCart\App\Http\Controllers\ModuleSettingsController; |
| 21 | 23 | use FluentCart\App\Http\Controllers\NotesController; |
| @@ -32,8 +34,9 @@ | ||
| 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 | ]); |
| @@ -547,9 +554,9 @@ | ||
| 547 | 554 | 'permissions' => 'orders/create' |
| 548 | 555 | ]); |
| 549 | 556 | |
| 550 | 557 | $router->post('/do-bulk-action', [OrderController::class, 'handleBulkActions'])->meta([ |
| 551 | - 'permissions' => 'orders/manage' | |
| 558 | + 'permissions' => 'orders/delete' // every accepted action deletes orders — same gate as DELETE /{order_id} | |
| 552 | 559 | ]); |
| 553 | 560 | |
| 554 | 561 | $router->post('/{order}/mark-as-paid', [OrderController::class, 'markAsPaid'])->meta([ |
| 555 | 562 | 'permissions' => 'orders/manage' |
| @@ -604,11 +611,13 @@ | ||
| 604 | 611 | $router->post('/{order}/transactions/{transaction_id}/accept-dispute/', [OrderController::class, 'acceptDispute'])->meta([ |
| 605 | 612 | 'permissions' => 'orders/manage' |
| 606 | 613 | ]); |
| 607 | 614 | |
| 608 | - $router->get('/{id}/transactions/{transaction_id}', [OrderController::class, 'getDetails'])->meta([ | |
| 609 | - 'permissions' => 'orders/view' | |
| 610 | - ]); | |
| 615 | + $router->get('/{id}/transactions/{transaction_id}', [OrderController::class, 'getTransactionDetails']) | |
| 616 | + ->int('id', 'transaction_id') | |
| 617 | + ->meta([ | |
| 618 | + 'permissions' => 'orders/view' | |
| 619 | + ]); | |
| 611 | 620 | |
| 612 | 621 | $router->put('/{order}/address/{id}', [OrderController::class, 'updateOrderAddress'])->meta([ |
| 613 | 622 | 'permissions' => 'orders/manage' |
| 614 | 623 | ]); |
| @@ -616,8 +625,12 @@ | ||
| 616 | 625 | $router->put('/{order}/transactions/{transaction}/status', [OrderController::class, 'updateTransactionStatus'])->meta([ |
| 617 | 626 | 'permissions' => 'orders/manage' |
| 618 | 627 | ]); |
| 619 | 628 | |
| 629 | + $router->post('/{order}/transactions/{transaction}/sync', [OrderController::class, 'syncPendingTransaction'])->meta([ | |
| 630 | + 'permissions' => 'orders/manage' | |
| 631 | + ]); | |
| 632 | + | |
| 620 | 633 | $router->post('/{order}/create-custom', [OrderController::class, 'createCustom'])->int('id')->meta([ |
| 621 | 634 | 'permissions' => 'orders/create' |
| 622 | 635 | ]); |
| 623 | 636 | |
| @@ -630,9 +643,26 @@ | ||
| 630 | 643 | ]); |
| 631 | 644 | |
| 632 | 645 | }); |
| 633 | 646 | |
| 647 | +$router->prefix('renewals')->withPolicy('OrderPolicy')->group(function (Router $router) { | |
| 648 | + $router->get('/', [RenewalController::class, 'index'])->meta([ | |
| 649 | + 'permissions' => 'orders/view' | |
| 650 | + ]); | |
| 634 | 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 | + | |
| 635 | 665 | $router->prefix('labels')->withPolicy('LabelPolicy')->group(function (Router $router) { |
| 636 | 666 | $router->get('/', [LabelController::class, 'index'])->meta([ |
| 637 | 667 | 'permissions' => 'labels/view' |
| 638 | 668 | ]); |
| @@ -804,10 +834,10 @@ | ||
| 804 | 834 | }); |
| 805 | 835 | |
| 806 | 836 | $router->post('/upload-editor-file', [FileUploadController::class, 'uploadEditorFile'])->withPolicy('AdminPolicy'); |
| 807 | 837 | |
| 808 | -$router->prefix('notes')->withPolicy('AdminPolicy')->group(function (Router $router) { | |
| 809 | - $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']); | |
| 810 | 840 | }); |
| 811 | 841 | |
| 812 | 842 | $router->prefix('app')->withPolicy('AdminPolicy')->group(function (Router $router) { |
| 813 | 843 | $router->get('init', [AppController::class, 'init']); |
| @@ -891,11 +921,8 @@ | ||
| 891 | 921 | ]); |
| 892 | 922 | $router->delete('country/rate/{id}', [TaxRateController::class, 'delete'])->int('id')->meta([ |
| 893 | 923 | 'permissions' => 'store/sensitive' |
| 894 | 924 | ]); |
| 895 | - $router->delete('country/{country_code}', [TaxRateController::class, 'deleteCountry'])->meta([ | |
| 896 | - 'permissions' => 'store/sensitive' | |
| 897 | - ]); | |
| 898 | 925 | $router->post('country-status/{country_code}', [TaxRateController::class, 'updateCountryStatus'])->meta([ |
| 899 | 926 | 'permissions' => 'store/sensitive' |
| 900 | 927 | ]); |
| 901 | 928 | $router->get('country-tax-id/{country_code}', [TaxRateController::class, 'getCountryTaxId'])->meta([ |
| @@ -950,5 +977,39 @@ | ||
| 950 | 977 | |
| 951 | 978 | $router->prefix('checkout-fields')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) { |
| 952 | 979 | $router->get('get-fields', [CheckoutFieldsController::class, 'getFields']); |
| 953 | 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 | + ]); | |
| 954 | 1015 | }); |