Untitled

 avatar
unknown
java
3 years ago
4.3 kB
3
Indexable
package me.xander.filmfestival;

import me.xander.filmfestival.domain.Film;
import me.xander.filmfestival.domain.Score;
import me.xander.filmfestival.service.FilmFestivalService;
import me.xander.filmfestival.validator.FilmValidator;
import me.xander.filmfestival.validator.ScoreValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.Comparator;
import java.util.List;

@Controller
@RequestMapping("/films")
@SessionAttributes()
public class FilmFestivalController {

    @Autowired
    private FilmValidator filmValidator;

    @Autowired
    private ScoreValidator scoreValidator;

    @Autowired
    private FilmFestivalService filmFestivalService;


    @GetMapping("/overzicht")
    public String overzicht(Model model, String addedFilm, String addedScore) {
        final List<Film> filmListSorted = filmFestivalService.getFilms().stream().sorted(Comparator.comparing(Film::getName)).toList();

        model.addAttribute("filmList", filmListSorted);
        model.addAttribute("magToevoegen", SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream().anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ROLE_ADMIN")));

        if (addedFilm != null) model.addAttribute("addedFilm", addedFilm);
        if (addedScore != null) model.addAttribute("addedScore", addedScore);

        return "films/overzicht";
    }

    @GetMapping("/ranking")
    public String ranking(Model model, String addedFilm, String addedScore) {

        final List<Film> filmListSorted = filmFestivalService.getFilms().stream()
                .sorted(Comparator.comparingInt(Film::getTotalScore).reversed().thenComparing(Film::getName))
                .toList();
        model.addAttribute("filmList", filmListSorted);
        return "films/ranking";
    }

    @GetMapping("/{id}")
    public String filmDetail(@PathVariable String id, Model model) {
        id = id.toLowerCase();

        if (!id.matches("[a-z][a-z]\\d\\d\\d")) {
            return "redirect:/films/overzicht";
        }

        final Film film = filmFestivalService.getFilm(id);
        if (film == null) return "redirect:/films/overzicht";

        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        model.addAttribute("score", filmFestivalService.getScoreFromUsername(film, authentication.getName()));
        model.addAttribute("film", film);
        model.addAttribute("algemeneScore", filmFestivalService.getScore(film));

        return "films/detail";
    }

    @GetMapping("/voegtoe")
    public String voegToe(Model model) {
        model.addAttribute("film", new Film());
        return "films/voegtoe";
    }

    @PostMapping("/voegtoe")
    public String voeg(@Valid Film film, BindingResult result, Model model) {

        filmValidator.validate(film, result);
        if (filmFestivalService.getFilms().stream().anyMatch(film1 -> film1.getFilmCode().equals(film.getFilmCode()))) {
            result.rejectValue("filmCode", "validation.filmcode.uniek");
        }

        if (result.hasErrors()) return "films/voegtoe";
        filmFestivalService.voegFilmToe(film);

        return "redirect:overzicht?addedFilm=" + film.getName();
    }

    @PostMapping("/addScore/{id}")
    public String addScore(Score score, @PathVariable String id, BindingResult result, Model model) {
        scoreValidator.validate(score, result);

        if (result.hasErrors()) return "/" + id;

        final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        final Film film = filmFestivalService.getFilm(id);
        filmFestivalService.addScore(film, authentication.getName(), score.getScore());

        return "redirect:/films/overzicht?addedScore=" + film.getName();
    }
}
Editor is loading...