From f850c3582898ee2aa45c513de6ca122f03ee97d0 Mon Sep 17 00:00:00 2001 From: Moueed Ali Date: Thu, 14 Aug 2025 13:21:52 +0200 Subject: [PATCH 1/3] Exersice completed --- .../java/com/booleanuk/api/bagels/Main.java | 12 ++++ .../bagels/controller/ProductController.java | 55 +++++++++++++++++++ .../booleanuk/api/bagels/models/Product.java | 47 ++++++++++++++++ .../repositories/ProductRepository.java | 39 +++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 src/main/java/com/booleanuk/api/bagels/Main.java create mode 100644 src/main/java/com/booleanuk/api/bagels/controller/ProductController.java create mode 100644 src/main/java/com/booleanuk/api/bagels/models/Product.java create mode 100644 src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java diff --git a/src/main/java/com/booleanuk/api/bagels/Main.java b/src/main/java/com/booleanuk/api/bagels/Main.java new file mode 100644 index 0000000..ac03895 --- /dev/null +++ b/src/main/java/com/booleanuk/api/bagels/Main.java @@ -0,0 +1,12 @@ +package com.booleanuk.api.bagels; + +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/controller/ProductController.java b/src/main/java/com/booleanuk/api/bagels/controller/ProductController.java new file mode 100644 index 0000000..7e68289 --- /dev/null +++ b/src/main/java/com/booleanuk/api/bagels/controller/ProductController.java @@ -0,0 +1,55 @@ +package com.booleanuk.api.bagels.controller; + +import com.booleanuk.api.bagels.models.Product; +import com.booleanuk.api.bagels.repositories.ProductRepository; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("products") +public class ProductController { + private ProductRepository productRepository; + + public ProductController() { + productRepository = new ProductRepository(); + } + + @GetMapping + public List getAll() { + return this.productRepository.findAll(); + } + + @GetMapping("{id}") + public Product getOne(@PathVariable int id) { + return this.productRepository.getOne(id); + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public Product create(@RequestBody Product product) { + this.productRepository.addProduct(product); + return product; + } + + @PutMapping("/{id}") + @ResponseStatus(HttpStatus.CREATED) + public Product update(@PathVariable(name = "id") int id, @RequestBody Product product) { + if (id < this.productRepository.size()) { + this.productRepository.findAll().get(id).setId(id); + this.productRepository.findAll().get(id).setName(product.getName()); + this.productRepository.findAll().get(id).setCategory(product.getCategory()); + this.productRepository.findAll().get(id).setPrice(product.getPrice()); + } + return null; + } + + @DeleteMapping("/{id}") + public Product delete(@PathVariable (name = "id") int id) { + if (id < this.productRepository.size()) { + return this.productRepository.findAll().remove(id); + } + return null; + } +} diff --git a/src/main/java/com/booleanuk/api/bagels/models/Product.java b/src/main/java/com/booleanuk/api/bagels/models/Product.java new file mode 100644 index 0000000..11706e4 --- /dev/null +++ b/src/main/java/com/booleanuk/api/bagels/models/Product.java @@ -0,0 +1,47 @@ +package com.booleanuk.api.bagels.models; + +public class Product { + private int id; + private String name; + private String category; + private int price; + + public Product(int id, String name, String category, int price) { + this.id = id; + this.name = name; + this.category = category; + this.price = price; + } + + public String getName() { + return name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } +} diff --git a/src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java b/src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java new file mode 100644 index 0000000..a8f8d41 --- /dev/null +++ b/src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java @@ -0,0 +1,39 @@ +package com.booleanuk.api.bagels.repositories; + +import com.booleanuk.api.bagels.models.Product; + +import java.util.ArrayList; +import java.util.List; + +public class ProductRepository { + private List products; + private int idCounter = 0; + + public ProductRepository() { + products = new ArrayList<>(); + + products.add(new Product(this.idCounter++, "Cheese", "Food", 10)); + products.add(new Product(this.idCounter++, "Milk", "Food", 5)); + products.add(new Product(this.idCounter++,"Jacket", "Clothing", 100)); + } + + public List findAll() {return this.products;} + + public Product getOne(int id) { + for (Product p : products) { + if (p.getId() == id) { + return p; + } + } + + return null; + } + + public void addProduct(Product p) { + products.add(p); + } + + public int size() { + return products.size(); + } +} From 292f888360dbf956be818db35953f187e639189f Mon Sep 17 00:00:00 2001 From: Moueed Ali Date: Thu, 14 Aug 2025 14:15:47 +0200 Subject: [PATCH 2/3] Extension is somewhat complete, a few errors in Insomnia I need to fix --- .../bagels/controller/ProductController.java | 48 +++++++++++++++++-- .../repositories/ProductRepository.java | 4 +- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/booleanuk/api/bagels/controller/ProductController.java b/src/main/java/com/booleanuk/api/bagels/controller/ProductController.java index 7e68289..326d01d 100644 --- a/src/main/java/com/booleanuk/api/bagels/controller/ProductController.java +++ b/src/main/java/com/booleanuk/api/bagels/controller/ProductController.java @@ -2,10 +2,13 @@ import com.booleanuk.api.bagels.models.Product; import com.booleanuk.api.bagels.repositories.ProductRepository; +import org.apache.coyote.Response; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; import java.util.List; +import java.util.Objects; @RestController @RequestMapping("products") @@ -18,17 +21,34 @@ public ProductController() { @GetMapping public List getAll() { - return this.productRepository.findAll(); + List products = this.productRepository.findAll(); + + if (products.isEmpty()) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Not products were found"); + } + + return products; } @GetMapping("{id}") public Product getOne(@PathVariable int id) { - return this.productRepository.getOne(id); + Product product = this.productRepository.getOne(id); + + if (product == null) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Product is not found"); + } + + return product; } @PostMapping @ResponseStatus(HttpStatus.CREATED) public Product create(@RequestBody Product product) { + + if (this.productRepository.findAll().get(product.getId()).getName() == product.getName()) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Product not created"); + } + this.productRepository.addProduct(product); return product; } @@ -36,12 +56,19 @@ public Product create(@RequestBody Product product) { @PutMapping("/{id}") @ResponseStatus(HttpStatus.CREATED) public Product update(@PathVariable(name = "id") int id, @RequestBody Product product) { - if (id < this.productRepository.size()) { + + if (Objects.equals(this.productRepository.findAll().get(id).getName(), product.getName())) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Product exists already"); + } + else if (id < this.productRepository.size()) { this.productRepository.findAll().get(id).setId(id); this.productRepository.findAll().get(id).setName(product.getName()); this.productRepository.findAll().get(id).setCategory(product.getCategory()); this.productRepository.findAll().get(id).setPrice(product.getPrice()); } + else { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Product does not exist"); + } return null; } @@ -50,6 +77,19 @@ public Product delete(@PathVariable (name = "id") int id) { if (id < this.productRepository.size()) { return this.productRepository.findAll().remove(id); } - return null; + else { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Not found"); + } } + +// @GetMapping("{id}") +// public Author getOne(@PathVariable int id) { +// Author author = this.authorRepository.getOne(id); +// +// if (author == null) { +// throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found"); +// } +// +// return author; +// } } diff --git a/src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java b/src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java index a8f8d41..72cbd1d 100644 --- a/src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java +++ b/src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java @@ -29,8 +29,8 @@ public Product getOne(int id) { return null; } - public void addProduct(Product p) { - products.add(p); + public boolean addProduct(Product p) { + return products.add(p); } public int size() { From 257e5624c8863e75a27cb562035981af434d5a8b Mon Sep 17 00:00:00 2001 From: Moueed Ali Date: Thu, 14 Aug 2025 14:44:41 +0200 Subject: [PATCH 3/3] Extension is fixed and complete now --- .../api/bagels/controller/ProductController.java | 15 ++------------- .../bagels/repositories/ProductRepository.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/booleanuk/api/bagels/controller/ProductController.java b/src/main/java/com/booleanuk/api/bagels/controller/ProductController.java index 326d01d..36ab010 100644 --- a/src/main/java/com/booleanuk/api/bagels/controller/ProductController.java +++ b/src/main/java/com/booleanuk/api/bagels/controller/ProductController.java @@ -45,7 +45,7 @@ public Product getOne(@PathVariable int id) { @ResponseStatus(HttpStatus.CREATED) public Product create(@RequestBody Product product) { - if (this.productRepository.findAll().get(product.getId()).getName() == product.getName()) { + if (productRepository.checkName(product.getName())) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Product not created"); } @@ -57,7 +57,7 @@ public Product create(@RequestBody Product product) { @ResponseStatus(HttpStatus.CREATED) public Product update(@PathVariable(name = "id") int id, @RequestBody Product product) { - if (Objects.equals(this.productRepository.findAll().get(id).getName(), product.getName())) { + if (productRepository.checkName(product.getName())) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Product exists already"); } else if (id < this.productRepository.size()) { @@ -81,15 +81,4 @@ public Product delete(@PathVariable (name = "id") int id) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Not found"); } } - -// @GetMapping("{id}") -// public Author getOne(@PathVariable int id) { -// Author author = this.authorRepository.getOne(id); -// -// if (author == null) { -// throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found"); -// } -// -// return author; -// } } diff --git a/src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java b/src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java index 72cbd1d..4b1a086 100644 --- a/src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java +++ b/src/main/java/com/booleanuk/api/bagels/repositories/ProductRepository.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class ProductRepository { private List products; @@ -36,4 +37,13 @@ public boolean addProduct(Product p) { public int size() { return products.size(); } + + public boolean checkName(String name) { + for (Product p: products) { + if (Objects.equals(p.getName(), name)) { + return true; + } + } + return false; + } }