From 82277df3d77fab7a5abb46b3b096cb7c65a250c6 Mon Sep 17 00:00:00 2001 From: Pascalou <meline.pascaux@gmail.com> Date: Thu, 7 Dec 2023 11:08:32 +0100 Subject: [PATCH] note utilisateur film --- backend/src/controllers/movieController.js | 69 +++++++++++++++++++++- backend/src/routes/movies.js | 4 ++ frontend/package-lock.json | 31 +++++++--- frontend/package.json | 3 +- frontend/src/views/PageFilm.vue | 31 +++++++++- 5 files changed, 126 insertions(+), 12 deletions(-) diff --git a/backend/src/controllers/movieController.js b/backend/src/controllers/movieController.js index 3b51859..dd4db4d 100644 --- a/backend/src/controllers/movieController.js +++ b/backend/src/controllers/movieController.js @@ -20,8 +20,8 @@ exports.searchMovie = (req, res, next) => { db.query('SELECT * FROM Film WHERE primaryTitle LIKE CONCAT("%",?,"%") OR titleFR LIKE CONCAT("%",?,"%")', [search, search], function (error, results, fields) { - if(error) { - res.status(500).json({error}); + if (error) { + res.status(500).json({ error }); } else { let searchResults = results; @@ -56,4 +56,69 @@ exports.getMovieCast = (req, res, next) => { res.status(200).json(infos); } }) +}; +exports.addMovieNote = (req, res, next) => { + let filmId = req.query.id; + let username = req.session.username; + let note = req.query.note; + + if (checkMovieNoteExist(username, filmId)) { + + db.query('UPDATE Filmvue SET note=? WHERE login=? and tconst=?', [note, username, id], + function (error, results, fields) { + if (error == null) { + res.status(200).json({ message: 'Film préféré modifié' }); + } + else { + res.status(500).json({ error }); + } + + }) + + } else { + + db.query('INSERT INTO Filmvue VALUES (?,?,?)', + [username, filmId, firstname, note], + function (error, results, fields) { + if (error == null) { + res.status(201).json({ message: 'Film préféré ajouté' }); + } + else { + res.status(500).json({ error }); + } + }) + } + +}; +async function checkMovieNoteExist(IdUser, IdFilm) { + const queryResult = await new Promise((resolve, reject) => { + db.query('SELECT * FROM Filmvue WHERE login=? and tconst=?', + [IdUser, IdFilm], + function (error, results, fields) { + if (error) { + reject(error); + } else { + resolve(results.length != 0); + } + }) + }); + return queryResult; +}; + +exports.getMovieNote = (req, res, next) => { + let filmId = req.query.id; + let username = req.session.username; + console.log(filmId); + console.log(username); + db.query('SELECT note FROM Filmvue WHERE tconst = ? and login=?', + [filmId, username], function (error, results, fields) { + + if (error) { + res.status(500).json({ error }); + } else { + console.log(results); + let infos = results; + res.status(200).json(infos); + } + }) }; \ No newline at end of file diff --git a/backend/src/routes/movies.js b/backend/src/routes/movies.js index 8179658..e693835 100644 --- a/backend/src/routes/movies.js +++ b/backend/src/routes/movies.js @@ -1,11 +1,15 @@ const express = require('express'); const router = express.Router(); const controller = require('../controllers/movieController'); +const auth = require('../middlewares/auth'); + router.get('/:id(tt\\d+)',controller.getMovieInformations); router.get('/search',controller.searchMovie); router.get('/recent',controller.getRecentlyReleasedMovies); router.get('/cast/:id(tt\\d+)',controller.getMovieCast); +router.get('/addmovienote',auth.auth,controller.addMovieNote); +router.get('/getMovieNote',auth.auth,controller.getMovieNote); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1e1d52e..2aa2ab1 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,7 +9,8 @@ "version": "0.0.0", "dependencies": { "vue": "^3.3.4", - "vue-router": "^4.2.5" + "vue-router": "^4.2.5", + "vue-star-rating": "^2.1.0" }, "devDependencies": { "@vitejs/plugin-vue": "^4.4.0", @@ -650,9 +651,9 @@ } }, "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", + "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", "dev": true, "dependencies": { "esbuild": "^0.18.10", @@ -737,6 +738,14 @@ "peerDependencies": { "vue": "^3.2.0" } + }, + "node_modules/vue-star-rating": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vue-star-rating/-/vue-star-rating-2.1.0.tgz", + "integrity": "sha512-LnhuQPi4hkRg7egKls+iqtL1U0RTN2gQkdLsJN7acyynMsSc9epHLzk8McJS+bR0OzfG98zNFq7mxAyuSb/okQ==", + "dependencies": { + "vue": "^3.0.0" + } } }, "dependencies": { @@ -1105,9 +1114,9 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", + "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", "dev": true, "requires": { "esbuild": "^0.18.10", @@ -1135,6 +1144,14 @@ "requires": { "@vue/devtools-api": "^6.5.0" } + }, + "vue-star-rating": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vue-star-rating/-/vue-star-rating-2.1.0.tgz", + "integrity": "sha512-LnhuQPi4hkRg7egKls+iqtL1U0RTN2gQkdLsJN7acyynMsSc9epHLzk8McJS+bR0OzfG98zNFq7mxAyuSb/okQ==", + "requires": { + "vue": "^3.0.0" + } } } } diff --git a/frontend/package.json b/frontend/package.json index 8443eaf..be7cfd5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,7 +9,8 @@ }, "dependencies": { "vue": "^3.3.4", - "vue-router": "^4.2.5" + "vue-router": "^4.2.5", + "vue-star-rating": "^2.1.0" }, "devDependencies": { "@vitejs/plugin-vue": "^4.4.0", diff --git a/frontend/src/views/PageFilm.vue b/frontend/src/views/PageFilm.vue index 923a57e..777f13a 100644 --- a/frontend/src/views/PageFilm.vue +++ b/frontend/src/views/PageFilm.vue @@ -1,6 +1,7 @@ <script setup> -import Header from '@/components/Header.vue' -import CastRow from '@/components/CastRow.vue' +import StarRating from 'vue-star-rating'; +import Header from '@/components/Header.vue'; +import CastRow from '@/components/CastRow.vue'; import { ref, onMounted } from 'vue'; import {useRoute} from 'vue-router'; @@ -13,6 +14,28 @@ let annee = ref(''); let duree = ref(''); let note = ref(''); let nbNotes = ref(''); +let rating = ref(0); + +async function getRateUser(){ + const params = new URLSearchParams({ id: route.params.id }); + try { + const response = await fetch(`http://localhost:3000/movies/getMovieNote?${params.toString()}`, { credentials: 'include' }); + + if (response.ok) { + const data = await response.json(); + + if (data) { + console.log(data[0].note); + rating.value = data[0].note; + } + } else { + const errorData = await response.json(); + console.error('Error:', response.status, errorData); + } + } catch (error) { + console.error('Error during API call:', error); + } +} async function getFilmInfo() { @@ -43,6 +66,8 @@ async function getFilmInfo() { onMounted(() => { getFilmInfo(); getCast(); + getRateUser(); + console.log(rating.value); }); let cast = ref([]) @@ -77,6 +102,8 @@ async function getCast() { <h2>Date de sortie : {{ annee }}</h2> <h2>Durée : {{ duree }} minutes</h2> <h2>Note : {{ note }}</h2> + <h2>Votre note :</h2> + <star-rating v-model:rating="rating"/> <h2>Distribution : </h2> <CastRow :cast="cast"></CastRow> -- GitLab