diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 319a0c339bad46744b094c9831fbed1d5f15923e..2928c35a2e894078e2fd2dda0509a8de9f66b258 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,6 +5,7 @@ stages: .eslint: image: node:16.14.0-alpine stage: lint + allow_failure: true script: - cd $CONTEXT # install packages diff --git a/.vscode/settings.json b/.vscode/settings.json index 6378fc8420b6eba9e84163700438decd630d9a47..69538563681f389b3107f724af66bc71d2ed2123 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,5 +10,8 @@ }, "[javascript][vue]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" + }, + "[vue]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" } } diff --git a/backend/routes/genres.js b/backend/routes/genres.js index 90117dc7095c7daee8965b5340b22f12136b7021..fc1190cc2a4cfb0b531b2b98876a6b50dc69c5ce 100644 --- a/backend/routes/genres.js +++ b/backend/routes/genres.js @@ -4,17 +4,14 @@ const router = express.Router(); module.exports = router; -// router.get("/popular/:number", async function (req, res) { -// try { -// const filmNumber = await req.params["number"]; -// const getGenres = await GenreModel.find({}) -// .sort({ popularity: "desc" }) -// .limit(filmNumber); -// res.send(getGenres); -// } catch (error) { -// console.log(error); -// } -// }); +router.get("/", async function (req, res) { + try { + const getGenres = await GenreModel.find({}); + res.send(getGenres); + } catch (error) { + console.log(error); + } +}); router.get("/genre/id/:id", async function (req, res) { try { diff --git a/backend/routes/movies.js b/backend/routes/movies.js index 8cac5149fb80843f27b978273be5de5cd39923f5..8a670ea7aec3148d760178abfe75103f42d2652e 100644 --- a/backend/routes/movies.js +++ b/backend/routes/movies.js @@ -4,17 +4,18 @@ const router = express.Router(); module.exports = router; -// router.get("/popular/:number", async function (req, res) { -// try { -// const filmNumber = await req.params["number"]; -// const getMovies = await MovieModel.find({}) -// .sort({ popularity: "desc" }) -// .limit(filmNumber); -// res.send(getMovies); -// } catch (error) { -// console.log(error); -// } -// }); +router.get("/popular/:number", async function (req, res) { + try { + console.log('yo') + const filmNumber = await req.params["number"]; + const getMovies = await MovieModel.find({}) + .sort({ popularity: "desc" }) + .limit(filmNumber); + res.send(getMovies); + } catch (error) { + console.log(error); + } +}); router.get("/movie/id/:id", async function (req, res) { try { diff --git a/backend/routes/users.js b/backend/routes/users.js index 58475b8f2603a2b3dbcfc8b6c231a0da226f7f5f..63976df41ff6922b9dae70c09bb006ae997104be 100644 --- a/backend/routes/users.js +++ b/backend/routes/users.js @@ -9,6 +9,18 @@ router.get("/", function (req, res) { }); }); +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, @@ -39,11 +51,22 @@ router.put("/like", async function (req, res) { const movieId = await req.body.movieId; const movieOid = await MovieModel.findOne({ id: movieId }); const user = await UserModel.findById(userId); - const likedMovies = user.liked_movies.concat([movieOid._id]); - await UserModel.findByIdAndUpdate(userId, { - liked_movies: likedMovies, - }); - res.send("Done"); + 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"); @@ -64,8 +87,13 @@ router.put("/unlike", async function (req, res) { 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); diff --git a/frontend/src/components/MovieInfos.vue b/frontend/src/components/MovieInfos.vue index f06c80d7ceca468438e299e6005ed462da22fafe..1de16e5f91636d110be15e1753134d40d4690927 100644 --- a/frontend/src/components/MovieInfos.vue +++ b/frontend/src/components/MovieInfos.vue @@ -22,7 +22,7 @@ export default { data: function () { return { genreArray: [], - liking: "Unlike", + liking: true, userId: "toto", }; }, @@ -55,11 +55,45 @@ export default { } }, handleLike: async function () { - console.log("clic"); - await axios.put(backendURL + "/users/like/", { - userId: this.userId, - movieId: this.movieId, - }); + if (this.liking == "Unlike") { + console.log("clic"); + await axios.put(backendURL + "/users/unlike/", { + userId: this.userId, + movieId: this.movieId, + }); + this.getLiking().then((results) => { + console.log(results); + if (results) { + this.liking = "Unlike"; + } else { + this.liking = "Like"; + } + }); + } else { + console.log("clic"); + await axios.put(backendURL + "/users/like/", { + userId: this.userId, + movieId: this.movieId, + }); + this.getLiking().then((results) => { + console.log(results); + if (results) { + this.liking = "Unlike"; + } else { + this.liking = "Like"; + } + }); + } + }, + getLiking: async function () { + try { + const likingValue = await axios.get( + backendURL + "/users/isliked/" + this.movieId + "/" + this.userId + ); + return likingValue.data; + } catch (error) { + console.log(error); + } }, }, created() { @@ -67,6 +101,14 @@ export default { this.genreArray = results; }); this.userId = this.$route.query.uid; + this.getLiking().then((results) => { + console.log(results); + if (results) { + this.liking = "Unlike"; + } else { + this.liking = "Like"; + } + }); console.log(this.userId); }, }; @@ -85,11 +127,12 @@ export default { .mark { text-align: center; vertical-align: center; - width: 10%; + width: 15%; height: auto; background-color: #912f56; border-radius: 25%; margin-left: auto; + color: #eaf2ef; } .like_button { text-align: center; @@ -102,5 +145,6 @@ export default { margin-right: auto; margin-bottom: auto; cursor: pointer; + color: #eaf2ef; } </style> diff --git a/frontend/src/components/MovieType.vue b/frontend/src/components/MovieType.vue index 9638fad16d3fad66a3c67fd966d48aaffb75d264..814dfcf7489fe228ffc76da0b6785b2a10fa2b78 100644 --- a/frontend/src/components/MovieType.vue +++ b/frontend/src/components/MovieType.vue @@ -1,24 +1,48 @@ <template> <div class="box"> <h1>Genre</h1> +<div class="liste-genre"> +<li v-for="genre in genres" :key="genre.id" style="list-style-type:none;"> <div class="check"> -<input type="checkbox" id="action" value="Action" v-model="genre"> -<label for="Action">Action</label> +<input type="checkbox" id="genre.id" value="genre" > +<label for="genre"> {{ genre.name }} </label> </div> -<div class="check"> -<input type="checkbox" id="horreur" value="Horreur" v-model="genre"> -<label for="horreur">Horreur</label> -</div> -<div class="check"> -<input type="checkbox" id="fantastique" value="Fantastique" v-model="genre"> -<label for="fantastique">Fantastique</label> +</li> </div> -<br> </div> </template> <script> +import axios from "axios"; +const backendURL = process.env.VUE_APP_BACKEND_BASE_URL; +export default { + data: function () { + return { + genrename: "", + genres: [], + genresLoadingError: "", + }; + }, + methods: { + fetchGenres: function () { + axios + .get( + backendURL + "/genres", + ) + .then((response) => { + this.genres = response.data; + }) + .catch((error) => { + this.genresLoadingError = "An error occured while e ing genres."; + console.error(error); + }); + }, + }, + created() { + this.fetchGenres(); + }, +}; </script> <style scoped> diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index dfb02bc3c5916c84ededc7ee60098185d76bbcfe..2651045fd702e8a673e435a25ce1aeeee2cf5068 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -3,6 +3,7 @@ import Home from "../views/Home.vue"; import Connexion from "../views/Connexion.vue"; import Users from "../views/Users.vue"; import AddUser from "../views/AddUsers.vue"; +import MoviePage from "../views/MoviePage.vue"; const routes = [ { @@ -25,6 +26,11 @@ const routes = [ name: "AddUsers", component: AddUser, }, + { + path: "/movie/:id", + name: "MoviePage", + component: MoviePage, + }, ]; const router = createRouter({ diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue index e40d143570fafa7afa4a1209ca01b21e6c976c08..5064a887eb37d37a096e3e28b9bf3a753f7029c8 100644 --- a/frontend/src/views/Home.vue +++ b/frontend/src/views/Home.vue @@ -3,11 +3,13 @@ <div class="carousel"> <carousel :items-to-show="5.5" autoplay=1300> <slide v-for="movie in movies" :key="movie.id" autoplay='True' transition="100" > + <router-link :to="'/movie/'+ movie.id"> <img :src="'https://image.tmdb.org/t/p/original/' + movie.poster_path" withd="100" height="300" /> + </router-link> </slide> <template #addons> <navigation /> @@ -16,31 +18,37 @@ </carousel> </div> <br /> - <div class="corps"> + <div class="corps"> <div class="type"> <MovieType /> </div> + <div class="movie-affichage"> <li v-for="movie in movies" :key="movie.id"> - <p class="movie-title"> - {{ movie.title }} + <p class="name"> + <h5> {{ movie.title }}</h5> </p> <p class="film"> + <router-link :to="'/movie/'+ movie.id"> <img :src="'https://image.tmdb.org/t/p/original/' + movie.poster_path" withd="100" height="300" /> + </router-link> </p> </li> </div> + </div> </div> </template> <script> import axios from "axios"; -import 'vue3-carousel/dist/carousel.css'; -import { Carousel, Slide, Pagination, Navigation } from 'vue3-carousel'; +import "vue3-carousel/dist/carousel.css"; +import { Carousel, Slide, Pagination, Navigation } from "vue3-carousel"; import MovieType from "../components/MovieType.vue"; +const backendURL = process.env.VUE_APP_BACKEND_BASE_URL; + export default { name: "Home", @@ -62,26 +70,41 @@ export default { fetchMovies: function () { axios .get( - `https://api.themoviedb.org/3/movie/popular?api_key=522d421671cf75c2cba341597d86403a` + backendURL + "/movies/popular/20", ) .then((response) => { - this.movies = response.data.results; + this.movies = response.data; + console.log(response.data) }) .catch((error) => { this.moviesLoadingError = "An error occured while e ing movies."; console.error(error); }); + }, + fetchGenres: function () { + axios + .get( + backendURL + "/genres", + ) + .then((response) => { + this.genres = response.data; + console.log(response.data) + }) + .catch((error) => { + this.genresLoadingError = "An error occured while e ing genres."; + console.error(error); + }); }, }, created() { this.fetchMovies(); + this.fetchGenres(); }, }; </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> - .logo { max-width: 100px; } @@ -105,7 +128,16 @@ li { margin-right: 5px; } .film { - display:flex; + display: flex; align-self: center; } +.name { + max-width: 200px; + justify-content: center; + align-items: center; + background-color: #eaf2ef; +} +.corps { + display: flex; +} </style>