diff --git a/backend/src/main/java/com/rit/canteen/sales/controller/ProductController.java b/backend/src/main/java/com/rit/canteen/sales/controller/ProductController.java index 4596d822..68a74bcf 100644 --- a/backend/src/main/java/com/rit/canteen/sales/controller/ProductController.java +++ b/backend/src/main/java/com/rit/canteen/sales/controller/ProductController.java @@ -16,6 +16,9 @@ public class ProductController { @Autowired private ProductRepository productRepository; + @Autowired + private com.rit.canteen.sales.repository.StallRepository stallRepository; + @GetMapping public org.springframework.data.domain.Page getAllProducts( @RequestParam(required = false) String search, @@ -35,11 +38,15 @@ public class ProductController { } @PostMapping + @org.springframework.transaction.annotation.Transactional public Product createProduct(@Valid @RequestBody Product product) { - return productRepository.save(product); + Product savedProduct = productRepository.save(product); + updateStallAssociations(savedProduct, product.getStalls()); + return productRepository.findById(savedProduct.getId()).orElse(savedProduct); } @PutMapping("/{id}") + @org.springframework.transaction.annotation.Transactional public ResponseEntity updateProduct(@PathVariable Long id, @Valid @RequestBody Product productDetails) { return productRepository.findById(id) .map(product -> { @@ -70,11 +77,40 @@ public class ProductController { product.setImageData(productDetails.getImageData()); product.setActive(productDetails.isActive()); product.setStock(productDetails.getStock()); - return ResponseEntity.ok(productRepository.save(product)); + + Product updated = productRepository.save(product); + updateStallAssociations(updated, productDetails.getStalls()); + + return ResponseEntity.ok(productRepository.findById(updated.getId()).orElse(updated)); }) .orElse(ResponseEntity.notFound().build()); } + private void updateStallAssociations(Product product, List assignedStalls) { + // Remove product from all stalls currently associated + List allStalls = stallRepository.findAll(); + for (com.rit.canteen.sales.model.Stall stall : allStalls) { + if (stall.getProducts() != null && stall.getProducts().removeIf(p -> p.getId().equals(product.getId()))) { + stallRepository.save(stall); + } + } + + // Add product to the newly assigned stalls + if (assignedStalls != null) { + for (com.rit.canteen.sales.model.Stall assignedStall : assignedStalls) { + stallRepository.findById(assignedStall.getId()).ifPresent(stall -> { + if (stall.getProducts() == null) { + stall.setProducts(new java.util.ArrayList<>()); + } + if (stall.getProducts().stream().noneMatch(p -> p.getId().equals(product.getId()))) { + stall.getProducts().add(product); + stallRepository.save(stall); + } + }); + } + } + } + @DeleteMapping("/{id}") public ResponseEntity deleteProduct(@PathVariable Long id) { return productRepository.findById(id) diff --git a/frontend/src/pages/Products.tsx b/frontend/src/pages/Products.tsx index 26d51d2d..24c8f083 100644 --- a/frontend/src/pages/Products.tsx +++ b/frontend/src/pages/Products.tsx @@ -459,8 +459,28 @@ const Products = () => {
setFormData({ ...formData, barcode: e.target.value })} className="w-full px-4 py-3 border border-[#e2e8f0] rounded-xl text-sm" />
setFormData({ ...formData, stock: parseInt(e.target.value) || 0 })} className="w-full px-4 py-3 border border-[#e2e8f0] rounded-xl text-sm font-semibold" />
-
-
+
+ + +
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index a0278150..39636c83 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -5,6 +5,7 @@ import react from '@vitejs/plugin-react' export default defineConfig({ plugins: [react()], server: { + port: 5175, host: true, proxy: { '/api': {