From f55f66b5a29ab6b95a2a341355225fe2012aaf07 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Thu, 14 Aug 2025 15:19:23 +0200 Subject: [PATCH 1/2] completed core --- .../java/com/booleanuk/api/products/Main.java | 12 ++++ .../controller}/BagelController.java | 5 +- .../controller/ProductController.java | 66 +++++++++++++++++++ .../api/{bagels => products/model}/Bagel.java | 2 +- .../model}/BagelRepository.java | 2 +- .../booleanuk/api/products/model/Product.java | 51 ++++++++++++++ .../api/products/model/ProductRepository.java | 34 ++++++++++ 7 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/booleanuk/api/products/Main.java rename src/main/java/com/booleanuk/api/{bagels => products/controller}/BagelController.java (64%) create mode 100644 src/main/java/com/booleanuk/api/products/controller/ProductController.java rename src/main/java/com/booleanuk/api/{bagels => products/model}/Bagel.java (90%) rename src/main/java/com/booleanuk/api/{bagels => products/model}/BagelRepository.java (93%) create mode 100644 src/main/java/com/booleanuk/api/products/model/Product.java create mode 100644 src/main/java/com/booleanuk/api/products/model/ProductRepository.java diff --git a/src/main/java/com/booleanuk/api/products/Main.java b/src/main/java/com/booleanuk/api/products/Main.java new file mode 100644 index 0000000..a741936 --- /dev/null +++ b/src/main/java/com/booleanuk/api/products/Main.java @@ -0,0 +1,12 @@ +package com.booleanuk.api.products; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } +} diff --git a/src/main/java/com/booleanuk/api/bagels/BagelController.java b/src/main/java/com/booleanuk/api/products/controller/BagelController.java similarity index 64% rename from src/main/java/com/booleanuk/api/bagels/BagelController.java rename to src/main/java/com/booleanuk/api/products/controller/BagelController.java index cce2764..92d7850 100644 --- a/src/main/java/com/booleanuk/api/bagels/BagelController.java +++ b/src/main/java/com/booleanuk/api/products/controller/BagelController.java @@ -1,4 +1,7 @@ -package com.booleanuk.api.bagels; +package com.booleanuk.api.products.controller; + +import com.booleanuk.api.products.model.BagelRepository; +import com.booleanuk.api.products.model.Bagel; import java.util.List; diff --git a/src/main/java/com/booleanuk/api/products/controller/ProductController.java b/src/main/java/com/booleanuk/api/products/controller/ProductController.java new file mode 100644 index 0000000..a0b4fc5 --- /dev/null +++ b/src/main/java/com/booleanuk/api/products/controller/ProductController.java @@ -0,0 +1,66 @@ +package com.booleanuk.api.products.controller; + +import com.booleanuk.api.products.model.Product; +import com.booleanuk.api.products.model.ProductRepository; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.util.ArrayList; +import java.util.List; + + +@RestController + @RequestMapping("products") + public class ProductController { + private ProductRepository productRepository; + + public ProductController() { + this.productRepository = new ProductRepository(); + } + + @GetMapping + public ArrayList getAll() { + return this.productRepository.getAll(); + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public Product createProduct(@RequestBody Product newProduct){ + this.productRepository.addProduct(newProduct); + return newProduct; + } + + @GetMapping("/{id}") + public Product getOne(@PathVariable int id) { + Product product = productRepository.getOne(id); + if (product == null) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Did not find this product"); + } + return product; + } + + @PutMapping("/{id}") + @ResponseStatus(HttpStatus.CREATED) + public Product update(@PathVariable int id, @RequestBody Product product ) { + List products = productRepository.getAll(); + if(id < products.size()) { + products.get(id).setName(product.getName()); + products.get(id).setCategory(product.getCategory()); + products.get(id).setPrice(product.getPrice()); + return products.get(id); + } + return null; + } + + @DeleteMapping("/{id}") + public Product delete(@PathVariable int id){ + List products = productRepository.getAll(); + if (id < products.size()) { + return products.remove(id); + } + return null; + } + +} diff --git a/src/main/java/com/booleanuk/api/bagels/Bagel.java b/src/main/java/com/booleanuk/api/products/model/Bagel.java similarity index 90% rename from src/main/java/com/booleanuk/api/bagels/Bagel.java rename to src/main/java/com/booleanuk/api/products/model/Bagel.java index 77a24a6..d181d5f 100644 --- a/src/main/java/com/booleanuk/api/bagels/Bagel.java +++ b/src/main/java/com/booleanuk/api/products/model/Bagel.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.bagels; +package com.booleanuk.api.products.model; public class Bagel { private int id; diff --git a/src/main/java/com/booleanuk/api/bagels/BagelRepository.java b/src/main/java/com/booleanuk/api/products/model/BagelRepository.java similarity index 93% rename from src/main/java/com/booleanuk/api/bagels/BagelRepository.java rename to src/main/java/com/booleanuk/api/products/model/BagelRepository.java index 320ddba..05ef535 100644 --- a/src/main/java/com/booleanuk/api/bagels/BagelRepository.java +++ b/src/main/java/com/booleanuk/api/products/model/BagelRepository.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.bagels; +package com.booleanuk.api.products.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/booleanuk/api/products/model/Product.java b/src/main/java/com/booleanuk/api/products/model/Product.java new file mode 100644 index 0000000..6a4b2d3 --- /dev/null +++ b/src/main/java/com/booleanuk/api/products/model/Product.java @@ -0,0 +1,51 @@ +package com.booleanuk.api.products.model; + +public class Product { + static int nextId = 0; + private int id; + private String name; + private String category; + private int price; + + public Product(String name, String category, int price){ + this.id = nextId++; + this.name = name; + this.category = category; + this.price = price; + + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + +} diff --git a/src/main/java/com/booleanuk/api/products/model/ProductRepository.java b/src/main/java/com/booleanuk/api/products/model/ProductRepository.java new file mode 100644 index 0000000..e7f7783 --- /dev/null +++ b/src/main/java/com/booleanuk/api/products/model/ProductRepository.java @@ -0,0 +1,34 @@ +package com.booleanuk.api.products.model; + +import java.util.ArrayList; + +public class ProductRepository { + private ArrayList products; + + public ProductRepository(){ + this.products = new ArrayList<>(); + this.products.add(new Product("product1", "category1", 100)); + this.products.add(new Product("product2", "category2", 40)); + this.products.add(new Product("product3", "category3", 90)); + + } + + public ArrayList getAll(){ + return this.products; + } + + public Product getOne(int id){ + for (Product product: this.products){ + if (product.getId() == id){ + return product; + } + } return null; + } + + public void addProduct(Product product){ + products.add(product); + } + +} + + From 3c15e97c8588945abc8a3d3a803aecbda689f62f Mon Sep 17 00:00:00 2001 From: Linda Do Date: Fri, 15 Aug 2025 11:28:10 +0200 Subject: [PATCH 2/2] completed extensions --- .../controller/ProductController.java | 51 +++++++++++-------- .../booleanuk/api/products/model/Product.java | 5 +- .../api/products/model/ProductRepository.java | 51 ++++++++++++++++--- 3 files changed, 76 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/booleanuk/api/products/controller/ProductController.java b/src/main/java/com/booleanuk/api/products/controller/ProductController.java index a0b4fc5..ea52648 100644 --- a/src/main/java/com/booleanuk/api/products/controller/ProductController.java +++ b/src/main/java/com/booleanuk/api/products/controller/ProductController.java @@ -12,8 +12,8 @@ @RestController - @RequestMapping("products") - public class ProductController { +@RequestMapping("products") +public class ProductController { private ProductRepository productRepository; public ProductController() { @@ -22,14 +22,20 @@ public ProductController() { @GetMapping public ArrayList getAll() { - return this.productRepository.getAll(); + ArrayList products = productRepository.getAll(); + if (products.isEmpty()) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No products of the provided category were found"); + } + return products; } @PostMapping - @ResponseStatus(HttpStatus.CREATED) - public Product createProduct(@RequestBody Product newProduct){ - this.productRepository.addProduct(newProduct); - return newProduct; + public ResponseEntity createProduct(@RequestBody Product newProduct){ + Product product = productRepository.addProduct(newProduct); + if (product == null){ + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "This product is already in the list"); + } + return new ResponseEntity(HttpStatus.CREATED); } @GetMapping("/{id}") @@ -42,25 +48,28 @@ public Product getOne(@PathVariable int id) { } @PutMapping("/{id}") - @ResponseStatus(HttpStatus.CREATED) - public Product update(@PathVariable int id, @RequestBody Product product ) { - List products = productRepository.getAll(); - if(id < products.size()) { - products.get(id).setName(product.getName()); - products.get(id).setCategory(product.getCategory()); - products.get(id).setPrice(product.getPrice()); - return products.get(id); + public ResponseEntity update(@PathVariable int id, @RequestBody Product product ) { + Product productCheck = productRepository.getOne(id); + if (productCheck == null) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Did not find this product"); + } + + boolean updatedProduct = productRepository.checkName(product, id); + + if (!updatedProduct){ + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "This product is already in the list"); } - return null; + + productRepository.updateProduct(id, product); + return new ResponseEntity(HttpStatus.CREATED); } @DeleteMapping("/{id}") public Product delete(@PathVariable int id){ - List products = productRepository.getAll(); - if (id < products.size()) { - return products.remove(id); + Product product = productRepository.deleteProduct(id); + if (product == null) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Did not find this product"); } - return null; + return product; } - } diff --git a/src/main/java/com/booleanuk/api/products/model/Product.java b/src/main/java/com/booleanuk/api/products/model/Product.java index 6a4b2d3..2d2e2e0 100644 --- a/src/main/java/com/booleanuk/api/products/model/Product.java +++ b/src/main/java/com/booleanuk/api/products/model/Product.java @@ -1,14 +1,15 @@ package com.booleanuk.api.products.model; public class Product { - static int nextId = 0; + public static int nextId = 0; private int id; private String name; private String category; private int price; public Product(String name, String category, int price){ - this.id = nextId++; + this.id = nextId; + nextId++; this.name = name; this.category = category; this.price = price; diff --git a/src/main/java/com/booleanuk/api/products/model/ProductRepository.java b/src/main/java/com/booleanuk/api/products/model/ProductRepository.java index e7f7783..b1b72d2 100644 --- a/src/main/java/com/booleanuk/api/products/model/ProductRepository.java +++ b/src/main/java/com/booleanuk/api/products/model/ProductRepository.java @@ -5,7 +5,7 @@ public class ProductRepository { private ArrayList products; - public ProductRepository(){ + public ProductRepository() { this.products = new ArrayList<>(); this.products.add(new Product("product1", "category1", 100)); this.products.add(new Product("product2", "category2", 40)); @@ -13,22 +13,57 @@ public ProductRepository(){ } - public ArrayList getAll(){ + public ArrayList getAll() { return this.products; } - public Product getOne(int id){ - for (Product product: this.products){ - if (product.getId() == id){ + public Product getOne(int id) { + for (Product product : this.products) { + if (product.getId() == id) { return product; } - } return null; + } + return null; } - public void addProduct(Product product){ - products.add(product); + public Product addProduct(Product newProduct) { + for (Product product : this.products) { + if (product.getName().equals(newProduct.getName())) { + return null; + } + } + products.add(newProduct); + return newProduct; + } + + public boolean checkName(Product product, int id){ + for (Product productInList : this.products) { + if (productInList.getName().equals(product.getName())) { + return false; + } + } return true; } + public Product deleteProduct(int id){ + for (Product product : this.products) { + if (product.getId() == id) { + products.remove(product); + return product; + } + } + return null; + } + + public void updateProduct(int id, Product product) { + for (Product productInList : this.products) { + if (productInList.getId() == id) { + productInList.setName(product.getName()); + productInList.setCategory(product.getCategory()); + productInList.setPrice(product.getPrice()); + } + } + } } +