From 3afd36cb06de608f6ad69046ebef42563b3718c5 Mon Sep 17 00:00:00 2001 From: Camille31 Date: Sun, 27 Nov 2016 11:10:31 +0100 Subject: [PATCH 1/2] Add a view to show user movie ratings and add/update ratings. --- .../controller/MainController.java | 44 ++++++++++++ .../movierecommender/model/Movie.java | 2 +- .../movierecommender/model/Rating.java | 67 +++++++++++++++++++ .../webapp/WEB-INF/views/movieratings.jsp | 57 ++++++++++++++++ 4 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/camillepradel/movierecommender/model/Rating.java create mode 100644 src/main/webapp/WEB-INF/views/movieratings.jsp diff --git a/src/main/java/com/camillepradel/movierecommender/controller/MainController.java b/src/main/java/com/camillepradel/movierecommender/controller/MainController.java index aa61d14..4069439 100644 --- a/src/main/java/com/camillepradel/movierecommender/controller/MainController.java +++ b/src/main/java/com/camillepradel/movierecommender/controller/MainController.java @@ -5,12 +5,15 @@ import java.util.LinkedList; import java.util.List; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.bind.annotation.RequestMethod; import com.camillepradel.movierecommender.model.Genre; import com.camillepradel.movierecommender.model.Movie; +import com.camillepradel.movierecommender.model.Rating; @Controller public class MainController { @@ -48,4 +51,45 @@ public class MainController { mv.addObject("movies", movies); return mv; } + + @RequestMapping(value = "/movieratings", method = RequestMethod.GET) + public ModelAndView showMoviesRattings( + @RequestParam(value = "user_id", required = true) Integer userId) { + System.out.println("GET /movieratings for user " + userId); + + // TODO: write query to retrieve all movies from DB + List allMovies = new LinkedList(); + Genre genre0 = new Genre(0, "genre0"); + Genre genre1 = new Genre(1, "genre1"); + Genre genre2 = new Genre(2, "genre2"); + allMovies.add(new Movie(0, "Titre 0", Arrays.asList(new Genre[] {genre0, genre1}))); + allMovies.add(new Movie(1, "Titre 1", Arrays.asList(new Genre[] {genre0, genre2}))); + allMovies.add(new Movie(2, "Titre 2", Arrays.asList(new Genre[] {genre1}))); + allMovies.add(new Movie(3, "Titre 3", Arrays.asList(new Genre[] {genre0, genre1, genre2}))); + + // TODO: write query to retrieve all ratings from the specified user + List ratings = new LinkedList(); + ratings.add(new Rating(new Movie(0, "Titre 0", Arrays.asList(new Genre[] {genre0, genre1})), userId, 3)); + ratings.add(new Rating(new Movie(2, "Titre 2", Arrays.asList(new Genre[] {genre1})), userId, 4)); + + ModelAndView mv = new ModelAndView("movieratings"); + mv.addObject("userId", userId); + mv.addObject("allMovies", allMovies); + mv.addObject("ratings", ratings); + + return mv; + } + + @RequestMapping(value = "/movieratings", method = RequestMethod.POST) + public String saveOrUpdateRating(@ModelAttribute("rating") Rating rating) { + System.out.println("POST /movieratings for user " + rating.getUserId() + + ", movie " + rating.getMovie().getId() + + ", score " + rating.getScore()); + + // TODO: add query which + // - add rating between specified user and movie if it doesn't exist + // - update it if it does exist + + return "redirect:/movieratings?user_id=" + rating.getUserId(); + } } diff --git a/src/main/java/com/camillepradel/movierecommender/model/Movie.java b/src/main/java/com/camillepradel/movierecommender/model/Movie.java index 7ef72be..bbf0407 100644 --- a/src/main/java/com/camillepradel/movierecommender/model/Movie.java +++ b/src/main/java/com/camillepradel/movierecommender/model/Movie.java @@ -14,7 +14,7 @@ public class Movie { this.genres = genres; } - public long getId() { + public int getId() { return this.id; } diff --git a/src/main/java/com/camillepradel/movierecommender/model/Rating.java b/src/main/java/com/camillepradel/movierecommender/model/Rating.java new file mode 100644 index 0000000..5171bc7 --- /dev/null +++ b/src/main/java/com/camillepradel/movierecommender/model/Rating.java @@ -0,0 +1,67 @@ +package com.camillepradel.movierecommender.model; + +import java.util.Arrays; + +public class Rating { + + private Movie movie; + private int userId; + private int score; + + public Rating() { + this.movie = null; + this.userId = 0; + this.score = 0; + } + + public Rating(Movie movie, int userId, int score) { + this.movie = movie; + this.userId = userId; + this.score = score; + } + + public Rating(Movie movie, int userId) { + this.movie = movie; + this.userId = userId; + this.score = 0; + } + + public Movie getMovie() { + return this.movie; + } + + public void setMovie(Movie movie) { + this.movie = movie; + } + + // pseudo getter and setter for movie id + // (in order to automatically serialize Rating object on form submission) + + public int getMovieId() { + return this.movie.getId(); + } + + public void setMovieId(int movieId) { + // TODO: get movie with id movieId from database + String title = "Titre"; + Genre genre0 = new Genre(0, "genre0"); + Genre genre1 = new Genre(1, "genre1"); + this.movie = new Movie(movieId, title, Arrays.asList(new Genre[] {genre0, genre1})); + } + + public int getUserId() { + return this.userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public int getScore() { + return this.score; + } + + public void setScore(int score) { + this.score = score; + } +} diff --git a/src/main/webapp/WEB-INF/views/movieratings.jsp b/src/main/webapp/WEB-INF/views/movieratings.jsp new file mode 100644 index 0000000..f811aa8 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/movieratings.jsp @@ -0,0 +1,57 @@ +<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> + + + +Films + + + +

+ Vos films notés +

+
    + +
  • + ${rating.getMovie().id} - ${rating.score} +
  • +
    +
+ +

+ Ajouter une note +

+
    + + + + + + + + + +
  • + ${movie.title} - ${score} (user id: ${userId}, movie id: ${movie.id}) +
    + + + checked> + checked> + checked> + checked> + checked> +
    +
      + +
    • + ${genre.name} +
    • +
      +
    +
  • +
    +
+ + \ No newline at end of file From fb23a163741baf8fe514ea4908e1230f24b28155 Mon Sep 17 00:00:00 2001 From: Camille31 Date: Mon, 28 Nov 2016 23:59:51 +0100 Subject: [PATCH 2/2] Add a view to show user recommendations. --- .../controller/MainController.java | 32 +++++++++++++++++++ .../webapp/WEB-INF/views/recommendations.jsp | 23 +++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 src/main/webapp/WEB-INF/views/recommendations.jsp diff --git a/src/main/java/com/camillepradel/movierecommender/controller/MainController.java b/src/main/java/com/camillepradel/movierecommender/controller/MainController.java index 4069439..9a6dc34 100644 --- a/src/main/java/com/camillepradel/movierecommender/controller/MainController.java +++ b/src/main/java/com/camillepradel/movierecommender/controller/MainController.java @@ -92,4 +92,36 @@ public class MainController { return "redirect:/movieratings?user_id=" + rating.getUserId(); } + + @RequestMapping(value = "/recommendations", method = RequestMethod.GET) + public ModelAndView ProcessRecommendations( + @RequestParam(value = "user_id", required = true) Integer userId, + @RequestParam(value = "processing_mode", required = false, defaultValue = "0") Integer processingMode){ + System.out.println("GET /movieratings for user " + userId); + + // TODO: process recommendations for specified user exploiting other users ratings + // use different methods depending on processingMode parameter + Genre genre0 = new Genre(0, "genre0"); + Genre genre1 = new Genre(1, "genre1"); + Genre genre2 = new Genre(2, "genre2"); + List recommendations = new LinkedList(); + String titlePrefix; + if (processingMode.equals(0)) + titlePrefix = "0_"; + else if (processingMode.equals(1)) + titlePrefix = "1_"; + else if (processingMode.equals(2)) + titlePrefix = "2_"; + else + titlePrefix = "default_"; + recommendations.add(new Rating(new Movie(0, titlePrefix + "Titre 0", Arrays.asList(new Genre[] {genre0, genre1})), userId, 5)); + recommendations.add(new Rating(new Movie(1, titlePrefix + "Titre 1", Arrays.asList(new Genre[] {genre0, genre2})), userId, 5)); + recommendations.add(new Rating(new Movie(2, titlePrefix + "Titre 2", Arrays.asList(new Genre[] {genre1})), userId, 4)); + recommendations.add(new Rating(new Movie(3, titlePrefix + "Titre 3", Arrays.asList(new Genre[] {genre0, genre1, genre2})), userId, 3)); + + ModelAndView mv = new ModelAndView("recommendations"); + mv.addObject("recommendations", recommendations); + + return mv; + } } diff --git a/src/main/webapp/WEB-INF/views/recommendations.jsp b/src/main/webapp/WEB-INF/views/recommendations.jsp new file mode 100644 index 0000000..0d93e2e --- /dev/null +++ b/src/main/webapp/WEB-INF/views/recommendations.jsp @@ -0,0 +1,23 @@ +<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> + + + +Recommandations + + + +

+ Vos recommandations +

+
    + +
  • + ${recommendation.getMovie().title} +
  • +
    +
+ + + \ No newline at end of file