cesardl/sakila-jee

View on GitHub
src/main/java/org/sanmarcux/samples/sakila/controller/ActorRestController.java

Summary

Maintainability
A
1 hr
Test Coverage
package org.sanmarcux.samples.sakila.controller;

import org.sanmarcux.samples.sakila.business.ActorBusiness;
import org.sanmarcux.samples.sakila.business.FilmBusiness;
import org.sanmarcux.samples.sakila.dto.ActorDTO;
import org.sanmarcux.samples.sakila.dto.FilmDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

import javax.validation.Valid;
import java.net.URI;
import java.util.List;

/**
 * Created on 21/04/2018.
 *
 * @author Cesardl
 */
@RestController
@RequestMapping("/actors")
public class ActorRestController {

    private static final Logger LOG = LoggerFactory.getLogger(ActorRestController.class);

    private final ActorBusiness actorBusiness;
    private final FilmBusiness filmBusiness;

    @Autowired
    public ActorRestController(ActorBusiness actorBusiness, FilmBusiness filmBusiness) {
        this.actorBusiness = actorBusiness;
        this.filmBusiness = filmBusiness;
    }

    /**
     * List of actors obtained from database.
     *
     * @return actors
     */
    @GetMapping
    @ResponseBody
    public ResponseEntity<Page<ActorDTO>> listActors(final Pageable pageable) {
        LOG.info("Invoking Rest Service listActors");
        Page<ActorDTO> actors = actorBusiness.list(pageable);

        if (actors.hasContent()) {
            return ResponseEntity.ok().body(actors);
        }
        return ResponseEntity.noContent().build();
    }

    /**
     * Create a new actor and save it in the database.
     *
     * @param payload request body
     * @return a created actor
     */
    @PostMapping
    public ResponseEntity<?> createActor(@Valid @RequestBody final ActorDTO payload) {
        LOG.info("Invoking Rest Service createActor");

        ActorDTO result = actorBusiness.create(payload);

        URI location = ServletUriComponentsBuilder
                .fromCurrentRequest().path("/{actorId}")
                .buildAndExpand(result.getActorId()).toUri();

        return ResponseEntity.created(location).build();
    }

    /**
     * Read an actor by id from the database.
     *
     * @param actorId actor resource id
     * @return an actor
     */
    @GetMapping("/{actorId}")
    @ResponseBody
    public ActorDTO getActor(@PathVariable Short actorId) {
        LOG.info("Invoking Rest Service getActor");
        return actorBusiness.get(actorId);
    }

    /**
     * Update an actor record in the database.
     *
     * @param actorId actor resource id
     * @param payload request body
     * @return a modified actor
     */
    @PatchMapping("/{actorId}")
    public ActorDTO modifyActor(@PathVariable final Short actorId, @RequestBody final ActorDTO payload) {
        LOG.info("Invoking Rest Service modifyActor");
        return actorBusiness.modify(actorId, payload);
    }

    /**
     * Delete an actor from the database.
     *
     * @param actorId actor resource id
     */
    @DeleteMapping("/{actorId}")
    public ResponseEntity<?> deleteActor(@PathVariable final Short actorId) {
        LOG.info("Invoking Rest Service deleteActor");
        actorBusiness.delete(actorId);

        return ResponseEntity.ok().build();
    }

    @GetMapping("/{actorId}/films")
    public ResponseEntity<List<FilmDTO>> listActorFilms(@PathVariable final Short actorId) {
        LOG.info("Invoking Rest Service listActorFilms");
        List<FilmDTO> films = filmBusiness.findFilmsByActor(actorId);
        if (films.isEmpty()) {
            return ResponseEntity.noContent().build();
        }
        return ResponseEntity.ok().body(films);
    }

    @GetMapping("/{actorId}/films/{filmId}")
    public FilmDTO getActorFilm(@PathVariable final Short actorId, @PathVariable final Short filmId) {
        LOG.info("Invoking Rest Service getActorFilm");

        return actorBusiness.getFilm(actorId, filmId);
    }

    @PutMapping("/{actorId}/films/{filmId}")
    public ResponseEntity<?> modifyActorFilm(@PathVariable final Short actorId, @PathVariable final Short filmId, @RequestBody final FilmDTO payload) {
        LOG.info("Invoking Rest Service modifyActorFilm");

        actorBusiness.createFilmParticipation(actorId, filmId);

        return ResponseEntity.ok().build();
    }

    @DeleteMapping("/{actorId}/films/{filmId}")
    public ResponseEntity<?> deleteActorFilm(@PathVariable final Short actorId, @PathVariable final Short filmId) {
        LOG.info("Invoking Rest Service deleteActorFilm");
        actorBusiness.deleteFilm(actorId, filmId);

        return ResponseEntity.ok().build();
    }
}