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