Carlos Ivan Rangel
Carlos Ivan Rangel

Reputation: 73

Spring JPA Implement POST DELETE on intermediate table

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

Answers (1)

Carlos Ivan Rangel
Carlos Ivan Rangel

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

Related Questions