diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..e69de29 diff --git a/sass/flash.scss b/sass/flash.scss index db28cb0..fc804a6 100644 --- a/sass/flash.scss +++ b/sass/flash.scss @@ -11,4 +11,12 @@ .header { font-weight: 800; } + + &.info { + background-color: $warning-color; + } + + &.success { + background-color: $success-color; + } } \ No newline at end of file diff --git a/sass/navbar.scss b/sass/navbar.scss index 8e4f3ec..f9583b9 100644 --- a/sass/navbar.scss +++ b/sass/navbar.scss @@ -132,6 +132,8 @@ } &:hover { + background-color: var(--default-color); + .navbar-link { background-color: var(--default-hl-color); color: rgba(0,0,0,.7); @@ -252,6 +254,13 @@ padding-bottom: .5rem; padding-top: .5rem; + hr { + background-color: var(--font-color); + border: none; + height: 2px; + margin: .5rem 0; + } + .navbar-item { cursor: pointer; padding-left: 1.5rem; diff --git a/src/app.js b/src/app.js index c8a9574..85650e8 100644 --- a/src/app.js +++ b/src/app.js @@ -15,6 +15,7 @@ import { isXhr } from "./helpers"; import indexRouter from "./routes"; import maCollectionRouter from "./routes/ma-collection"; +import monCompteRouter from "./routes/mon-compte"; import collectionRouter from "./routes/collection"; import importJobsRouter from "./routes/jobs"; @@ -83,6 +84,7 @@ app.use( ); app.use("/", indexRouter); +app.use("/mon-compte", monCompteRouter); app.use("/ma-collection", maCollectionRouter); app.use("/collection", collectionRouter); app.use("/jobs", importJobsRouter); @@ -97,15 +99,22 @@ app.use((req, res) => { } else { res.status(404).render("index", { page: { title: `404: Cette page n'existe pas.` }, - errorCode: 404, viewname: "error", - user: req.user || null, - config, session: req.session || null, - flashInfo: null, - query: null, - params: null, - error: null, + flash: { + info: req.flash("info"), + error: [ + ...req.flash("error"), + ...(req.session?.flash?.error || []), + ], + success: req.flash("success"), + }, + query: req.query, + params: req.params, + user: req.user, + config, + getBaseUrl: null, + errorCode: 404, }); } }); @@ -122,15 +131,22 @@ app.use((error, req, res, next) => { title: error.title || "500: Oups… le serveur a crashé !", error, }, - errorCode: error.errorCode || 500, viewname: "error", - user: req.user || null, - config, session: req.session || null, - flashInfo: null, - query: null, - params: null, - error: null, + flash: { + info: req.flash("info"), + error: [ + ...req.flash("error"), + ...(req.session?.flash?.error || []), + ], + success: req.flash("success"), + }, + query: req.query, + params: req.params, + user: req.user, + config, + getBaseUrl: null, + errorCode: error.errorCode || 500, }); next(); diff --git a/src/middleware/Albums.js b/src/middleware/Albums.js index 84f5c5d..05cc60a 100644 --- a/src/middleware/Albums.js +++ b/src/middleware/Albums.js @@ -98,7 +98,7 @@ class Albums extends Pages { if (!this.req.user && !collectionUserId) { throw new ErrorEvent( 401, - "Cette collection n'est pas publique", + "Collection", "Cette collection n'est pas publique" ); } @@ -114,7 +114,7 @@ class Albums extends Pages { ) { throw new ErrorEvent( 401, - "Cette collection n'est pas publique", + "Collection", "Cette collection n'est pas publique" ); } @@ -233,6 +233,7 @@ class Albums extends Pages { if (!user || !user.isPublicCollection) { throw new ErrorEvent( 401, + "Collection non partagée", "Cet utilisateur ne souhaite pas partager sa collection" ); } diff --git a/src/middleware/Me.js b/src/middleware/Me.js index ae2712c..27a1b46 100644 --- a/src/middleware/Me.js +++ b/src/middleware/Me.js @@ -1,15 +1,12 @@ import Joi from "joi"; import UsersModel from "../models/users"; +import Pages from "./Pages"; /** * Classe permettant la gestion de l'utilisateur connecté */ -class Me { - constructor(req) { - this.req = req; - } - +class Me extends Pages { /** * Méthode permettant de modifier le profil d'un utilisateur * @return {Object} @@ -40,6 +37,33 @@ class Me { return update; } + + /** + * Méthode permettant de modifier le mot de passe d'un utilisateur + */ + async updatePassword() { + const { body } = this.req; + const { _id } = this.req.user; + + const schema = Joi.object({ + oldPassword: Joi.string().required(), + password: Joi.string().required(), + passwordConfirm: Joi.ref("password"), + }); + + const value = await schema.validateAsync(body); + const user = await UsersModel.findById(_id); + + if (!user.validPassword(value.oldPassword)) { + throw new Error("Votre ancien mot de passe n'est pas valide"); + } + + user.salt = value.password; + + await user.save(); + + this.req.flash("success", "Profil correctement mis à jour"); + } } export default Me; diff --git a/src/middleware/Pages.js b/src/middleware/Pages.js index eb3ea75..04c2e2e 100644 --- a/src/middleware/Pages.js +++ b/src/middleware/Pages.js @@ -52,21 +52,20 @@ class Pages { */ render() { this.pageContent.session = this.req.session; - this.pageContent.flashInfo = this.req.flash("info"); - this.pageContent.error = this.req.flash("error") || null; + this.pageContent.flash = { + info: this.req.flash("info"), + error: [ + ...this.req.flash("error"), + ...(this.req.session?.flash?.error || []), + ], + success: this.req.flash("success"), + }; this.pageContent.query = this.req.query; this.pageContent.params = this.req.params; this.pageContent.user = this.user; this.pageContent.config = config; this.pageContent.getBaseUrl = getBaseUrl(this.req); - if (this.req.session.flash && this.req.session.flash.error) { - // eslint-disable-next-line prefer-destructuring - this.pageContent.page.failureFlash = - this.req.session.flash.error[0]; - this.req.session.flash = null; - } - return this.pageContent; } } diff --git a/src/routes/mon-compte.js b/src/routes/mon-compte.js new file mode 100644 index 0000000..813d0e5 --- /dev/null +++ b/src/routes/mon-compte.js @@ -0,0 +1,35 @@ +import express from "express"; +import { ensureLoggedIn } from "connect-ensure-login"; + +import Me from "../middleware/Me"; + +import render from "../libs/format"; + +// eslint-disable-next-line new-cap +const router = express.Router(); + +router + .route("/") + .get(ensureLoggedIn("/connexion"), async (req, res, next) => { + try { + const page = new Me(req, "mon-compte/index"); + + page.setPageTitle("Mon compte"); + + render(res, page); + } catch (err) { + next(err); + } + }) + .post(ensureLoggedIn("/connexion"), async (req, res) => { + try { + const page = new Me(req, "mon-compte/index"); + + await page.updatePassword(); + } catch (err) { + req.flash("error", err.toString()); + } + res.redirect("/mon-compte"); + }); + +export default router; diff --git a/views/error.ejs b/views/error.ejs index 8f80430..520a37e 100644 --- a/views/error.ejs +++ b/views/error.ejs @@ -1,10 +1,8 @@

<%= page.title %>

- <% if ( errorCode && errorCode === 404 ) { %>

Erreur 404

- <% } %> <% if ( process.env.NODE_ENV !== 'production' ) { %>
<%= page.error %>
diff --git a/views/index.ejs b/views/index.ejs index a2a98b5..ef76ac1 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -83,6 +83,10 @@ - <% if ( page.failureFlash || (error && error.length > 0 ) ) {%> -
- <% if ( page.failureFlash ) {%> -
- Erreur + <% + if ( flash.error.length > 0 ) { + for ( let i = 0 ; i < flash.error.length ; i += 1 ) { + %> +
+
+ Erreur +
+
+ <%= flash.error[i].replace('Error: ', '') %> +
-
- <%= page.failureFlash %> + <% + } + } + if ( flash.info.length > 0 ) { + for ( let i = 0 ; i < flash.info.length ; i += 1 ) { + %> +
+
+ Information +
+
+ <%= flash.info[i] %> +
- <% } %> - <% - if (error && error.length > 0) { - for( let i = 0 ; i < error.length ; i += 1 ) { - %> -
- Erreur -
-
- <%= error %> -
- <% - } - } - %> -
- <% } %> + <% + } + } + if ( flash.success.length > 0 ) { + for ( let i = 0 ; i < flash.success.length ; i += 1 ) { + %> +
+
+ Succès +
+
+ <%= flash.success[i] %> +
+
+ <% + } + } + %> <%- include(viewname) %> diff --git a/views/pages/ajouter-un-album.ejs b/views/pages/ajouter-un-album.ejs index 797bce6..0ab0b49 100644 --- a/views/pages/ajouter-un-album.ejs +++ b/views/pages/ajouter-un-album.ejs @@ -244,4 +244,4 @@ }, } }).mount('#app'); - + diff --git a/views/pages/composants.ejs b/views/pages/composants.ejs index 79b8ee6..1cba4e5 100644 --- a/views/pages/composants.ejs +++ b/views/pages/composants.ejs @@ -274,6 +274,22 @@ Ceci est une erreur
+
+
+ Information +
+
+ Ceci est une information +
+
+
+
+ Succès +
+
+ Ceci est un succès +
+
 <div class="flash">
     <div class="header">
diff --git a/views/pages/mon-compte/index.ejs b/views/pages/mon-compte/index.ejs
new file mode 100644
index 0000000..d8f7f6a
--- /dev/null
+++ b/views/pages/mon-compte/index.ejs
@@ -0,0 +1,99 @@
+
+

+ Mon compte +

+ +
+
+ +
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+ + +
+
+
+ +