From 2ab6df7119dda8962770e95be58caf964db8a6d4 Mon Sep 17 00:00:00 2001 From: Magnus Hissingby Date: Thu, 14 Aug 2025 15:58:52 +0200 Subject: [PATCH 1/2] core finished, extension in progress --- .../java/com/booleanuk/api/bagels/Bagel.java | 25 --------- .../booleanuk/api/bagels/BagelController.java | 15 ----- .../booleanuk/api/bagels/BagelRepository.java | 25 --------- .../java/com/booleanuk/api/products/Main.java | 12 ++++ .../controller/ProductController.java | 56 +++++++++++++++++++ .../booleanuk/api/products/model/Product.java | 41 ++++++++++++++ .../api/products/model/ProductRepository.java | 56 +++++++++++++++++++ 7 files changed, 165 insertions(+), 65 deletions(-) delete mode 100644 src/main/java/com/booleanuk/api/bagels/Bagel.java delete mode 100644 src/main/java/com/booleanuk/api/bagels/BagelController.java delete mode 100644 src/main/java/com/booleanuk/api/bagels/BagelRepository.java create mode 100644 src/main/java/com/booleanuk/api/products/Main.java create mode 100644 src/main/java/com/booleanuk/api/products/controller/ProductController.java 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/bagels/Bagel.java b/src/main/java/com/booleanuk/api/bagels/Bagel.java deleted file mode 100644 index 77a24a6..0000000 --- a/src/main/java/com/booleanuk/api/bagels/Bagel.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.booleanuk.api.bagels; - -public class Bagel { - private int id; - private String type; - private int price; - - public Bagel(int id, String type, int price) { - this.id = id; - this.type = type; - this.price = price; - } - - public int getId() { - return id; - } - - public String getType() { - return type; - } - - public int getPrice() { - return price; - } -} diff --git a/src/main/java/com/booleanuk/api/bagels/BagelController.java b/src/main/java/com/booleanuk/api/bagels/BagelController.java deleted file mode 100644 index cce2764..0000000 --- a/src/main/java/com/booleanuk/api/bagels/BagelController.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.booleanuk.api.bagels; - -import java.util.List; - -public class BagelController { - BagelRepository repository; - - public BagelController(BagelRepository repository) { - this.repository = repository; - } - - public List getAll() { - return this.repository.findAll(); - } -} diff --git a/src/main/java/com/booleanuk/api/bagels/BagelRepository.java b/src/main/java/com/booleanuk/api/bagels/BagelRepository.java deleted file mode 100644 index 320ddba..0000000 --- a/src/main/java/com/booleanuk/api/bagels/BagelRepository.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.booleanuk.api.bagels; - -import java.util.ArrayList; -import java.util.List; - -public class BagelRepository { - private int idCounter = 1; - private List data = new ArrayList<>(); - - public void create(String type, int price) { - Bagel bagel = new Bagel(this.idCounter++, type, price); - this.data.add(bagel); - } - - public List findAll() { - return this.data; - } - - public Bagel find(int id) { - return this.data.stream() - .filter(bagel -> bagel.getId() == id) - .findFirst() - .orElseThrow(); - } -} 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/products/controller/ProductController.java b/src/main/java/com/booleanuk/api/products/controller/ProductController.java new file mode 100644 index 0000000..59dfe6f --- /dev/null +++ b/src/main/java/com/booleanuk/api/products/controller/ProductController.java @@ -0,0 +1,56 @@ +package com.booleanuk.api.products.controller; + +import com.booleanuk.api.products.model.Product; +import com.booleanuk.api.products.model.ProductRepository; +import org.apache.catalina.User; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; + +@RestController +@RequestMapping("products") +public class ProductController { + ProductRepository repository; + + public ProductController(ProductRepository repository) { + this.repository = repository; + } + + @GetMapping + public List getAll(@RequestBody String category) { + if (category.isEmpty()) { + return this.repository.findAll(); + } + return this.repository.findAllBasedOnCategory(category); + } + + @GetMapping("{id}") + public Product getById(@PathVariable int id) { + Product product = repository.find(id); + if (product == null){ + throw new ResponseStatusException(HttpStatus.NOT_FOUND); + } + return product; + } + + @PostMapping + public Product createProduct(@RequestBody Product newProduct){ + if (repository.addProduct(newProduct) == null){ + throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE); + } else { + throw new ResponseStatusException(HttpStatus.CREATED); + } + } + + @PutMapping("{id}") + public Product updateProduct(@PathVariable int id, @RequestBody Product newProduct){ + return repository.updateProduct(id, newProduct); + } + + @DeleteMapping("{id}") + public boolean deleteProduct(@PathVariable int id){ + return repository.deleteProduct(id); + } +} 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..62be14a --- /dev/null +++ b/src/main/java/com/booleanuk/api/products/model/Product.java @@ -0,0 +1,41 @@ +package com.booleanuk.api.products.model; + +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 int getId() { + return id; + } + + public String getCategory() { + return category; + } + + public int getPrice() { + return price; + } + + public String getName(){ return name; } + + public void setName(String name){ + this.name = name; + } + + public void setCategory(String category){ + this.category = category; + } + + 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..e7bf629 --- /dev/null +++ b/src/main/java/com/booleanuk/api/products/model/ProductRepository.java @@ -0,0 +1,56 @@ +package com.booleanuk.api.products.model; + +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class ProductRepository { + private int idCounter = 1; + private List data = new ArrayList<>(); + + public ProductRepository() { + Product product1 = new Product(this.idCounter++, "car", "utilities", 10000); + Product product2 = new Product(this.idCounter++, "house", "utilities", 200000); + Product product3 = new Product(this.idCounter++, "beer", "drink", 5); + this.data.add(product1); + this.data.add(product2); + this.data.add(product3); + } + + public List findAll() { + return this.data; + } + + public List findAllBasedOnCategory(String category){ + return this.data.stream().filter(n -> n.getCategory().equals(category)).toList(); + } + + public Product find(int id) { + return this.data.stream() + .filter(product -> product.getId() == id) + .findFirst() + .orElseThrow(); + } + + public Product addProduct(Product product){ + this.data.add(product); + return product; + } + + public Product updateProduct(int id, Product newProduct){ + Product product = find(id); + if (product == null){ + return null; + } + product.setName(newProduct.getName()); + product.setCategory(newProduct.getCategory()); + product.setPrice(newProduct.getPrice()); + return product; + } + + public boolean deleteProduct(int id){ + return this.data.remove(data.get(id)); + } +} From 57d49116784f26364082af9699377c40c7747e0d Mon Sep 17 00:00:00 2001 From: Magnus Hissingby Date: Thu, 14 Aug 2025 20:40:49 +0200 Subject: [PATCH 2/2] extension complete --- .../controller/ProductController.java | 26 +++------- .../api/products/model/ProductRepository.java | 51 ++++++++++++------- 2 files changed, 38 insertions(+), 39 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 59dfe6f..aab0a29 100644 --- a/src/main/java/com/booleanuk/api/products/controller/ProductController.java +++ b/src/main/java/com/booleanuk/api/products/controller/ProductController.java @@ -2,10 +2,7 @@ import com.booleanuk.api.products.model.Product; import com.booleanuk.api.products.model.ProductRepository; -import org.apache.catalina.User; -import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; -import org.springframework.web.server.ResponseStatusException; import java.util.List; @@ -19,34 +16,23 @@ public ProductController(ProductRepository repository) { } @GetMapping - public List getAll(@RequestBody String category) { - if (category.isEmpty()) { - return this.repository.findAll(); - } - return this.repository.findAllBasedOnCategory(category); + public List getAll(@RequestParam(required = false) String category) { + return this.repository.findAll(category); } @GetMapping("{id}") public Product getById(@PathVariable int id) { - Product product = repository.find(id); - if (product == null){ - throw new ResponseStatusException(HttpStatus.NOT_FOUND); - } - return product; + return repository.find(id); } @PostMapping public Product createProduct(@RequestBody Product newProduct){ - if (repository.addProduct(newProduct) == null){ - throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE); - } else { - throw new ResponseStatusException(HttpStatus.CREATED); - } + return repository.addProduct(newProduct); } @PutMapping("{id}") - public Product updateProduct(@PathVariable int id, @RequestBody Product newProduct){ - return repository.updateProduct(id, newProduct); + public Product updateProduct(@PathVariable int id, @RequestBody String name){ + return repository.updateProduct(id, name); } @DeleteMapping("{id}") 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 e7bf629..958391e 100644 --- a/src/main/java/com/booleanuk/api/products/model/ProductRepository.java +++ b/src/main/java/com/booleanuk/api/products/model/ProductRepository.java @@ -1,6 +1,8 @@ package com.booleanuk.api.products.model; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Repository; +import org.springframework.web.server.ResponseStatusException; import java.util.ArrayList; import java.util.List; @@ -19,38 +21,49 @@ public ProductRepository() { this.data.add(product3); } - public List findAll() { + public List findAll(String category) { + if (category != null && !category.isEmpty()){ + List ls = this.data.stream().filter(n -> n.getCategory().equals(category)).toList(); + if (ls.isEmpty()){ + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No products of the provided category were found."); + } + return ls; + } return this.data; } - public List findAllBasedOnCategory(String category){ - return this.data.stream().filter(n -> n.getCategory().equals(category)).toList(); - } - public Product find(int id) { - return this.data.stream() - .filter(product -> product.getId() == id) - .findFirst() - .orElseThrow(); + List product = this.data.stream() + .filter(prod -> prod.getId() == id) + .toList(); + if (product.isEmpty()){ + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Product not found."); + } + return product.getFirst(); } public Product addProduct(Product product){ - this.data.add(product); - return product; + if (data.stream().filter(it -> it.getName().equals(product.getName())).toList().isEmpty()){ + this.data.add(product); + throw new ResponseStatusException(HttpStatus.CREATED, "Create a new product"); + } + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Product with provided name already exists."); } - public Product updateProduct(int id, Product newProduct){ + public Product updateProduct(int id, String name){ Product product = find(id); - if (product == null){ - return null; + List existingProduct = data.stream().filter(it -> it.getName().equals(name)).toList(); + + if (!existingProduct.isEmpty()){ + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Product with provided name already exists."); } - product.setName(newProduct.getName()); - product.setCategory(newProduct.getCategory()); - product.setPrice(newProduct.getPrice()); - return product; + product.setName(name); + throw new ResponseStatusException(HttpStatus.CREATED, "Product successfully updated."); } public boolean deleteProduct(int id){ - return this.data.remove(data.get(id)); + Product product = find(id); + this.data.remove(product); + throw new ResponseStatusException(HttpStatus.OK, "Product successfully deleted."); } }