feat : Add CharacterController

TommyVersion
tomivt 3 weeks ago
parent 53f9a0b8aa
commit b6e2601b90

@ -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<EntityModel<Character>> getCharacters() {
List<EntityModel<Character>> characters = new ArrayList<>();
for (Character character : repository.findAll()) {
EntityModel<Character> 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<Character> 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<Character> 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<Character> 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<Character> 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")
);
}
}

@ -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; }
}

@ -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<Character, Long> {
Optional<Character> findById(Long id);
boolean existsByName(String name);
}
Loading…
Cancel
Save