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 +130 -49 1.4.0 → 1.7.0 View file →
@@ -6,16 +6,18 @@
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;
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 ]);
@@ -235,8 +242,21 @@
235 242 $router->post('/variants', [ProductVariationController::class, 'create'])->meta([
236 243 'permissions' => 'products/create'
237 244 ]);
238 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 +
239 259 $router->post('/variants/{variantId}', [ProductVariationController::class, 'update'])->meta([
240 260 'permissions' => 'products/edit'
241 261 ]);
242 262 $router->post('/variants/{variantId}/tax-exempt', [ProductVariationController::class, 'updateTaxSettings'])->meta([
@@ -261,8 +281,54 @@
261 281 $router->get('/', [VariantController::class, 'index'])->meta([
262 282 'permissions' => 'products/view'
263 283 ]);
264 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 +
265 331 //Integration route declaration
266 332 $router->prefix('integration')->withPolicy('IntegrationPolicy')->group(function (Router $router) {
267 333
268 334 $router->get('addons', [AddonsController::class, 'getAddons'])->meta([
@@ -488,9 +554,9 @@
488 554 'permissions' => 'orders/create'
489 555 ]);
490 556
491 557 $router->post('/do-bulk-action', [OrderController::class, 'handleBulkActions'])->meta([
492 - 'permissions' => 'orders/manage'
558 + 'permissions' => 'orders/delete' // every accepted action deletes orders — same gate as DELETE /{order_id}
493 559 ]);
494 560
495 561 $router->post('/{order}/mark-as-paid', [OrderController::class, 'markAsPaid'])->meta([
496 562 'permissions' => 'orders/manage'
@@ -545,11 +611,13 @@
545 611 $router->post('/{order}/transactions/{transaction_id}/accept-dispute/', [OrderController::class, 'acceptDispute'])->meta([
546 612 'permissions' => 'orders/manage'
547 613 ]);
548 614
549 - $router->get('/{id}/transactions/{transaction_id}', [OrderController::class, 'getDetails'])->meta([
550 - 'permissions' => 'orders/view'
551 - ]);
615 + $router->get('/{id}/transactions/{transaction_id}', [OrderController::class, 'getTransactionDetails'])
616 + ->int('id', 'transaction_id')
617 + ->meta([
618 + 'permissions' => 'orders/view'
619 + ]);
552 620
553 621 $router->put('/{order}/address/{id}', [OrderController::class, 'updateOrderAddress'])->meta([
554 622 'permissions' => 'orders/manage'
555 623 ]);
@@ -557,8 +625,12 @@
557 625 $router->put('/{order}/transactions/{transaction}/status', [OrderController::class, 'updateTransactionStatus'])->meta([
558 626 'permissions' => 'orders/manage'
559 627 ]);
560 628
629 + $router->post('/{order}/transactions/{transaction}/sync', [OrderController::class, 'syncPendingTransaction'])->meta([
630 + 'permissions' => 'orders/manage'
631 + ]);
632 +
561 633 $router->post('/{order}/create-custom', [OrderController::class, 'createCustom'])->int('id')->meta([
562 634 'permissions' => 'orders/create'
563 635 ]);
564 636
@@ -571,9 +643,26 @@
571 643 ]);
572 644
573 645 });
574 646
647 +$router->prefix('renewals')->withPolicy('OrderPolicy')->group(function (Router $router) {
648 + $router->get('/', [RenewalController::class, 'index'])->meta([
649 + 'permissions' => 'orders/view'
650 + ]);
575 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 +
576 665 $router->prefix('labels')->withPolicy('LabelPolicy')->group(function (Router $router) {
577 666 $router->get('/', [LabelController::class, 'index'])->meta([
578 667 'permissions' => 'labels/view'
579 668 ]);
@@ -660,51 +749,9 @@
660 749
661 750 });
662 751
663 752
664 -$router->prefix('options')->withPolicy('ProductPolicy')->group(function (Router $router) {
665 - $router->get('attr/groups', [AttributesController::class, 'getGroups'])->meta([
666 - 'permissions' => 'products/view'
667 - ]);
668 753
669 - $router->post('attr/group/', [AttributesController::class, 'createGroup'])->meta([
670 - 'permissions' => 'products/create'
671 - ]);
672 -
673 - $router->get('attr/group/{group_id}', [AttributesController::class, 'getGroup'])->meta([
674 - 'permissions' => 'products/view'
675 - ]);
676 -
677 - $router->put('attr/group/{group_id}', [AttributesController::class, 'updateGroup'])->meta([
678 - 'permissions' => 'products/edit'
679 - ]);
680 -
681 - $router->delete('attr/group/{group_id}', [AttributesController::class, 'deleteGroup'])->meta([
682 - 'permissions' => 'products/delete'
683 - ]);
684 -
685 - $router->get('attr/group/{group_id}/terms', [AttributesController::class, 'getTerms'])->meta([
686 - 'permissions' => 'products/view'
687 - ]);
688 -
689 - $router->post('attr/group/{group_id}/term', [AttributesController::class, 'createTerm'])->meta([
690 - 'permissions' => 'products/create'
691 - ]);
692 -
693 - $router->post('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'updateTerm'])->meta([
694 - 'permissions' => 'products/edit'
695 - ]);
696 -
697 - $router->delete('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'deleteTerm'])->meta([
698 - 'permissions' => 'products/delete'
699 - ]);
700 -
701 - $router->post('attr/group/{group_id}/term/{term_id}/serial', [AttributesController::class, 'changeTermSerial'])->meta([
702 - 'permissions' => 'products/edit'
703 - ]);
704 -});
705 -
706 -
707 754 $router->prefix('onboarding')->withPolicy('AdminPolicy')->group(function (Router $router) {
708 755 $router->get('/', [OnboardingController::class, 'index']);
709 756 $router->post('/', [OnboardingController::class, 'saveSettings']);
710 757 $router->post('/create-pages', [OnboardingController::class, 'createPages']);
@@ -787,10 +834,10 @@
787 834 });
788 835
789 836 $router->post('/upload-editor-file', [FileUploadController::class, 'uploadEditorFile'])->withPolicy('AdminPolicy');
790 837
791 -$router->prefix('notes')->withPolicy('AdminPolicy')->group(function (Router $router) {
792 - $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']);
793 840 });
794 841
795 842 $router->prefix('app')->withPolicy('AdminPolicy')->group(function (Router $router) {
796 843 $router->get('init', [AppController::class, 'init']);
@@ -930,5 +977,39 @@
930 977
931 978 $router->prefix('checkout-fields')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) {
932 979 $router->get('get-fields', [CheckoutFieldsController::class, 'getFields']);
933 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 + ]);
934 1015 });