From c8892089250d0a980527d171a48ead881156b46d Mon Sep 17 00:00:00 2001 From: dbroqua Date: Sun, 6 Mar 2022 11:04:25 +0100 Subject: [PATCH] =?UTF-8?q?API:=20/me=20et=20mise=20=C3=A0=20jour=20du=20p?= =?UTF-8?q?ackage.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 13 +++---- src/app.js | 2 ++ src/middleware/Albums.js | 6 ++++ src/middleware/Me.js | 46 ++++++++++++++++++++++++ src/models/users.js | 12 ++++++- src/routes/api/v1/me.js | 24 +++++++++++++ views/pages/mon-compte/ma-collection.ejs | 39 +++++++++++++------- 7 files changed, 123 insertions(+), 19 deletions(-) create mode 100644 src/middleware/Me.js create mode 100644 src/routes/api/v1/me.js 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/src/app.js b/src/app.js index 0b32d82..268b589 100644 --- a/src/app.js +++ b/src/app.js @@ -16,6 +16,7 @@ import maCollectionRouter from "./routes/ma-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"); @@ -84,6 +85,7 @@ app.use("/", indexRouter); app.use("/ma-collection", maCollectionRouter); app.use("/api/v1/albums", importAlbumRouterApiV1); app.use("/api/v1/search", importSearchRouterApiV1); +app.use("/api/v1/me", importMeRouterApiV1); // Handle 404 app.use((req, res) => { diff --git a/src/middleware/Albums.js b/src/middleware/Albums.js index 4796207..06220df 100644 --- a/src/middleware/Albums.js +++ b/src/middleware/Albums.js @@ -11,6 +11,12 @@ 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 ""; diff --git a/src/middleware/Me.js b/src/middleware/Me.js new file mode 100644 index 0000000..68e0f2f --- /dev/null +++ b/src/middleware/Me.js @@ -0,0 +1,46 @@ +import Joi from "joi"; +import mongoose from "mongoose"; + +const Users = mongoose.model("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 Users.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 df62201..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"; @@ -28,7 +30,15 @@ const UserSchema = new mongoose.Schema( 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/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/views/pages/mon-compte/ma-collection.ejs b/views/pages/mon-compte/ma-collection.ejs index 7b74804..57fcb11 100644 --- a/views/pages/mon-compte/ma-collection.ejs +++ b/views/pages/mon-compte/ma-collection.ejs @@ -115,16 +115,26 @@ 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. + +
@@ -155,6 +165,7 @@ showModalDelete: false, showModalShare: false, shareLink: `${protocol}//${host}/collection/<%= user._id %>`, + isPublicCollection: <%= user.isPublicCollection ? 'true' : 'false' %>, } }, created() { @@ -241,13 +252,17 @@ }); }, shareCollection() { - axios.post(`/api/v1/me`, { - isPublicCollection: true, + axios.patch(`/api/v1/me`, { + isPublicCollection: !this.isPublicCollection, }) - .then( () => { + .then( (res) => { + this.isPublicCollection = res.data.isPublicCollection; showToastr("Collection partagée", true); - window.open(this.shareLink, '_blank'); + if ( this.isPublicCollection ) { + console.log('ici', this.shareLink) + window.open(this.shareLink, '_blank'); + } }) .catch((err) => { showToastr(err.response?.data?.message || "Impossible de supprimer cet album");