diff --git a/backend/models/recommendation.js b/backend/models/recommendation.js new file mode 100644 index 0000000000000000000000000000000000000000..70f1e5c85e675c97523af7b6aed70ed6f40ecb96 --- /dev/null +++ b/backend/models/recommendation.js @@ -0,0 +1,17 @@ +const mongoose = require("mongoose"); +const { Schema } = mongoose; + +const RecoSchema = new mongoose.Schema( + { + recommended_movies: [{ type: Schema.Types.ObjectId, ref: "MovieModel" }], + user: [{ type: Schema.Types.ObjectId, ref: "UserModel" }], + }, + { + toJSON: { virtuals: true }, // So `res.json()` and other `JSON.stringify()` functions include virtuals + toObject: { virtuals: true }, // So `console.log()` and other functions that use `toObject()` include virtuals + } +); + +const RecoModel = mongoose.model("RecoModel", RecoSchema, "recommendations"); + +module.exports = RecoModel; diff --git a/backend/routes/recommendations.js b/backend/routes/recommendations.js new file mode 100644 index 0000000000000000000000000000000000000000..e3ab53818584b029eb7b39e514c9bcbe1919f0b4 --- /dev/null +++ b/backend/routes/recommendations.js @@ -0,0 +1,122 @@ +const express = require("express"); +const RecoModel = require("../models/recommendation"); +const router = express.Router(); + +// router.get("/", function (req, res) { +// RecoModel.find({}).then(function (users) { +// res.json(); +// }); +// }); + +router.get("/:userId", async function (req, res) { + const userId = await req.params["userId"]; + console.log(userId); + const userPopulated = await RecoModel.findOne({ user_id: userId }).populate( + "recommended_movies" + ); + res.send(userPopulated.recommended_movies); +}); + +// router.get("/isliked/:movieId/:userId", async function (req, res) { +// const userId = await req.params["userId"]; +// console.log(userId); +// const movieId = await req.params["movieId"]; +// const user = await UserModel.findById(userId); +// const movieOid = await MovieModel.findOne({ id: movieId }); +// const likedMovies = user.liked_movies; +// const myIndex = likedMovies.indexOf(movieOid._id) + 1; +// console.log(Boolean(myIndex)); +// res.send(Boolean(myIndex)); +// }); + +// router.post("/new", function (req, res) { +// const newUser = new UserModel({ +// email: req.body.email, +// firstName: req.body.firstName, +// lastName: req.body.lastName, +// }); + +// newUser +// .save() +// .then(function (newDocument) { +// res.status(201).json(newDocument); +// }) +// .catch(function (error) { +// console.error(error); +// if (error.code === 11000) { +// res.status(400).json({ +// message: `User with email "${newUser.email}" already exists`, +// }); +// } else { +// res.status(500).json({ message: "Error while creating the user" }); +// } +// }); +// }); + +// router.put("/like", async function (req, res) { +// try { +// const userId = await req.body.userId; +// const movieId = await req.body.movieId; +// const movieOid = await MovieModel.findOne({ id: movieId }); +// const user = await UserModel.findById(userId); +// const likedMovies = user.liked_movies; +// const myIndex = likedMovies.indexOf(movieOid._id); +// if (myIndex == -1) { +// likedMovies.splice(myIndex, 1); +// await UserModel.findByIdAndUpdate(userId, { +// liked_movies: likedMovies.concat([movieOid._id]), +// }); +// console.log(movieOid.title); +// console.log(movieOid._id); +// res.send("Done"); +// } else { +// console.log(movieOid.title); +// console.log(movieOid._id); +// console.log("This movie is already liked"); +// res.send("This movie is already liked"); +// } +// } catch (error) { +// console.log(error); +// res.send("Internal problem"); +// } +// }); + +// router.put("/unlike", async function (req, res) { +// try { +// const userId = await req.body.userId; +// const movieId = await req.body.movieId; +// const movieOid = await MovieModel.findOne({ id: movieId }); +// const user = await UserModel.findById(userId); +// const likedMovies = user.liked_movies; +// const myIndex = likedMovies.indexOf(movieOid._id); +// if (myIndex !== -1) { +// likedMovies.splice(myIndex, 1); +// await UserModel.findByIdAndUpdate(userId, { +// liked_movies: likedMovies, +// }); +// res.send("Done"); +// console.log(movieOid.title); +// console.log(movieOid._id); +// } else { +// res.send("This movie wasn't liked"); +// console.log(movieOid.title); +// console.log(movieOid._id); +// console.log("This movie wasn't liked"); +// } +// } catch (error) { +// console.log(error); +// res.send("Internal problem"); +// } +// }); + +// router.delete("/:userId", function (req, res) { +// UserModel.deleteOne({ _id: req.params.userId }) +// .then(function () { +// res.status(204).json({ message: "User successfully deleted" }); +// }) +// .catch(function () { +// res.status(500).json({ message: "Error while deleting the user" }); +// }); +// }); + +module.exports = router; diff --git a/backend/server.js b/backend/server.js index 16c7c87e0dd3c50565c73a13a74238d9a31f6d34..994951e04e30587e15ec8b45cb06c1bef13dce3c 100644 --- a/backend/server.js +++ b/backend/server.js @@ -6,6 +6,7 @@ const indexRouter = require("./routes/index"); const usersRouter = require("./routes/users"); const moviesRouter = require("./routes/movies"); const genresRouter = require("./routes/genres"); +const recoRouter = require("./routes/recommendations"); const routeNotFoundJsonHandler = require("./services/routeNotFoundJsonHandler"); const jsonErrorHandler = require("./services/jsonErrorHandler"); @@ -24,6 +25,7 @@ app.use("/users", usersRouter); app.use("/movies", moviesRouter); app.use("/genres", genresRouter); +app.use("/reco", recoRouter); // Register 404 middleware and error handler app.use(routeNotFoundJsonHandler); // this middleware must be registered after all routes to handle 404 correctly diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue index b4e4dcecf0e8a84eefa45c025d2ca93d8e652e3b..f71301bd25b2b9daad5c9c45655311793f519195 100644 --- a/frontend/src/views/Home.vue +++ b/frontend/src/views/Home.vue @@ -23,14 +23,14 @@ <MovieType /> </div> <div class="movie-affichage"> - <li v-for="movie in movies" :key="movie.id"> + <li v-for="reco in recos" :key="reco.id"> <p class="name"> - <h5 class="center"> {{ movie.title }}</h5> + <h5 class="center"> {{ reco.title }}</h5> </p> <p class="film"> - <router-link :to="'/movie/'+ movie.id"> + <router-link :to="'/movie/'+ reco.id"> <img - :src="'https://image.tmdb.org/t/p/original/' + movie.poster_path" + :src="'https://image.tmdb.org/t/p/original/' + reco.poster_path" withd="100" height="300" /> @@ -63,7 +63,9 @@ export default { return { moviename: "", movies: [], + recos: [], moviesLoadingError: "", + userId:"" }; }, methods: { @@ -80,6 +82,21 @@ export default { this.moviesLoadingError = "An error occured while e ing movies."; console.error(error); }); + }, + fetchRecos: function () { + axios + .get( + backendURL + "/reco/" + this.userId, + ) + .then((response) => { + console.log(backendURL + "/reco/" + this.userId) + this.recos = response.data; + console.log(response.data) + }) + .catch((error) => { + this.moviesLoadingError = "An error occured while e ing movies."; + console.error(error); + }); }, fetchGenres: function () { axios @@ -97,8 +114,11 @@ export default { }, }, created() { + this.userId = this.$route.query.uid this.fetchMovies(); this.fetchGenres(); + this.fetchRecos(); + console.log(this.userId) }, }; </script>