From 6d9d9281886ba870b5589ad00a7c5ca506773796 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Mon, 20 Jan 2025 14:03:07 +0100 Subject: [PATCH 1/2] core done --- src/main/java/com/booleanuk/api/Main.java | 12 +++++ .../com/booleanuk/api/products/Product.java | 48 +++++++++++++++++ .../api/products/ProductController.java | 42 +++++++++++++++ .../api/products/ProductRepository.java | 54 +++++++++++++++++++ 4 files changed, 156 insertions(+) create mode 100644 src/main/java/com/booleanuk/api/Main.java create mode 100644 src/main/java/com/booleanuk/api/products/Product.java create mode 100644 src/main/java/com/booleanuk/api/products/ProductController.java create mode 100644 src/main/java/com/booleanuk/api/products/ProductRepository.java diff --git a/src/main/java/com/booleanuk/api/Main.java b/src/main/java/com/booleanuk/api/Main.java new file mode 100644 index 0000000..e6436b8 --- /dev/null +++ b/src/main/java/com/booleanuk/api/Main.java @@ -0,0 +1,12 @@ +package com.booleanuk.api; + +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/Product.java b/src/main/java/com/booleanuk/api/products/Product.java new file mode 100644 index 0000000..16b23e8 --- /dev/null +++ b/src/main/java/com/booleanuk/api/products/Product.java @@ -0,0 +1,48 @@ +package com.booleanuk.api.products; + +public class Product { + private static int nextId = 1; + private int id; + private String name; + private String category; + private int price; + + public Product() { + } + + public Product(String name, String category, int price){ + this.id = nextId; + nextId+=1; + this.name = name; + this.category = category; + this.price = price; + } + + public int getId(){ + return this.id; + } + + public String getName(){ + return this.name; + } + + public void setName(String newName){ + this.name = newName; + } + + public String getCategory(){ + return this.category; + } + + public void setCategory(String newCategory){ + this.category = newCategory; + } + + public int getPrice(){ + return this.price; + } + + public void setPrice(int newPrice){ + this.price = newPrice; + } +} diff --git a/src/main/java/com/booleanuk/api/products/ProductController.java b/src/main/java/com/booleanuk/api/products/ProductController.java new file mode 100644 index 0000000..3fba5df --- /dev/null +++ b/src/main/java/com/booleanuk/api/products/ProductController.java @@ -0,0 +1,42 @@ +package com.booleanuk.api.products; + + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("products") +public class ProductController { + private ProductRepository productRepo = new ProductRepository(); + + @GetMapping + public List getAllProducts(){ + return this.productRepo.getAll(); + } + + @GetMapping("/{id}") + public Product getOneProduct(@PathVariable(name = "id") int id){ + return this.productRepo.getOne(id); + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public Product createOneProduct(@RequestBody Product product){ + return this.productRepo.createProduct(product.getName(), product.getCategory(), product.getPrice()); + } + + @PutMapping("/{id}") + @ResponseStatus(HttpStatus.CREATED) + public Product updateOneProduct(@PathVariable(name = "id") int id, @RequestBody Product product){ + return this.productRepo.updateProduct(id, product); + } + + @DeleteMapping("/{id}") + public Product deleteOneProduct(@PathVariable(name = "id") int id){ + return this.productRepo.deleteProduct(id); + } + + +} diff --git a/src/main/java/com/booleanuk/api/products/ProductRepository.java b/src/main/java/com/booleanuk/api/products/ProductRepository.java new file mode 100644 index 0000000..4e67f4d --- /dev/null +++ b/src/main/java/com/booleanuk/api/products/ProductRepository.java @@ -0,0 +1,54 @@ +package com.booleanuk.api.products; + + +import java.util.ArrayList; + +public class ProductRepository { + + private ArrayList products = new ArrayList<>(){{ + add(new Product("How to build APIs", "Book", 1500)); + add(new Product("Elden Ring", "Game", 90)); + }}; + + public Product createProduct(String name, String category, int price){ + Product product = new Product(name, category, price); + this.products.add(product); + return product; + } + + public ArrayList getAll(){ + return this.products; + } + + public Product getOne(int id){ + for (Product p : products){ + if (p.getId() == id){ + return p; + } + } + return null; + } + + public Product updateProduct(int id, Product product){ + for (Product p : products){ + if (p.getId() == id){ + p.setName(product.getName()); + p.setCategory(product.getCategory()); + p.setPrice(product.getPrice()); + return p; + } + } + return null; + } + + public Product deleteProduct(int id){ + for (Product p : products){ + if (p.getId() == id){ + products.remove(p); + return p; + } + } + return null; + } + +} From bec38eeec55b38cbc54c64f2d2ea30d8e45be453 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Mon, 20 Jan 2025 15:19:27 +0100 Subject: [PATCH 2/2] extension done --- .../com/booleanuk/api/products/Product.java | 5 +-- .../api/products/ProductController.java | 7 ++-- .../api/products/ProductRepository.java | 35 ++++++++++++++++--- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/booleanuk/api/products/Product.java b/src/main/java/com/booleanuk/api/products/Product.java index 16b23e8..c4f7a5e 100644 --- a/src/main/java/com/booleanuk/api/products/Product.java +++ b/src/main/java/com/booleanuk/api/products/Product.java @@ -2,14 +2,11 @@ public class Product { private static int nextId = 1; - private int id; + private final int id; private String name; private String category; private int price; - public Product() { - } - public Product(String name, String category, int price){ this.id = nextId; nextId+=1; diff --git a/src/main/java/com/booleanuk/api/products/ProductController.java b/src/main/java/com/booleanuk/api/products/ProductController.java index 3fba5df..0116784 100644 --- a/src/main/java/com/booleanuk/api/products/ProductController.java +++ b/src/main/java/com/booleanuk/api/products/ProductController.java @@ -12,7 +12,10 @@ public class ProductController { private ProductRepository productRepo = new ProductRepository(); @GetMapping - public List getAllProducts(){ + public List getProducts(@RequestParam (required = false) String category){ + if (category != null){ + return this.productRepo.getByCategory(category); + } return this.productRepo.getAll(); } @@ -24,7 +27,7 @@ public Product getOneProduct(@PathVariable(name = "id") int id){ @PostMapping @ResponseStatus(HttpStatus.CREATED) public Product createOneProduct(@RequestBody Product product){ - return this.productRepo.createProduct(product.getName(), product.getCategory(), product.getPrice()); + return this.productRepo.createProduct(product); } @PutMapping("/{id}") diff --git a/src/main/java/com/booleanuk/api/products/ProductRepository.java b/src/main/java/com/booleanuk/api/products/ProductRepository.java index 4e67f4d..f42bbb0 100644 --- a/src/main/java/com/booleanuk/api/products/ProductRepository.java +++ b/src/main/java/com/booleanuk/api/products/ProductRepository.java @@ -1,6 +1,9 @@ package com.booleanuk.api.products; +import org.springframework.http.HttpStatus; +import org.springframework.web.server.ResponseStatusException; + import java.util.ArrayList; public class ProductRepository { @@ -10,8 +13,12 @@ public class ProductRepository { add(new Product("Elden Ring", "Game", 90)); }}; - public Product createProduct(String name, String category, int price){ - Product product = new Product(name, category, price); + public Product createProduct(Product product){ + for (Product p : products){ + if (p.getName().equals(product.getName())){ + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Provided name already exists!"); + } + } this.products.add(product); return product; } @@ -20,25 +27,43 @@ public ArrayList getAll(){ return this.products; } + public ArrayList getByCategory(String category){ + ArrayList categoryList = new ArrayList<>(); + for (Product p : products){ + if (p.getCategory().toLowerCase().equals(category)){ + categoryList.add(p); + } + } + if (!categoryList.isEmpty()){ + return categoryList; + } + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No products of the provided category were found!"); + } + public Product getOne(int id){ for (Product p : products){ if (p.getId() == id){ return p; } } - return null; + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Product not found!"); } public Product updateProduct(int id, Product product){ for (Product p : products){ if (p.getId() == id){ + for (Product ps : products){ + if (ps.getName().equals(product.getName()) && ps != p){ + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Product with provided name already exists!"); + } + } p.setName(product.getName()); p.setCategory(product.getCategory()); p.setPrice(product.getPrice()); return p; } } - return null; + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Product not found!"); } public Product deleteProduct(int id){ @@ -48,7 +73,7 @@ public Product deleteProduct(int id){ return p; } } - return null; + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Product not found!"); } }