From aeb5df067c77692a7c529834a2761e6003313f88 Mon Sep 17 00:00:00 2001
From: Damien Broqua
Date: Sun, 6 Mar 2022 14:38:26 +0100
Subject: [PATCH] issue/1 (#31)
Co-authored-by: dbroqua
Reviewed-on: https://git.darkou.fr/dbroqua/MusicTopus/pulls/31
---
package.json | 13 +-
public/font/icon.eot | Bin 9408 -> 9976 bytes
public/font/icon.svg | 2 +
public/font/icon.ttf | Bin 9256 -> 9824 bytes
public/font/icon.woff | Bin 5844 -> 6224 bytes
public/font/icon.woff2 | Bin 4860 -> 5208 bytes
public/js/main.js | 7 +-
sass/{ma-collection.scss => collection.scss} | 7 +-
sass/colors.scss | 17 ++
sass/composants.scss | 13 +
sass/global.scss | 4 +
sass/icons.scss | 1 +
sass/index.scss | 5 +-
sass/toast.scss | 5 +
src/app.js | 9 +-
src/libs/error.js | 4 +-
src/middleware/Albums.js | 66 ++++-
src/middleware/Me.js | 45 +++
src/models/users.js | 16 +-
src/routes/api/v1/albums.js | 2 +-
src/routes/api/v1/me.js | 24 ++
src/routes/collection.js | 22 ++
src/routes/ma-collection.js | 2 +-
views/error.ejs | 2 +
.../ma-collection.ejs => collection.ejs} | 57 +---
views/pages/composants.ejs | 90 +++++-
.../mon-compte/ma-collection/exporter.ejs | 4 +-
.../pages/mon-compte/ma-collection/index.ejs | 279 ++++++++++++++++++
28 files changed, 630 insertions(+), 66 deletions(-)
rename sass/{ma-collection.scss => collection.scss} (90%)
create mode 100644 sass/composants.scss
create mode 100644 src/middleware/Me.js
create mode 100644 src/routes/api/v1/me.js
create mode 100644 src/routes/collection.js
rename views/pages/{mon-compte/ma-collection.ejs => collection.ejs} (78%)
create mode 100644 views/pages/mon-compte/ma-collection/index.ejs
diff --git a/package.json b/package.json
index 8c53d5a..b5aea27 100644
--- a/package.json
+++ b/package.json
@@ -27,9 +27,6 @@
},
"license": "GPL-3.0-or-later",
"devDependencies": {
- "@babel/cli": "^7.17.0",
- "@babel/core": "^7.17.2",
- "@babel/preset-env": "^7.16.11",
"eslint": "^8.9.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-prettier": "^8.3.0",
@@ -38,11 +35,12 @@
"husky": "^7.0.4",
"lint-staged": "^12.3.3",
"nodemon": "^2.0.15",
- "npm-run-all": "^4.1.5",
- "prettier": "^2.5.1",
- "rimraf": "^3.0.2"
+ "prettier": "^2.5.1"
},
"dependencies": {
+ "@babel/cli": "^7.17.0",
+ "@babel/core": "^7.17.2",
+ "@babel/preset-env": "^7.16.11",
"axios": "^0.26.0",
"connect-ensure-login": "^0.1.1",
"connect-flash": "^0.1.1",
@@ -54,14 +52,17 @@
"excel4node": "^1.7.2",
"express": "^4.17.2",
"express-session": "^1.17.2",
+ "joi": "^17.6.0",
"knacss": "^8.0.4",
"moment": "^2.29.1",
"moment-timezone": "^0.5.34",
"mongoose": "^6.2.1",
"mongoose-unique-validator": "^3.0.0",
+ "npm-run-all": "^4.1.5",
"passport": "^0.5.2",
"passport-http": "^0.3.0",
"passport-local": "^1.0.0",
+ "rimraf": "^3.0.2",
"sass": "^1.49.7",
"vue": "^3.2.31"
},
diff --git a/public/font/icon.eot b/public/font/icon.eot
index 8664abe7c3bb927c5503dbfc1ac1e0ec80045291..a17c0f6c12920aacff321df497143f171c000437 100644
GIT binary patch
delta 1165
zcmYLITTEP46y5utd(W8{bD7I4xO1iNjperi@L3>rG9F2;{QlGT#BTsdmnJV{8c3(l
z^C?Zv>0~TE(Q)r};$ISV#3Jb=>6OIaCu@n#Uz~n%tS$y1`vFwH8I4TUuZ{l&P<5Wx
zLnaBr&nAe!N4(jLXBK;xUMk!r;Tsa3nomqd8b3a|0^pX3`{I$sBz8G(5N{{mun>ty
zbBp`Oi4W5S*OQ5K#y|GhH2|G*Kt7p@CYNsZ+ypRw%&p(lT?VLR
z56YlR!2Ws};L2~vzw%`Xpm2|Uz@CRzI15ko^@9a1S&$X3$ovv;rf{}IwU7i#Gax{b
zg%T^)fSm=#;2b&d%nQ$r3>ijkSE~`Q@}q57?dDC5USF3h7zzhEb>S9V@HX^v;d1Mq
z#?H`542DDDkY2Scc$2rqcM_Ytf_rooy$@ptYYFy>aG;A~0-g1!yO}mVaOfWxA0Jp1
z4piIf6}i_4VyGE!8$ny8YVo|YWmARFM>qTWk4P25syKK4~~tTl6kBVSi=6fWzD&Zmz)=nr
z$#NS~YFXq6RqMFs;6!Sy!m)ZN_c3kSn3R2pB9O5h3mx`Mq}hrGqx
zB6PR#grrZ-nC82)*p0UWr-w{)=yc!~n%AbK*}*5tBNaWfS7&Djg=5N3j(^G_&Y05t
z+B}l$Br$KO-%7Q23Y#nE)DwS$%65va_uF8_XZP(@EsR?35v{fOX4y_*w-{2wXyK5J
z0_2ifU5)IJQ}TiGrn1d@`JbZrT#Ii=%YUf-Or4!us&0@`!>Zi%>K;FjE+!MHjGRu+
qELi4e7Uqse7c(sV>Vh0kBo>sk8A(NzOe&H#l?hs&%KuaSgY#cdItO3?
delta 634
zcmXv~OK1~O6g~6FB|_@iQ!I^&4J$)7Y**_l&+pO7z-swur-
z>jCmKvoDo-oE$ipXTPihJ)`M_J{x&H^cDzSVtqJG!FyVoCVxgAOJ|Fvk@Br>lfoMc
z6PbKm@9R4{MgEigcvdeN!WsW2a9Adf=JagBEVYNo`3kXWRY=Zikoh1Vxds_Y>VEhjLTUIKW36Rt$?CML-7e68
z!^`{J@o*=BJ;$68MU;}jeu-`#DDcwl0R0a^MGyCByt<&6mbkYnc{P3v!@jK@nz<+C
zC&zdeVc)5>?1J5}$}Z>wYsm#2VRc;48||tKXtmGs52f}?eJ|A}gCE5H_2yROzIOf(
zG^t@9wR`!YXFr?$p%Ecq-VB|*(CD`8x`W%@e^QWZ!ig)W;Jc6!uZa~&mPVzV^i{qi
w?|LqJek-rI!~WGktseR&((GMt)U5Z8n`$_$7U%Rr+B1`RkefyAZ1|)9KOAYD0RR91
diff --git a/public/font/icon.svg b/public/font/icon.svg
index 51f7015..d5ac2f6 100644
--- a/public/font/icon.svg
+++ b/public/font/icon.svg
@@ -34,6 +34,8 @@
+
+
diff --git a/public/font/icon.ttf b/public/font/icon.ttf
index 1f0de7e581f6d9e5e42b4de9768222fc8c0c1ce2..4ccfa6dc9101474be2e0317776cd1611e5a2667a 100644
GIT binary patch
delta 1160
zcmYLIZA@EL7=GV-?med;m)?GH+bN%gmLZ4@Ep3nu8MrwHQ|H$NV@H9)9fQ#nGMO=S
zCU!qaBxudzAC{Rcx)^`VG+RtGF;V~Q-+mZk;uk;EG{!_qV$%JgzPEMpo;>Hg&vV}U
zoR7Tc*2&%Rt+wpj0QfurOwBAM(;L5j{|)im0MeD2ORFuU)91TIontONzck(R;7#IR
z5LM@sD{0c5#Bb1OnP0p-_wr=ZJb)Yq(85M4IorII_#418Me{L(1QBM_#6Kk7ZY-^?
z4X(dZ`HO_FNI1E;Jdvsq40tCN%ulyQb&cB4q*_(hg32+@)HR`6(MrXVUGGs`1Qeyx`
zYq5WCvvjqzTPp8wS1P1HRmuIYRDB+HNdE<@tsTrpmLQRn3<_`%U;!(wV|RiIb>IMv
z(p{9p^Jk=TeoC@yYSrnd|NLC}SK0FGR&yhy&<2bBHGmypZ?gvSf>N#qa)r{>8pt0?
zyEV{CP%76zYr_6^4d5!M^3Oag0aPBakJt;)31{K>&@fogk^@=cip;M7X9{QQ=2-+v
z=jj}ZER=ckhS*tP49-yi&%Jo&^jI+1(AOD^Sb1X?)_ZwdYarC;ipJuRUR`(v7rYAt
zT)4ctueCRJ6r=H2Jf?fHg0}@aLPxPJAh=K0Fz^KSu#V`Uh)4P;C(_%Dx|g{VBM0G;
zL}Fx9sHk-{EAn74im`UQAB@_Zn#K3dj!hFnpSUwLd`PMjRz>A4emBahyZ!Lc_}svR
zE`-CrW5>s~OdGsEoIsUp>`BcdMS}<7s@ofOML4WBwC&iL)qi31^p|xUh0A)R_u0lr
z!_l7Z!wrvEqzis4v+vlN3cuSvV_B-E%I9p7sSt#xhmJLSB!#uxBnhmD5*r7Z$vI#O
z%TXODIc^q34kVOvfOrX^so{{{?X0saG6XRwxZZ`mx|at+@o2n*t|kB_ZJpMg*qFiAUvyz
zQ--v-wTKitNG!bT_*!cCt#W7MoOa|N&{)wdy17iRK14BY`Zeqc#MLP3<{0$5YOfku2B?>@sAP_A85`1X|>A6XI
zKdXTJ1|XLwJ+T-hE&$|b0BMf&oXRu}t9+n-79Iu$UW<&>#1#2%-K7i+f-XRLvkagB
zy8&|okY5Ajt7PPsRG7Dh{eJ@#SO64o$jMJml#&vQ0rDRJ`AWHo6$OmOd>a@Tgjj%l
zg}lVv)X5c}bb)*opabU?;$h?jxd8HThrs{{WH)62)?l)rs{T+Z>=4
zP?!j8HWInb1k}SPt}xk1+**aDxF9o+BPTO2TQ{|$gt@phk0m!hKaaJfD6u$$H3=w@
L!mxR+_+dT(LNb`{
diff --git a/public/font/icon.woff b/public/font/icon.woff
index 6474d86873d5600e7ce9e3cfcd9dd17133cfb3d1..32621989e6e774018e5a3e688d923ab43ac1a6f8 100644
GIT binary patch
delta 3695
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
diff --git a/public/font/icon.woff2 b/public/font/icon.woff2
index 72207f36852f065f781663c05bf57befdcce483f..f73baf47585f0d4dc4df930369809d57ee27d3b2 100644
GIT binary patch
literal 5208
zcmV-e6sPNVPew8T0RR9102EjN4*&oF0487n02BcL0RR9100000000000000000000
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
SOZR}g=t0ffALdsEwoCy}C+chf
literal 4860
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
diff --git a/public/js/main.js b/public/js/main.js
index 994b2ae..895683a 100644
--- a/public/js/main.js
+++ b/public/js/main.js
@@ -2,13 +2,16 @@
* Fonction permettant d'afficher un message dans un toastr
* @param {String} message
*/
- function showToastr(message) {
+ function showToastr(message, success = false) {
let x = document.getElementById("toastr");
if ( message ) {
x.getElementsByTagName("SPAN")[0].innerHTML = message;
}
- x.className = `${x.className} show`;
+ x.className = `${x.className} show`.replace("sucess", "");
+ if ( success ) {
+ x.className = `${x.className} success`;
+ }
setTimeout(function(){ x.className = x.className.replace("show", ""); }, 3000);
};
diff --git a/sass/ma-collection.scss b/sass/collection.scss
similarity index 90%
rename from sass/ma-collection.scss
rename to sass/collection.scss
index af22f2a..6412fe1 100644
--- a/sass/ma-collection.scss
+++ b/sass/collection.scss
@@ -1,4 +1,9 @@
-.ma-collection {
+.collection {
+ h1 {
+ i {
+ cursor: pointer;
+ }
+ }
.filters {
display: flex;
justify-content: end;
diff --git a/sass/colors.scss b/sass/colors.scss
index 5759f90..f100c6b 100644
--- a/sass/colors.scss
+++ b/sass/colors.scss
@@ -52,6 +52,23 @@ $pagination-hover-color: rgb(115, 151, 186);
--box-shadow-color: #{rgba($nord4, 0.35)};
--border-color: #{$nord4};
+
+ --nord0: #{$nord0};
+ --nord1: #{$nord1};
+ --nord2: #{$nord2};
+ --nord3: #{$nord3};
+ --nord4: #{$nord4};
+ --nord5: #{$nord5};
+ --nord6: #{$nord6};
+ --nord7: #{$nord7};
+ --nord8: #{$nord8};
+ --nord9: #{$nord9};
+ --nord10: #{$nord10};
+ --nord11: #{$nord11};
+ --nord12: #{$nord12};
+ --nord13: #{$nord13};
+ --nord14: #{$nord14};
+ --nord15: #{$nord15};
}
[data-theme="dark"] {
diff --git a/sass/composants.scss b/sass/composants.scss
new file mode 100644
index 0000000..b9d4e65
--- /dev/null
+++ b/sass/composants.scss
@@ -0,0 +1,13 @@
+.composants {
+ .couleur {
+ margin-bottom: 1rem;
+ text-align: center;
+
+ border: 1px solid var(--input-active-color);
+ box-shadow: var(--box-shadow-color) 0px 3px 6px 0px;
+
+ div {
+ height: 56px;
+ }
+ }
+}
\ No newline at end of file
diff --git a/sass/global.scss b/sass/global.scss
index 491b9ca..454cd14 100644
--- a/sass/global.scss
+++ b/sass/global.scss
@@ -82,4 +82,8 @@ html {
@include respond-to("small-up") {
display: initial;
}
+}
+
+.is-danger {
+ color: $nord12;
}
\ No newline at end of file
diff --git a/sass/icons.scss b/sass/icons.scss
index 70ce584..4250307 100644
--- a/sass/icons.scss
+++ b/sass/icons.scss
@@ -46,6 +46,7 @@
.icon-link-ext:before { content: '\f08e'; } /* '' */
.icon-sun:before { content: '\f185'; } /* '' */
.icon-moon:before { content: '\f186'; } /* '' */
+.icon-share:before { content: '\f1e0'; } /* '' */
.icon-trash:before { content: '\f1f8'; } /* '' */
.icon-blind:before { content: '\f29d'; } /* '' */
diff --git a/sass/index.scss b/sass/index.scss
index aa7557a..c54fc3c 100644
--- a/sass/index.scss
+++ b/sass/index.scss
@@ -43,5 +43,6 @@
@import './error';
@import './home';
@import './ajouter-un-album';
-@import './ma-collection';
-@import './ma-collection-details';
\ No newline at end of file
+@import './collection';
+@import './ma-collection-details';
+@import './composants';
\ No newline at end of file
diff --git a/sass/toast.scss b/sass/toast.scss
index 21d1730..46777e7 100644
--- a/sass/toast.scss
+++ b/sass/toast.scss
@@ -13,6 +13,11 @@
color: $button-alternate-color;
border-radius: 6px;
+ &.success {
+ background-color: $success-color;
+ color: $button-font-color;
+ }
+
&.show {
visibility: visible;
animation: toastrFadein 0.5s, toastrFadeout 0.5s 2.5s;
diff --git a/src/app.js b/src/app.js
index 0b32d82..6d1e507 100644
--- a/src/app.js
+++ b/src/app.js
@@ -13,9 +13,11 @@ import { isXhr } from "./helpers";
import indexRouter from "./routes";
import maCollectionRouter from "./routes/ma-collection";
+import collectionRouter from "./routes/collection";
import importAlbumRouterApiV1 from "./routes/api/v1/albums";
import importSearchRouterApiV1 from "./routes/api/v1/search";
+import importMeRouterApiV1 from "./routes/api/v1/me";
// Mongoose schema init
require("./models/users");
@@ -82,8 +84,10 @@ app.use(
app.use("/", indexRouter);
app.use("/ma-collection", maCollectionRouter);
+app.use("/collection", collectionRouter);
app.use("/api/v1/albums", importAlbumRouterApiV1);
app.use("/api/v1/search", importSearchRouterApiV1);
+app.use("/api/v1/me", importMeRouterApiV1);
// Handle 404
app.use((req, res) => {
@@ -113,7 +117,10 @@ app.use((error, req, res, next) => {
} else {
res.status(error.errorCode || 500);
res.render("index", {
- page: { title: "500: Oups… le serveur a crashé !", error },
+ page: {
+ title: error.title || "500: Oups… le serveur a crashé !",
+ error,
+ },
errorCode: error.errorCode || 500,
viewname: "error",
user: req.user || null,
diff --git a/src/libs/error.js b/src/libs/error.js
index 562265f..13470f2 100644
--- a/src/libs/error.js
+++ b/src/libs/error.js
@@ -4,9 +4,10 @@
class ErrorEvent extends Error {
/**
* @param {Number} errorCode
+ * @param {String} title
* @param {Mixed} ...params
*/
- constructor(errorCode, ...params) {
+ constructor(errorCode, title, ...params) {
super(...params);
if (Error.captureStackTrace) {
@@ -14,6 +15,7 @@ class ErrorEvent extends Error {
}
this.errorCode = parseInt(errorCode, 10);
+ this.title = title;
this.date = new Date();
}
}
diff --git a/src/middleware/Albums.js b/src/middleware/Albums.js
index 4796207..8025973 100644
--- a/src/middleware/Albums.js
+++ b/src/middleware/Albums.js
@@ -5,12 +5,19 @@ import xl from "excel4node";
import Pages from "./Pages";
import AlbumsModel from "../models/albums";
+import UsersModel from "../models/users";
import ErrorEvent from "../libs/error";
/**
* Classe permettant la gestion des albums d'un utilisateur
*/
class Albums extends Pages {
+ /**
+ * Méthode permettant de remplacer certains cartactères par leur équivalents html
+ * @param {String} str
+ *
+ * @return {String}
+ */
static replaceSpecialChars(str) {
if (!str) {
return "";
@@ -487,7 +494,7 @@ class Albums extends Pages {
static async getAllDistincts(field, user) {
const distincts = await AlbumsModel.find(
{
- user,
+ User: user,
},
[],
{
@@ -513,8 +520,11 @@ class Albums extends Pages {
order = "asc",
artists_sort,
format,
+ userId: collectionUserId,
} = this.req.query;
+ let userId = this.req.user?._id;
+
const where = {};
if (artists_sort) {
@@ -524,8 +534,35 @@ class Albums extends Pages {
where["formats.name"] = format;
}
+ if (!this.req.user && !collectionUserId) {
+ throw new ErrorEvent(
+ 401,
+ "Cette collection n'est pas publique",
+ "Cette collection n'est pas publique"
+ );
+ }
+
+ if (collectionUserId) {
+ const userIsSharingCollection = await UsersModel.findById(
+ collectionUserId
+ );
+
+ if (
+ !userIsSharingCollection ||
+ !userIsSharingCollection.isPublicCollection
+ ) {
+ throw new ErrorEvent(
+ 401,
+ "Cette collection n'est pas publique",
+ "Cette collection n'est pas publique"
+ );
+ }
+
+ userId = userIsSharingCollection._id;
+ }
+
const count = await AlbumsModel.count({
- user: this.req.user._id,
+ User: userId,
...where,
});
@@ -547,7 +584,7 @@ class Albums extends Pages {
const rows = await AlbumsModel.find(
{
- user: this.req.user._id,
+ User: userId,
...where,
},
[],
@@ -619,6 +656,29 @@ class Albums extends Pages {
this.setPageContent("item", item);
}
+
+ /**
+ * Méthode permettant de créer la page "collection/:userId"
+ */
+ async loadPublicCollection() {
+ const { userId } = this.req.params;
+
+ const user = await UsersModel.findById(userId);
+
+ if (!user || !user.isPublicCollection) {
+ throw new ErrorEvent(
+ 401,
+ "Cet utilisateur ne souhaite pas partager sa collection"
+ );
+ }
+
+ const artists = await Albums.getAllDistincts("artists_sort", userId);
+ const formats = await Albums.getAllDistincts("formats.name", userId);
+
+ this.setPageContent("username", user.username);
+ this.setPageContent("artists", artists);
+ this.setPageContent("formats", formats);
+ }
}
export default Albums;
diff --git a/src/middleware/Me.js b/src/middleware/Me.js
new file mode 100644
index 0000000..ae2712c
--- /dev/null
+++ b/src/middleware/Me.js
@@ -0,0 +1,45 @@
+import Joi from "joi";
+
+import UsersModel from "../models/users";
+
+/**
+ * Classe permettant la gestion de l'utilisateur connecté
+ */
+class Me {
+ constructor(req) {
+ this.req = req;
+ }
+
+ /**
+ * Méthode permettant de modifier le profil d'un utilisateur
+ * @return {Object}
+ */
+ async patchMe() {
+ const { body, user } = this.req;
+
+ const schema = Joi.object({
+ isPublicCollection: Joi.boolean(),
+ });
+
+ const value = await schema.validateAsync(body);
+ const update = await UsersModel.findByIdAndUpdate(
+ user._id,
+ { $set: value },
+ { new: true }
+ );
+
+ await new Promise((resolve, reject) => {
+ this.req.login(update, (err) => {
+ if (err) {
+ return reject(err);
+ }
+
+ return resolve(null);
+ });
+ });
+
+ return update;
+ }
+}
+
+export default Me;
diff --git a/src/models/users.js b/src/models/users.js
index 0807ccb..96629c0 100644
--- a/src/models/users.js
+++ b/src/models/users.js
@@ -1,5 +1,7 @@
/* eslint-disable func-names */
/* eslint-disable no-invalid-this */
+/* eslint-disable no-param-reassign */
+
import mongoose from "mongoose";
import uniqueValidator from "mongoose-unique-validator";
import crypto from "crypto";
@@ -23,8 +25,20 @@ const UserSchema = new mongoose.Schema(
},
hash: String,
salt: String,
+ isPublicCollection: {
+ type: Boolean,
+ default: false,
+ },
},
- { timestamps: true }
+ {
+ timestamps: true,
+ toJSON: {
+ transform(doc, ret) {
+ delete ret.hash;
+ delete ret.salt;
+ },
+ },
+ }
);
UserSchema.plugin(uniqueValidator, { message: "est déjà utilisé" });
diff --git a/src/routes/api/v1/albums.js b/src/routes/api/v1/albums.js
index c8f0f1a..e1caa1f 100644
--- a/src/routes/api/v1/albums.js
+++ b/src/routes/api/v1/albums.js
@@ -9,7 +9,7 @@ const router = express.Router();
router
.route("/")
- .get(ensureLoggedIn("/connexion"), async (req, res, next) => {
+ .get(async (req, res, next) => {
try {
const albums = new Albums(req);
const data = await albums.getAll();
diff --git a/src/routes/api/v1/me.js b/src/routes/api/v1/me.js
new file mode 100644
index 0000000..42c46b9
--- /dev/null
+++ b/src/routes/api/v1/me.js
@@ -0,0 +1,24 @@
+import express from "express";
+import { ensureLoggedIn } from "connect-ensure-login";
+
+import { sendResponse } from "../../../libs/format";
+
+import Me from "../../../middleware/Me";
+
+// eslint-disable-next-line new-cap
+const router = express.Router();
+
+router
+ .route("/")
+ .patch(ensureLoggedIn("/connexion"), async (req, res, next) => {
+ try {
+ const me = new Me(req);
+ const data = await me.patchMe();
+
+ return sendResponse(req, res, data);
+ } catch (err) {
+ return next(err);
+ }
+ });
+
+export default router;
diff --git a/src/routes/collection.js b/src/routes/collection.js
new file mode 100644
index 0000000..6584992
--- /dev/null
+++ b/src/routes/collection.js
@@ -0,0 +1,22 @@
+import express from "express";
+
+import Albums from "../middleware/Albums";
+
+import render from "../libs/format";
+
+// eslint-disable-next-line new-cap
+const router = express.Router();
+
+router.route("/:userId").get(async (req, res, next) => {
+ try {
+ const page = new Albums(req, "collection");
+
+ await page.loadPublicCollection();
+
+ render(res, page);
+ } catch (err) {
+ next(err);
+ }
+});
+
+export default router;
diff --git a/src/routes/ma-collection.js b/src/routes/ma-collection.js
index 51ff0ee..653c844 100644
--- a/src/routes/ma-collection.js
+++ b/src/routes/ma-collection.js
@@ -10,7 +10,7 @@ const router = express.Router();
router.route("/").get(ensureLoggedIn("/connexion"), async (req, res, next) => {
try {
- const page = new Albums(req, "mon-compte/ma-collection");
+ const page = new Albums(req, "mon-compte/ma-collection/index");
await page.loadMyCollection();
diff --git a/views/error.ejs b/views/error.ejs
index b0e5112..8f80430 100644
--- a/views/error.ejs
+++ b/views/error.ejs
@@ -5,7 +5,9 @@
<% } %>
+ <% if ( process.env.NODE_ENV !== 'production' ) { %>
+ <% } %>
\ No newline at end of file
diff --git a/views/pages/mon-compte/ma-collection.ejs b/views/pages/collection.ejs
similarity index 78%
rename from views/pages/mon-compte/ma-collection.ejs
rename to views/pages/collection.ejs
index b754ccf..da22489 100644
--- a/views/pages/mon-compte/ma-collection.ejs
+++ b/views/pages/collection.ejs
@@ -1,5 +1,8 @@
-
- Ma collection
+
+
+ Collection de <%= page.username %>
+
+
Artiste
@@ -40,12 +43,11 @@
- {{ item.artists_sort}} - {{ item.title }}
-
+ {{ item.artists_sort}} - {{ item.title }}
-
+
Année : {{ item.year }}
@@ -91,23 +93,14 @@
-
-
-
-
-
-
- Êtes-vous sûr de vouloir supprimer cet album ?
-
-
-
-
diff --git a/views/pages/composants.ejs b/views/pages/composants.ejs
index 7c17b38..dc4f8f2 100644
--- a/views/pages/composants.ejs
+++ b/views/pages/composants.ejs
@@ -1,8 +1,9 @@
-
+
Les composants
Les titres
+ Les couleurs
Les grilles
Les boutons
Les formulaires
@@ -24,6 +25,87 @@
Titre de niveau 5
Titre de niveau 6
+ Les couleurs
+ Polar Night
+
+ Snow Storm
+
+ Frost
+
+ Aurora
+
+
+ Vous pourrez trouver plus d'informations sur le site offciel du projet nord.
+
+
Les grilles
Se référer à la documentation de Knacss .
@@ -225,13 +307,15 @@
.icon-link-ext
.icon-heart
.icon-eye
+ .icon-left-open
+ .icon-right-open
+ .icon-export
+ .icon-share
.icon-spin
.icon-sun
.icon-moon
.icon-trash
.icon-blind
- .icon-left-open
- .icon-right-open
Les listes
-
+
Exporter
diff --git a/views/pages/mon-compte/ma-collection/index.ejs b/views/pages/mon-compte/ma-collection/index.ejs
new file mode 100644
index 0000000..4f401b7
--- /dev/null
+++ b/views/pages/mon-compte/ma-collection/index.ejs
@@ -0,0 +1,279 @@
+
+
+ Ma collection
+
+
+
+ Voir ma collection partagée
+
+
+
+ Artiste
+
+ Tous
+ <%
+ for (let i = 0; i < page.artists.length; i += 1 ) {
+ __append(`${page.artists[i]} `);
+ }
+ %>
+
+
+
+ Format
+
+ Tous
+ <%
+ for (let i = 0; i < page.formats.length; i += 1 ) {
+ __append(`${page.formats[i]} `);
+ }
+ %>
+
+
+
+ Trier par
+
+ Artiste (A-Z)
+ Artiste (Z-A)
+ Année (A-Z)
+ Année (Z-A)
+ Pays (A-Z)
+ Pays (Z-A)
+ Format (A-Z)
+ Format (Z-A)
+
+
+
+
+
+
+ {{ item.artists_sort}} - {{ item.title }}
+
+
+
+
+
+
+
+ Année : {{ item.year }}
+
+ Pays : {{ item.country }}
+
+
+ Format :
+
+ {{ format.name }}
+
+ (
+ {{description}},
+ )
+
+ ,
+
+
+
+ Genre : {{ genre }},
+
+ Style : {{ style }},
+
+
+
+
+
+ Nombre total d'éléments : {{total}}
+
+
+
+
+
+
+
+
+ Êtes-vous sûr de vouloir supprimer cet album ?
+
+
+
+
+
+
+
+
+ Partager ma collection
+
+
+
+ Votre collection sera visible de toute personne disposant du lien suivant :
+
+ {{shareLink}}
+
+ Ce lien permet uniquement de visualiser l'ensemble de votre collection mais ne perment en aucun cas de la modifier.
+
+ Vous pourrez à tout moment supprimer le lien de partage en cliquant à nouveau sur l'icône sur votre collection.
+
+
+ Vous êtes sur le point de rendre votre collection privée.
+
+ Toute les personnes ayant le lien partagé ne pourront plus accéder à votre collection.
+
+ Vous pourrez à tout moment rendre à nouveau votre collection publique en cliquant sur l'icône .
+
+
+
+ Partager
+ Supprimer
+ Annuler
+
+
+
+
+
+