Reputation: 73
I'm starting with Spring Boot on a RESTful system. I have two tables "users" and "permissions" that have a many-to-many relationship with an intermediate table "user_permission" which only has the foreign keys id_user and id_permission.
I have already managed to make it show me what permissions the user has from GET to "users/{id}/permissions", but I still do not know how to add a relationship with POST or remove it with DELETE. I've tried doing it with native Querys but I read that INSERT doesn't exist in JPA. Any suggestions on how to implement it?
What I want to do is create a relationship using POST on: user/{id}/permission/{id} and remove that relationship using DELETE with the same url.
This is my User controller :
@RestController
@RequestMapping("/permisos-api")
public class UsuarioController {
@Autowired
UsuarioRepository userRepository;
@GetMapping("/usuarios")
public List<Usuario> getAllUsuarios() {
return userRepository.findAll();
}
@GetMapping("/usuarios/{id}")
public ResponseEntity<Usuario> getUsuarioById(@PathVariable(value = "id")
Integer userId) {
Usuario user = userRepository.findOne(userId);
if(user == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok().body(user);
}
@PostMapping("/usuarios")
public Usuario createUsuario(@Valid @RequestBody Usuario user) {
return userRepository.save(user);
}
@PutMapping("/usuarios/{id}")
public ResponseEntity<Usuario> updateUsuario(@PathVariable(value = "id")
Integer userId, @Valid @RequestBody Usuario
userDetails) {
Usuario user = userRepository.findOne(userId);
if(user == null) {
return ResponseEntity.notFound().build();
}
user.setNombre(userDetails.getNombre());
user.setStatus(userDetails.getStatus());
Usuario updatedUser = userRepository.save(user);
return ResponseEntity.ok(updatedUser);
}
@DeleteMapping("/usuarios/{id}")
public ResponseEntity<Usuario> deleteUusario(@PathVariable(value = "id")
Integer userId) {
Usuario user = userRepository.findOne(userId);
if(user == null) {
return ResponseEntity.notFound().build();
}
userRepository.delete(user);
return ResponseEntity.ok().build();
}
@GetMapping("/usuarios/{id}/permisos")
public ResponseEntity<Collection<Permiso>>
getPermisosOfUsuario(@PathVariable(value = "id") Integer userId) {
Usuario user = userRepository.findOne(userId);
if(user == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok().body(user.getPermisoCollection());
}
}
Thanks.
Upvotes: 0
Views: 1176
Reputation: 73
I've solved my problem using the objects as @JB Nizet mentioned. That's how it worked:
@PostMapping("/usuarios/{idUsuario}/permisos")
public Usuario addPermisoUsuario(@PathVariable(value = "idUsuario") Integer
userId, @RequestBody Permiso permiso) {
Usuario user = userRepository.findOne(userId);
Permiso permisoExistente =
permisoRepository.findOne(permiso.getIdPermiso());
user.getPermisoCollection().add(permisoExistente);
return userRepository.save(user);
}
@DeleteMapping("/usuarios/{idUsuario}/permisos/{idPermiso}")
public Usuario deletePermisoUsuario(@PathVariable(value = "idUsuario")
Integer userId, @PathVariable(value = "idPermiso")
Integer permisoId, @RequestBody Permiso permiso) {
Usuario user = userRepository.findOne(userId);
Permiso permisoEliminar = permisoRepository.findOne(permisoId);
user.getPermisoCollection().remove(permisoEliminar);
return userRepository.save(user);
}
Upvotes: 1