feat: RecipeController with GET, POST, PUT, DELETE
TODO: WebSockets updates should be propagated after POST/PUT/DELETE operations
This commit is contained in:
parent
2d9af65f28
commit
4e23d913d1
1 changed files with 121 additions and 0 deletions
121
server/src/main/java/server/api/RecipeController.java
Normal file
121
server/src/main/java/server/api/RecipeController.java
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
package server.api;
|
||||||
|
|
||||||
|
import commons.Recipe;
|
||||||
|
|
||||||
|
import org.springframework.data.domain.PageRequest;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PutMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import server.database.RecipeRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/recipe")
|
||||||
|
public class RecipeController {
|
||||||
|
private final RecipeRepository recipeRepository; // JPA repository used in this controller
|
||||||
|
|
||||||
|
public RecipeController(RecipeRepository recipeRepository) {
|
||||||
|
this.recipeRepository = recipeRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapping for <code>GET /recipe/{id}</code>
|
||||||
|
* <p>
|
||||||
|
* Gets a specific recipe by its unique id.
|
||||||
|
* </p>
|
||||||
|
* @param id id of the recipe
|
||||||
|
* @return The recipe if it exists in the repository; otherwise returns 404 Not Found status
|
||||||
|
*/
|
||||||
|
@GetMapping("/recipe/{id}")
|
||||||
|
public ResponseEntity<Recipe> getRecipe(@PathVariable Long id) {
|
||||||
|
if (!recipeRepository.existsById(id)) {
|
||||||
|
return ResponseEntity.notFound().build();
|
||||||
|
}
|
||||||
|
return ResponseEntity.ok(recipeRepository.findById(id).get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapping for <code>GET /recipes(?limit=)</code>
|
||||||
|
* <p>
|
||||||
|
* If the limit parameter is unspecified, return all recipes in the repository.
|
||||||
|
* @param limit Integer limit of items you want to get
|
||||||
|
* @return The list of recipes
|
||||||
|
*/
|
||||||
|
@GetMapping("/recipes")
|
||||||
|
public ResponseEntity<List<Recipe>> getRecipes(@RequestParam Optional<Integer> limit) {
|
||||||
|
if (limit.isPresent()) {
|
||||||
|
return ResponseEntity.ok(
|
||||||
|
recipeRepository.findAll(
|
||||||
|
PageRequest.of(0, limit.get())
|
||||||
|
).toList());
|
||||||
|
}
|
||||||
|
return ResponseEntity.ok(recipeRepository.findAll());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapping for <code>POST /recipe/{id}</code>
|
||||||
|
* @param id The recipe id to replace
|
||||||
|
* @param recipe The new recipe to be replaced from the original
|
||||||
|
* @return The changed recipe; returns 400 Bad Request if the recipe does not exist
|
||||||
|
*/
|
||||||
|
@PostMapping("/recipe/{id}")
|
||||||
|
public ResponseEntity<Recipe> updateRecipe(@PathVariable Long id, @RequestBody Recipe recipe) {
|
||||||
|
if (!recipeRepository.existsById(id)) {
|
||||||
|
return ResponseEntity.badRequest().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Send WS update to all subscribers with the updated recipe
|
||||||
|
|
||||||
|
return ResponseEntity.ok(recipeRepository.save(recipe));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapping for <code>PUT /recipe/new</code>
|
||||||
|
* <p>
|
||||||
|
* Inserts a new recipe into the repository
|
||||||
|
* </p>
|
||||||
|
* @param recipe The new recipe as a request body
|
||||||
|
* @return 200 OK with the recipe you added; or 400 Bad Request if the recipe already exists
|
||||||
|
*/
|
||||||
|
@PutMapping("/recipe/new")
|
||||||
|
public ResponseEntity<Recipe> createRecipe(@RequestBody Recipe recipe) {
|
||||||
|
if (recipeRepository.existsById(recipe.getId())) {
|
||||||
|
return ResponseEntity.badRequest().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Send WS update to all subscribers with the new recipe
|
||||||
|
|
||||||
|
return ResponseEntity.ok(recipeRepository.save(recipe));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapping for <code>DELETE /recipe/{id}</code>
|
||||||
|
* <p>
|
||||||
|
* Deletes a recipe identified by its <code>id</code>.
|
||||||
|
* </p>
|
||||||
|
* @param id The id of the recipe to be deleted.
|
||||||
|
* @return 200 OK with the recipe that was deleted; or 400 Bad Request if the recipe doesn't exist.
|
||||||
|
*/
|
||||||
|
@DeleteMapping("/recipe/{id}")
|
||||||
|
public ResponseEntity<Recipe> deleteRecipe(@PathVariable Long id) {
|
||||||
|
if (!recipeRepository.existsById(id)) {
|
||||||
|
return ResponseEntity.badRequest().build();
|
||||||
|
}
|
||||||
|
Recipe removedRecipe = recipeRepository.findById(id).get();
|
||||||
|
recipeRepository.delete(removedRecipe);
|
||||||
|
|
||||||
|
// TODO: Send WS update to propagate deletion
|
||||||
|
return ResponseEntity.ok(removedRecipe);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue