forked from dbroqua/MusicTopus
Added statistics page
This commit is contained in:
parent
30bd3ebdf9
commit
8d22435b90
9 changed files with 290 additions and 5 deletions
|
@ -150,4 +150,6 @@ app.use((error, req, res, next) => {
|
|||
}
|
||||
});
|
||||
|
||||
console.log("Server ready!");
|
||||
|
||||
export default app;
|
||||
|
|
|
@ -162,6 +162,29 @@ Publié automatiquement via #musictopus`;
|
|||
return distincts;
|
||||
}
|
||||
|
||||
constructor(req, viewname) {
|
||||
super(req, viewname);
|
||||
|
||||
this.colors = {
|
||||
nord0: "#2e3440",
|
||||
nord1: "#3b4252",
|
||||
nord2: "#434c5e",
|
||||
nord3: "#4C566A",
|
||||
nord4: "#d8dee9",
|
||||
nord5: "#e5e9f0",
|
||||
nord6: "#eceff4",
|
||||
nord7: "#8fbcbb",
|
||||
nord8: "#88c0d0",
|
||||
nord9: "#81a1c1",
|
||||
nord10: "#5e81ac",
|
||||
nord11: "#d08770",
|
||||
nord12: "#bf616a",
|
||||
nord13: "#ebcb8b",
|
||||
nord14: "#a3be8c",
|
||||
nord15: "#b48ead",
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de récupérer la liste des albums d'une collection
|
||||
* @return {Object}
|
||||
|
@ -500,6 +523,106 @@ Publié automatiquement via #musictopus`;
|
|||
await this.loadItem();
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant d'afficher des statistiques au sujet de ma collection
|
||||
*/
|
||||
async statistics() {
|
||||
const { _id: User } = this.req.user;
|
||||
const top = {};
|
||||
const byGenres = {};
|
||||
const byStyles = {};
|
||||
const byFormats = {};
|
||||
const top10 = [];
|
||||
|
||||
const albums = await AlbumsModel.find({
|
||||
User,
|
||||
artists: { $exists: true, $not: { $size: 0 } },
|
||||
});
|
||||
|
||||
for (let i = 0; i < albums.length; i += 1) {
|
||||
const currentFormats = [];
|
||||
const { artists, genres, styles, formats } = albums[i];
|
||||
|
||||
// INFO: On regroupe les artistes par nom pour en faire le top10
|
||||
for (let j = 0; j < artists.length; j += 1) {
|
||||
const { name } = artists[j];
|
||||
if (!top[name]) {
|
||||
top[name] = {
|
||||
name,
|
||||
count: 0,
|
||||
};
|
||||
}
|
||||
top[name].count += 1;
|
||||
}
|
||||
|
||||
// INFO: On regroupe les genres
|
||||
for (let j = 0; j < genres.length; j += 1) {
|
||||
const name = genres[j];
|
||||
if (!byGenres[name]) {
|
||||
byGenres[name] = {
|
||||
name,
|
||||
count: 0,
|
||||
color: this.colors[
|
||||
`nord${Object.keys(byGenres).length % 15}`
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
byGenres[name].count += 1;
|
||||
}
|
||||
|
||||
// INFO: On regroupe les styles
|
||||
for (let j = 0; j < styles.length; j += 1) {
|
||||
const name = styles[j];
|
||||
if (!byStyles[name]) {
|
||||
byStyles[name] = {
|
||||
name,
|
||||
count: 0,
|
||||
color: this.colors[
|
||||
`nord${Object.keys(byStyles).length % 15}`
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
byStyles[name].count += 1;
|
||||
}
|
||||
|
||||
// INFO: On regroupe les formats
|
||||
for (let j = 0; j < formats.length; j += 1) {
|
||||
const { name } = formats[j];
|
||||
// INFO: On évite qu'un album avec 2 vinyles soit compté 2x
|
||||
if (!currentFormats.includes(name)) {
|
||||
if (!byFormats[name]) {
|
||||
byFormats[name] = {
|
||||
name,
|
||||
count: 0,
|
||||
color: this.colors[
|
||||
`nord${Object.keys(byFormats).length % 15}`
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
byFormats[name].count += 1;
|
||||
currentFormats.push(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// INFO: On convertit le top en tableau
|
||||
Object.keys(top).forEach((index) => {
|
||||
top10.push(top[index]);
|
||||
});
|
||||
|
||||
// INFO: On ordonne par quantité pour on récupère le top 10
|
||||
top10.sort((a, b) => (a.count > b.count ? -1 : 1));
|
||||
|
||||
this.setPageTitle("Mes statistiques");
|
||||
this.setPageContent("top10", top10.splice(0, 10));
|
||||
this.setPageContent("byGenres", byGenres);
|
||||
this.setPageContent("byStyles", byStyles);
|
||||
this.setPageContent("byFormats", byFormats);
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de créer la page "collection/:userId"
|
||||
*/
|
||||
|
@ -522,8 +645,8 @@ Publié automatiquement via #musictopus`;
|
|||
const genres = await Albums.getAllDistincts("genres", userId);
|
||||
const styles = await Albums.getAllDistincts("styles", userId);
|
||||
|
||||
this.setPageContent("username", user.username);
|
||||
this.setPageTitle(`Collection publique de ${user.username}`);
|
||||
this.setPageContent("username", user.username);
|
||||
this.setPageContent("artists", artists);
|
||||
this.setPageContent("formats", formats);
|
||||
this.setPageContent("years", years);
|
||||
|
|
|
@ -38,6 +38,23 @@ router
|
|||
}
|
||||
});
|
||||
|
||||
router
|
||||
.route("/statistiques")
|
||||
.get(ensureLoggedIn("/connexion"), async (req, res, next) => {
|
||||
try {
|
||||
const page = new Albums(
|
||||
req,
|
||||
"mon-compte/ma-collection/statistiques"
|
||||
);
|
||||
|
||||
await page.statistics();
|
||||
|
||||
render(res, page);
|
||||
} catch (err) {
|
||||
next(err);
|
||||
}
|
||||
});
|
||||
|
||||
router
|
||||
.route("/exporter")
|
||||
.get(ensureLoggedIn("/connexion"), async (req, res, next) => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue