Index: src/main/java/finki/db/tasty_tabs/entity/Inventory.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Inventory.java	(revision 76e67d563f71555b14e08745f4f71388f6c2abc3)
+++ src/main/java/finki/db/tasty_tabs/entity/Inventory.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
@@ -9,5 +9,5 @@
  */
 @Entity
-@Table(name = "inventory")
+@Table(name = "inventories")
 @Data
 @NoArgsConstructor
@@ -28,3 +28,9 @@
     @Column(name = "restock_level")
     private Integer restockLevel;
+
+    public Inventory(Long id, Integer quantity, Integer restockLevel) {
+        this.productId=id;
+        this.quantity=quantity;
+        this.restockLevel=restockLevel;
+    }
 }
Index: src/main/java/finki/db/tasty_tabs/entity/Product.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/Product.java	(revision 76e67d563f71555b14e08745f4f71388f6c2abc3)
+++ src/main/java/finki/db/tasty_tabs/entity/Product.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
@@ -12,5 +12,5 @@
  */
 @Entity
-@Table(name = "product")
+@Table(name = "products")
 @Data
 @NoArgsConstructor
Index: src/main/java/finki/db/tasty_tabs/entity/exceptions/CategoryNotFoundException.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/exceptions/CategoryNotFoundException.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
+++ src/main/java/finki/db/tasty_tabs/entity/exceptions/CategoryNotFoundException.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
@@ -0,0 +1,11 @@
+package finki.db.tasty_tabs.entity.exceptions;
+
+public class CategoryNotFoundException extends RuntimeException {
+
+    public CategoryNotFoundException(String name) {
+        super(String.format("Category: %s doesnt exist",name));
+    }
+    public CategoryNotFoundException() {
+        super(String.format("Category doesnt exist"));
+    }
+}
Index: src/main/java/finki/db/tasty_tabs/entity/exceptions/ProductNotFoundException.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/exceptions/ProductNotFoundException.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
+++ src/main/java/finki/db/tasty_tabs/entity/exceptions/ProductNotFoundException.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
@@ -0,0 +1,9 @@
+package finki.db.tasty_tabs.entity.exceptions;
+
+public class ProductNotFoundException extends RuntimeException {
+
+    public ProductNotFoundException(Long id) {
+        super(String.format("Product with id %d doesnt exist",id));
+    }
+}
+
Index: src/main/java/finki/db/tasty_tabs/entity/exceptions/ProductNotInStockException.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/entity/exceptions/ProductNotInStockException.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
+++ src/main/java/finki/db/tasty_tabs/entity/exceptions/ProductNotInStockException.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
@@ -0,0 +1,9 @@
+package finki.db.tasty_tabs.entity.exceptions;
+
+public class ProductNotInStockException extends RuntimeException {
+
+    public ProductNotInStockException(String name) {
+        super(String.format("Product: %s not in stock",name));
+    }
+}
+
Index: src/main/java/finki/db/tasty_tabs/repository/InventoryRepository.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/repository/InventoryRepository.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
+++ src/main/java/finki/db/tasty_tabs/repository/InventoryRepository.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
@@ -0,0 +1,7 @@
+package finki.db.tasty_tabs.repository;
+
+import finki.db.tasty_tabs.entity.Inventory;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface InventoryRepository extends JpaRepository<Inventory,Long> {
+}
Index: src/main/java/finki/db/tasty_tabs/repository/ProductRepository.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/repository/ProductRepository.java	(revision 76e67d563f71555b14e08745f4f71388f6c2abc3)
+++ src/main/java/finki/db/tasty_tabs/repository/ProductRepository.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
@@ -4,3 +4,7 @@
 import org.springframework.data.jpa.repository.JpaRepository;
 
-public interface ProductRepository extends JpaRepository<Product, Long> {}
+import java.util.List;
+
+public interface ProductRepository extends JpaRepository<Product, Long> {
+    List<Product> findAllByName(String name);
+}
Index: src/main/java/finki/db/tasty_tabs/service/ProductService.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/service/ProductService.java	(revision 76e67d563f71555b14e08745f4f71388f6c2abc3)
+++ src/main/java/finki/db/tasty_tabs/service/ProductService.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
@@ -3,11 +3,15 @@
 import finki.db.tasty_tabs.entity.Category;
 import finki.db.tasty_tabs.entity.Product;
+import finki.db.tasty_tabs.web.dto.CreateProductDto;
 
 import java.util.List;
+import java.util.Optional;
 
 public interface ProductService {
-    Product createProduct(Product product);
+    Optional<Product> findById(Long id);
     List<Product> getAllProducts();
-    Category createCategory(Category category);
-    List<Category> getAllCategories();
+    Optional<Product> updateProduct(Long id, CreateProductDto dto);
+    void deleteProduct(Long id);
+    List<Product> getProductsByName(String name);
+    Optional<Product> createProduct(CreateProductDto dto);
 }
Index: src/main/java/finki/db/tasty_tabs/service/impl/ProductServiceImpl.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/service/impl/ProductServiceImpl.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
+++ src/main/java/finki/db/tasty_tabs/service/impl/ProductServiceImpl.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
@@ -0,0 +1,121 @@
+package finki.db.tasty_tabs.service.impl;
+
+
+import finki.db.tasty_tabs.entity.Inventory;
+import finki.db.tasty_tabs.entity.Product;
+import finki.db.tasty_tabs.entity.exceptions.CategoryNotFoundException;
+import finki.db.tasty_tabs.entity.exceptions.ProductNotFoundException;
+import finki.db.tasty_tabs.repository.InventoryRepository;
+import finki.db.tasty_tabs.repository.ProductRepository;
+import finki.db.tasty_tabs.service.CategoryService;
+import finki.db.tasty_tabs.service.ProductService;
+import finki.db.tasty_tabs.web.dto.CreateProductDto;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class ProductServiceImpl implements ProductService {
+
+    private final ProductRepository productRepository;
+    private final CategoryService categoryService;
+    private final InventoryRepository inventoryRepository;
+
+
+    public ProductServiceImpl(ProductRepository productRepository, CategoryService categoryService,InventoryRepository inventoryRepository) {
+        this.productRepository = productRepository;
+        this.categoryService = categoryService;
+        this.inventoryRepository=inventoryRepository;
+    }
+
+    @Override
+    public Optional<Product> findById(Long id) {
+        return productRepository.findById(id);
+    }
+
+    @Override
+    public List<Product> getAllProducts() {
+        return productRepository.findAll();
+    }
+
+    @Override
+    public Optional<Product> updateProduct(Long id, CreateProductDto dto) {
+        Optional<Product> productTmp=productRepository.findById(id);
+        if(productTmp.isEmpty()){
+            throw new ProductNotFoundException(id);
+        }
+
+        if(categoryService.findById(dto.categoryId()).isEmpty()){
+            throw new CategoryNotFoundException();
+        }
+
+        return productRepository.findById(id).map(existingProduct -> {
+            if (dto.name() != null) {
+                existingProduct.setName(dto.name());
+            }
+            if (dto.price() != null) {
+                existingProduct.setPrice(dto.price());
+            }
+            if(dto.taxClass()!=null){
+                existingProduct.setTaxClass(dto.taxClass());
+            }
+            existingProduct.setCategory(categoryService.findById(dto.categoryId()).get());
+            existingProduct.setDescription(dto.description());
+            if(dto.manageInventory()==Boolean.TRUE){
+                if(existingProduct.getManageInventory()==Boolean.FALSE){
+                    inventoryRepository.save(new Inventory(id,dto.quantity(),dto.restockLevel()));
+                }
+                else{
+                    Inventory inventorytmp=inventoryRepository.findById(id).get();
+                    inventorytmp.setQuantity(dto.quantity());
+                    inventorytmp.setRestockLevel(dto.restockLevel());
+                    inventoryRepository.save(inventorytmp);
+                }
+            }
+            if(dto.manageInventory()!=null){
+                existingProduct.setManageInventory(dto.manageInventory());
+            }
+            return productRepository.save(existingProduct);
+        });
+    }
+
+    @Override
+    public void deleteProduct(Long id) {
+        productRepository.deleteById(id);
+    }
+
+    @Override
+    public List<Product> getProductsByName(String name) {
+
+        return productRepository.findAllByName(name);
+    }
+
+    @Override
+    public Optional<Product> createProduct(CreateProductDto dto) {
+        if(categoryService.findById(dto.categoryId()).isEmpty()){
+            throw new CategoryNotFoundException();
+        }
+        Product productTmp=new Product();
+        if (dto.name() != null) {
+            productTmp.setName(dto.name());
+        }
+        if (dto.price() != null) {
+            productTmp.setPrice(dto.price());
+        }
+        if(dto.taxClass()!=null){
+            productTmp.setTaxClass(dto.taxClass());
+        }
+        productTmp.setCategory(categoryService.findById(dto.categoryId()).get());
+        productTmp.setDescription(dto.description());
+
+        if(dto.manageInventory()!=null){
+            productTmp.setManageInventory(dto.manageInventory());
+        }
+        Product product=productRepository.save(productTmp);
+        if(product.getManageInventory()==Boolean.TRUE){
+            inventoryRepository.save(new Inventory(product.getId(),dto.quantity(),dto.restockLevel()));
+        }
+        return Optional.of(product);
+    }
+}
Index: src/main/java/finki/db/tasty_tabs/web/controllers/ProductController.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/controllers/ProductController.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
+++ src/main/java/finki/db/tasty_tabs/web/controllers/ProductController.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
@@ -0,0 +1,66 @@
+package finki.db.tasty_tabs.web.controllers;
+import finki.db.tasty_tabs.entity.Product;
+import finki.db.tasty_tabs.service.ProductService;
+import finki.db.tasty_tabs.web.dto.CreateProductDto;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/products")
+@Tag(name = "Product API", description = "Endpoints for managing products")
+public class ProductController {
+
+    private final ProductService productService;
+
+    public ProductController(ProductService productService) {
+        this.productService = productService;
+    }
+
+    @Operation(summary = "Get all products", description = "Returns a list of all products.")
+    @GetMapping
+    public List<Product> findAll() {
+        return productService.getAllProducts();
+    }
+
+    @Operation(summary = "Get product by ID", description = "Finds a product by its ID.")
+    @GetMapping("/{id}")
+    public ResponseEntity<Product> findById(@PathVariable Long id) {
+        return productService.findById(id)
+                .map(ResponseEntity::ok)
+                .orElseGet(() -> ResponseEntity.notFound().build());
+    }
+
+    @Operation(summary = "Search products by name", description = "Returns products with a given name.")
+    @GetMapping("/search")
+    public List<Product> findByName(@RequestParam String name) {
+        return productService.getProductsByName(name);
+    }
+
+    @Operation(summary = "Create new product", description = "Creates a new product (with or without inventory).")
+    @PostMapping("/add")
+    public ResponseEntity<Product> save(@RequestBody CreateProductDto dto) {
+        return productService.createProduct(dto)
+                .map(ResponseEntity::ok)
+                .orElseGet(() -> ResponseEntity.badRequest().build());
+    }
+
+    @Operation(summary = "Update product", description = "Updates an existing product by ID.")
+    @PutMapping("/edit/{id}")
+    public ResponseEntity<Product> update(@PathVariable Long id, @RequestBody CreateProductDto dto) {
+        return productService.updateProduct(id, dto)
+                .map(ResponseEntity::ok)
+                .orElseGet(() -> ResponseEntity.notFound().build());
+    }
+
+    @Operation(summary = "Delete product", description = "Deletes a product by its ID.")
+    @DeleteMapping("/delete/{id}")
+    public ResponseEntity<Void> delete(@PathVariable Long id) {
+        productService.deleteProduct(id);
+        return ResponseEntity.noContent().build();
+    }
+}
+
Index: src/main/java/finki/db/tasty_tabs/web/dto/CreateProductDto.java
===================================================================
--- src/main/java/finki/db/tasty_tabs/web/dto/CreateProductDto.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
+++ src/main/java/finki/db/tasty_tabs/web/dto/CreateProductDto.java	(revision b1374a210fe729ba0646bdb59db4f21b3f7b6ec8)
@@ -0,0 +1,13 @@
+package finki.db.tasty_tabs.web.dto;
+
+public record CreateProductDto(
+        String name,
+        Double price,
+        String taxClass,
+        String description,
+        Boolean manageInventory,
+        Long categoryId,
+        Integer quantity,
+        Integer restockLevel
+) {
+}
