productService = $productService; $this->categoryService = $categoryService; // Inject category service into product service $this->productService->setCategoryService($categoryService); } /** * Show the products page */ public function index() { $m1Products = $this->productService->getMagento1Products(); $m2Products = $this->productService->getMagento2Products(); $m1ProductsNotInM2 = $this->productService->getM1ProductsNotInM2(); $m2ProductsNotInM1 = $this->productService->getM2ProductsNotInM1(); return view('products.index', [ 'm1Products' => $m1Products, 'm2Products' => $m2Products, 'm1ProductsNotInM2' => $m1ProductsNotInM2, 'm2ProductsNotInM1' => $m2ProductsNotInM1, ]); } /** * Migrate all products from Magento 1 to Magento 2 */ public function migrateProducts(Request $request) { try { $dryRun = $request->input('dry_run', false); // Get progress key from request or generate one (only for non-dry-run) $progressKey = $request->input('progress_key'); if (!$dryRun && !$progressKey) { $progressKey = 'product_migration_progress_' . uniqid(); } $result = $this->productService->migrateProducts($dryRun, $progressKey); // Add progress key to result if ($progressKey) { $result['progress_key'] = $progressKey; } return response()->json($result, $result['success'] ? 200 : 400); } catch (\Exception $e) { Log::error('Product migration error: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Migration failed: ' . $e->getMessage(), 'added' => 0, 'updated' => 0, 'errors' => 0, 'log' => [], 'missing_attributes' => [] ], 500); } } /** * Delete a single product from Magento 2 */ public function deleteM2Product(Request $request, $productId) { try { $result = $this->productService->deleteM2Product($productId); return response()->json($result, $result['success'] ? 200 : 400); } catch (\Exception $e) { Log::error('Delete M2 product error: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Deletion failed: ' . $e->getMessage() ], 500); } } /** * Sync product category assignments from M1 to M2 */ public function syncProductCategories(Request $request) { try { $result = $this->productService->syncProductCategories(); return response()->json($result, $result['success'] ? 200 : 400); } catch (\Exception $e) { Log::error('Sync product categories error: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Sync failed: ' . $e->getMessage(), 'updated' => 0, 'skipped' => 0, 'errors' => 0, 'log' => [] ], 500); } } /** * Delete all products in Magento 2 that have entity_id greater than max M1 product ID */ public function deleteM2ProductsAboveM1Max(Request $request) { try { $result = $this->productService->deleteM2ProductsAboveM1Max(); return response()->json($result, $result['success'] ? 200 : 400); } catch (\Exception $e) { Log::error('Delete M2 products error: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Deletion failed: ' . $e->getMessage(), 'deleted' => 0 ], 500); } } /** * Fix category products - ensure products are added to categories if missing from catalog_category_product table */ public function fixCategoryProducts(Request $request) { try { $result = $this->productService->fixCategoryProducts(); return response()->json($result, $result['success'] ? 200 : 400); } catch (\Exception $e) { Log::error('Fix category products error: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Fix failed: ' . $e->getMessage(), 'added' => 0, 'skipped' => 0, 'errors' => 0, 'log' => [] ], 500); } } /** * Migrate product options from M1 mageworx_custom_option_ tables to M2 mageworx_optiontemplates_ tables */ public function migrateProductOptions(Request $request) { try { $dryRun = $request->input('dry_run', false); $result = $this->productService->migrateProductOptions($dryRun); return response()->json($result, $result['success'] ? 200 : 400); } catch (\Exception $e) { Log::error('Product options migration error: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Migration failed: ' . $e->getMessage(), 'migrated' => 0, 'skipped' => 0, 'errors' => 0, 'log' => [] ], 500); } } /** * Compare M1 and M2 product values by SKU */ public function compareProductBySku(Request $request) { try { $sku = $request->input('sku'); if (empty($sku)) { return response()->json([ 'success' => false, 'message' => 'SKU is required', 'changes' => [] ], 400); } $result = $this->productService->compareProductBySku($sku); return response()->json($result, $result['success'] ? 200 : 400); } catch (\Exception $e) { Log::error('Product comparison error: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Comparison failed: ' . $e->getMessage(), 'changes' => [] ], 500); } } /** * Get migration progress */ public function getMigrationProgress(Request $request) { try { $progressKey = $request->input('progress_key'); if (empty($progressKey)) { return response()->json([ 'success' => false, 'message' => 'Progress key is required' ], 400); } $progress = Cache::get($progressKey); if (!$progress) { return response()->json([ 'success' => false, 'message' => 'Progress not found', 'progress' => null ], 404); } return response()->json([ 'success' => true, 'progress' => $progress ]); } catch (\Exception $e) { Log::error('Get migration progress error: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Failed to get progress: ' . $e->getMessage() ], 500); } } }