From a4b3af8a663508d1c11a3b1b864b3cc5283b347c Mon Sep 17 00:00:00 2001 From: Connor Stokes Date: Mon, 2 Sep 2024 16:23:13 +0100 Subject: [PATCH] Core and extension --- build.gradle | 3 + src/main/java/com/booleanuk/api/Main.java | 11 +++ .../com/booleanuk/api/Products/Product.java | 17 +++++ .../api/Products/ProductController.java | 74 +++++++++++++++++++ .../api/Products/ProductRepository.java | 59 +++++++++++++++ 5 files changed, 164 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/build.gradle b/build.gradle index d1f7789..b1efc3d 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,9 @@ dependencies { developmentOnly 'org.springframework.boot:spring-boot-devtools' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + // https://mvnrepository.com/artifact/org.projectlombok/lombok + compileOnly 'org.projectlombok:lombok:1.18.34' + annotationProcessor 'org.projectlombok:lombok' } tasks.named('test') { 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..8e749e0 --- /dev/null +++ b/src/main/java/com/booleanuk/api/Main.java @@ -0,0 +1,11 @@ +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..eb9fe34 --- /dev/null +++ b/src/main/java/com/booleanuk/api/Products/Product.java @@ -0,0 +1,17 @@ +package com.booleanuk.api.Products; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Data +@AllArgsConstructor + +public class Product { + private int id; + private String name; + private String category; + private int price; + +} 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..d2d1b3b --- /dev/null +++ b/src/main/java/com/booleanuk/api/Products/ProductController.java @@ -0,0 +1,74 @@ +package com.booleanuk.api.Products; + +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 + @ResponseStatus(HttpStatus.OK) + public List getAll(@RequestParam(value = "category", required = false) String category) { + if (category != null) { + List products = this.repository.getAllByCategory(category); + if (products.isEmpty()) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No products of the provided category were found."); + } + return products; + } + return this.repository.getAll(); + } + + + @GetMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public Product getById(@PathVariable("id") int id) { + Product product = this.repository.find(id); + return product; + } + + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public Product create(@RequestBody Product product) { + return this.repository.create(product.getName(), product.getCategory(), product.getPrice()); + } + + + + @PutMapping("/{id}") + @ResponseStatus(HttpStatus.CREATED) + public Product putProduct(@PathVariable("id") int id, @RequestBody Product updatedProduct ) { + if(this.repository.find(updatedProduct.getName()).isPresent()){ + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Product with provided name already exists."); + }else{ + Product product = this.repository.find(id); + if(product != null){ + product.setName(updatedProduct.getName()); + product.setCategory(updatedProduct.getCategory()); + product.setPrice(updatedProduct.getPrice()); + return product; + }else{ + return null; + } + } + + } + + @DeleteMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public Product deleteProductFirstName(@PathVariable("id") int id) { + return this.repository.delete(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..505f98a --- /dev/null +++ b/src/main/java/com/booleanuk/api/Products/ProductRepository.java @@ -0,0 +1,59 @@ +package com.booleanuk.api.Products; + + + + + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Repository; +import org.springframework.web.server.ResponseStatusException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@Repository +public class ProductRepository { + private int idCounter = 1; + private List data = new ArrayList<>(); + public Product create(String name, String category, int price) { + Product product = new Product(this.idCounter++, name, category , price); + this.data.add(product); + return product; + } + public List getAll() { + return this.data; + } + public List getAllByCategory(String category) { + List productsMatching = new ArrayList<>(); + for (int i = 0; i < data.size(); i++) { + if(data.get(i).getCategory().equals(category)){ + productsMatching.add(data.get(i)); + } + } + return productsMatching; + } + + public Product find(int id) { + return this.data.stream() + .filter(product -> product.getId() == id) + .findFirst() + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Product not found.")); + } + public Optional find(String name) { + return this.data.stream() + .filter(product -> product.getName().equals(name)) + .findFirst(); + } + + public Product delete(int id) { + for (int i = 0; i < this.data.size(); i++) { + if(this.data.get(i).getId() == id){ + Product deletedProduct = this.data.get(i); + this.data.remove(i); + return deletedProduct; + } + } + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Product not found."); + } +}