Newer
Older
const User = require("../models/class_user.js");
const { getUserInformations, getUserSeenMovies } = require("../services/user.js");
const { getMovieAuthor, getMovieActors, getMovieStyles, getMovieById } = require("../services/movies.js");
exports.getRecommandations = (req, res, next) => {
let username = req.session.username;
let infos = recommendationForUser(username);
res.status(200).json(infos);
};
/**
* Cette fonction selectionne les 3 meilleurs films pour un utilisateur.
*
* @param {string} user_login - Login de l'utilisateur.
* @returns {Movie[]} - La liste des 3 films.
*/
async function recommendationForUser(user_login) {
// let person = controllers.get_user(user_login);
let user = User.toUser(await getUserInformations(user_login));
let movies = await getSeenMoviesInfos(user_login);
let fav_styles = []; //styles des films présents dans les films aimés par l'utilisateur
let fav_authors = []; //auteurs récurents dans les films aimés par l'utilisateur : moyenne (auteur * note du film)
let fav_actors = []; //acteurs récurents dans les films aimés par l'utilisateur : moyenne (acteur * note du film (* %temps écran))
//let fav_duration;
let authors = getAllAuthors(seen).slice(0, 3);
for (let i = 0; i < authors.length; i++) {
let actors = getAllElement(seen, getActors).slice(0, 3);
for (let i = 0; i < actors.length; i++) {
for (let i = 0; i < styles.length; i++) {
//chaques films a un nombre de points dans chaques catégorie :
//indice 0: films - indice 1: points_auteurs - indice 2: points_acteurs - indice 3: points_styles
return [new Movie("Mariokart", "Nintendo", 5), new Movie("MarioBros", "Nintendo", 3), new Movie("MarioMaker", "Nintendo", 4)];
/**
* trier une matrice par l'indice 1, puis par l'indice 2, puis par l'indice 0.
*
* @param {[string, Number, Number]} a - ligne d'une matrice
* @param {[string, Number, Number]} b - ligne d'une matrice
* @returns {Number} - 1 si a est plus grand, 0 si a=b, -1 si b est plus grand.
*/
function comparerLignes(a, b) {
// trier par le nombre d'apparition de l'auteur dans la liste de film vus (int)
if (a[1] < b[1]) return -1;
if (a[1] > b[1]) return 1;
// Si le nombre d'apparition est le même, trier par la moyenne de notes des films de l'auteur (float)
if (a[2] < b[2]) return -1;
if (a[2] > b[2]) return 1;
// Si la moyenne est la même, trier par le nom de l'auteur (string)
if (a[0] < b[0]) return -1;
if (a[0] > b[0]) return 1;
// Les lignes sont égales
/**
* renvoie une liste d'auteurs, avec leur nombre d'apparition dans la liste des films vus par un utilisateur, puis leur note moyenne
*
* @param {Movie[]} movies - Liste de film vus par un utilisateur.
* @returns {[[string, Number, Number]]} - La liste des auteurs.
*/
//1er indice = indice du couple auteur/nombre d'apparition/moyenne notes films, 2e indice: 0 auteur, 1 nbr apparition, 2 mpyenne films
for (let i = 0; i < seen.length; i++) {
let j = 0;
let found = false;
while (j < authors.length && !found) {
if (authors[j][0] == seen[i].author) {
found = true;
authors[j][1] += 1;
authors[j][2] += seen[i].note;
}
j++;
}
}
}
for (let i = 0; i < authors.length; i++) {
}
authors.sort(comparerLignes);
return authors;
}
/**
* renvoie une liste d'acteurs/styles, avec leur nombre d'apparition dans la liste des films vus par un utilisateur, puis leur note moyenne
*
* @param {Movie[]} movies - Liste de film vus par un utilisateur.
* @param {string(Movie)} recupElement - Fonction qui recupere un element d'un film (pour generaliser à allElement) (acteurs ou styles).
* @returns {[[string, Number, Number]]} - La liste des auteurs.
*/
function getAllElement(seen, recupElement) {
let elements = [[]];
//premier indice = couple element/nombre d'apparition/moyenne notes films, 2e indice: 0 auteur, 1 nbr apparition, 2 mpyenne films
for (let i = 0; i < seen.length; i++) {
let j = 0;
let found = false;
temp_elements = recupElement(seen[i]);
for (let h = 0; h < temp_elements.length; h++) {
while (j < elements.length && !found) {
if (elements[j][0] == recupElement(temp_elements[h])) {
found = true;
elements[j][1] += 1;
elements[j][2] += temp_elements[h].note;
}
j++;
}
}
}
}
for (let i = 0; i < elements.length; i++) {
}
elements.sort(comparerLignes);
return elements;
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/**
* Renvoie les informations du film avec ses acteurs, auteur et styles en classe Movie
*
* @param {string} movieId - L'id du film (tconst)
* @returns {Promise<Movie>} - Le film en classe Movie avec l'auteur, les acteurs et les styles
*/
async function getMovieEveryInfos(movieId) {
let movie = Movie.toMovie(await getMovieById(movieId));
movie.author = (await getMovieAuthor(movieId))?.nconst;
movie.actors = (await getMovieActors(movieId)).map(actor => actor.nconst);
movie.styles = (await getMovieStyles(movieId)).map(style => style.idGen);
return movie;
}
/**
* Renvoie la liste des films vus par l'utilisateur avec leurs auteurs, acteurs et styles en classe Movie
*
* @param {string} userId - Le nom d'utilisateur
* @returns {Promise<Array<Movie>>} - La liste des films en classe Movie avec l'auteur, les acteurs et les styles
*/
async function getSeenMoviesInfos(userId) {
let seenMovies = await getUserSeenMovies(userId);
let res = seenMovies.map(async movie => {
let movieRes = Movie.toMovie(movie);
movieRes.author = (await getMovieAuthor(movie.id))?.nconst;
movieRes.actors = (await getMovieActors(movie.id)).map(actor => actor.nconst);
movieRes.styles = (await getMovieStyles(movie.id)).map(style => style.idGen);
return movieRes
})
return res;
}