diff --git a/wtf/src/main/java/com/example/wtf/controller/CharacterController.java b/wtf/src/main/java/com/example/wtf/controller/CharacterController.java new file mode 100644 index 0000000..31d6f92 --- /dev/null +++ b/wtf/src/main/java/com/example/wtf/controller/CharacterController.java @@ -0,0 +1,114 @@ +package com.example.wtf.controller; + +import com.example.wtf.exception.ResourceForbidden; +import com.example.wtf.exception.ResourceNotFound; +import com.example.wtf.model.Character; +import com.example.wtf.repository.CharacterRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; + +@RestController +@RequestMapping("/characters") +public class CharacterController { + + @Autowired + private CharacterRepository repository; + + @GetMapping("/get") + public @ResponseBody CollectionModel> getCharacters() { + List> characters = new ArrayList<>(); + + for (Character character : repository.findAll()) { + EntityModel characterResource = EntityModel.of( + character, + linkTo(methodOn(CharacterController.class).getCharacter(character.getId())).withSelfRel(), + linkTo(methodOn(CharacterController.class).updateCharacter(character.getId(), new Character())).withRel("Update character"), + linkTo(methodOn(CharacterController.class).deleteCharacter(character.getId())).withRel("Delete character") + ); + characters.add(characterResource); + } + + return CollectionModel.of( + characters, + linkTo(methodOn(CharacterController.class).addCharacter(new Character())).withRel("Add Character") + ); + } + + @GetMapping("/get/{id}") + public @ResponseBody EntityModel getCharacter(@PathVariable Long id) { + Character character = repository.findById(id) + .orElseThrow(() -> new ResourceNotFound("Character not found")); + + return EntityModel.of( + character, + linkTo(methodOn(CharacterController.class).updateCharacter(character.getId(), new Character())).withRel("Update character"), + linkTo(methodOn(CharacterController.class).deleteCharacter(character.getId())).withRel("Delete character"), + linkTo(methodOn(CharacterController.class).getCharacters()).withRel("Characters") + ); + } + + @PostMapping("/add") + public @ResponseBody EntityModel addCharacter(@RequestBody Character character) { + + if (repository.existsByName(character.getName())) { + throw new ResourceForbidden("Character forbidden"); + } + + repository.save(character); + + return EntityModel.of( + character, + linkTo(methodOn(CharacterController.class).getCharacter(character.getId())).withSelfRel(), + linkTo(methodOn(CharacterController.class).updateCharacter(character.getId(), new Character())).withRel("Update character"), + linkTo(methodOn(CharacterController.class).deleteCharacter(character.getId())).withRel("Delete character"), + linkTo(methodOn(CharacterController.class).getCharacters()).withRel("Characters") + ); + } + + @PutMapping("/update/{id}") + public @ResponseBody EntityModel updateCharacter(@PathVariable Long id, + @RequestBody Character update) { + Character character = repository.findById(id) + .orElseThrow(() -> new ResourceNotFound("Character not found")); + + if (update.getName() != null && !update.getName().isEmpty()) { + if (repository.existsByName(character.getName())) { + throw new ResourceForbidden("Character forbidden"); + } + character.setName(update.getName()); + } + if (update.getImage() != null) { + character.setImage(update.getImage()); + } + + repository.save(character); + + return EntityModel.of( + character, + linkTo(methodOn(CharacterController.class).getCharacter(id)).withSelfRel(), + linkTo(methodOn(CharacterController.class).deleteCharacter(id)).withRel("Delete character"), + linkTo(methodOn(CharacterController.class).getCharacters()).withRel("Characters") + ); + } + + @DeleteMapping("/delete/{id}") + public @ResponseBody EntityModel deleteCharacter(@PathVariable Long id) { + Character character = repository.findById(id) + .orElseThrow(() -> new ResourceNotFound("Character not found")); + + repository.delete(character); + + return EntityModel.of( + character, + linkTo(methodOn(CharacterController.class).getCharacters()).withRel("Characters") + ); + } +} \ No newline at end of file diff --git a/wtf/src/main/java/com/example/wtf/model/Character.java b/wtf/src/main/java/com/example/wtf/model/Character.java new file mode 100644 index 0000000..e68da72 --- /dev/null +++ b/wtf/src/main/java/com/example/wtf/model/Character.java @@ -0,0 +1,31 @@ +package com.example.wtf.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Character { + + @GeneratedValue(strategy = GenerationType.IDENTITY) + private @Id Long id; + + private String name; + + @ManyToOne(cascade = CascadeType.ALL) + private Image image; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public String getName() { return name; } + public void setName(String name) { this.name = name; } + + public Image getImage() { return image; } + public void setImage(Image image) { this.image = image; } + +} \ No newline at end of file diff --git a/wtf/src/main/java/com/example/wtf/repository/CharacterRepository.java b/wtf/src/main/java/com/example/wtf/repository/CharacterRepository.java new file mode 100644 index 0000000..ce35d62 --- /dev/null +++ b/wtf/src/main/java/com/example/wtf/repository/CharacterRepository.java @@ -0,0 +1,10 @@ +package com.example.wtf.repository; +import com.example.wtf.model.Character; +import org.springframework.data.repository.CrudRepository; + +import java.util.Optional; + +public interface CharacterRepository extends CrudRepository { + Optional findById(Long id); + boolean existsByName(String name); +}