1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 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
| const express = require('express')
const router = express.Router()
const articles = require('../data/articles.js')
class Panier {
constructor () {
this.createdAt = new Date()
this.updatedAt = new Date()
this.articles = []
}
}
/**
* Dans ce fichier, vous trouverez des exemples de requêtes GET, POST, PUT et DELETE
* Ces requêtes concernent l'ajout ou la suppression d'articles sur le site
* Votre objectif est, en apprenant des exemples de ce fichier, de créer l'API pour le panier de l'utilisateur
*
* Notre site ne contient pas d'authentification, ce qui n'est pas DU TOUT recommandé.
* De même, les informations sont réinitialisées à chaque redémarrage du serveur, car nous n'avons pas de système de base de données pour faire persister les données
*/
/**
* Notre mécanisme de sauvegarde des paniers des utilisateurs sera de simplement leur attribuer un panier grâce à req.session, sans authentification particulière
*/
router.use((req, res, next) => {
// l'utilisateur n'est pas reconnu, lui attribuer un panier dans req.session
if (typeof req.session.panier === 'undefined') {
req.session.panier = new Panier()
}
next()
})
/*
* Cette route doit retourner le panier de l'utilisateur, grâce à req.session
*/
router.get('/panier', (req, res) => {
const id = parseInt(req.body.articleID)
const quant = parseInt(req.body.quantite)
res.json(req.session.panier)
if (isquant)
})
/*
* Cette route doit ajouter un article au panier, puis retourner le panier modifié à l'utilisateur
* Le body doit contenir l'id de l'article, ainsi que la quantité voulue
*/
router.post('/panier', (req, res) => {
res.status(501).json({ message: 'Not implemented' })
const id = parseInt(req.body.articleID)
const quant = parseInt(req.body.quantite)
// vérification de la validité des données d'entrée
if (typeof name !== 'string' || name === '' ||
typeof description !== 'string' || description === '' ||
typeof image !== 'string' || image === '' ||
isNaN(price) || price <= 0) {
res.status(400).json({ message: 'bad request' })
return
}
const panier= {
id: parseInt(req.body.articleID) ,
quant : parseInt(req.body.quantite)+1,
}
// on envoie l'article ajouté à l'utilisateur
res.json(req.session.panier)
})
/*
* Cette route doit permettre de confirmer un panier, en recevant le nom et prénom de l'utilisateur
* Le panier est ensuite supprimé grâce à req.session.destroy()
*/
router.post('/panier/pay', (req, res) => {
res.status(501).json({ message: 'Not implemented' })
})
/*
* Cette route doit permettre de changer la quantité d'un article dans le panier
* Le body doit contenir la quantité voulue
*/
router.put('/panier/:articleId', (req, res) => {
res.status(501).json({ message: 'Not implemented' })
const id = req.body.articleID
const quant = req.body.quantite
})
/*
* Cette route doit supprimer un article dans le panier
*/
router.delete('/panier/:articleId', (req, res) => {
res.status(501).json({ message: 'Not implemented' })
const index = req.session.panier.findIndex(req.session.panier)
})
/**
* Cette route envoie l'intégralité des articles du site
*/
router.get('/articles', (req, res) => {
res.json(articles)
})
/**
* Cette route crée un article.
* WARNING: dans un vrai site, elle devrait être authentifiée et valider que l'utilisateur est bien autorisé
* NOTE: lorsqu'on redémarre le serveur, l'article ajouté disparait
* Si on voulait persister l'information, on utiliserait une BDD (mysql, etc.)
*/
router.post('/article', (req, res) => {
const name = req.body.name
const description = req.body.description
const image = req.body.image
const price = parseInt(req.body.price)
// vérification de la validité des données d'entrée
if (typeof name !== 'string' || name === '' ||
typeof description !== 'string' || description === '' ||
typeof image !== 'string' || image === '' ||
isNaN(price) || price <= 0) {
res.status(400).json({ message: 'bad request' })
return
}
const article = {
id: articles.length + 1,
name: name,
description: description,
image: image,
price: price
}
articles.push(article)
// on envoie l'article ajouté à l'utilisateur
res.json(article)
})
/**
* Cette fonction fait en sorte de valider que l'article demandé par l'utilisateur
* est valide. Elle est appliquée aux routes:
* - GET /article/:articleId
* - PUT /article/:articleId
* - DELETE /article/:articleId
* Comme ces trois routes ont un comportement similaire, on regroupe leurs fonctionnalités communes dans un middleware
*/
function parseArticle (req, res, next) {
const articleId = parseInt(req.params.articleId)
// si articleId n'est pas un nombre (NaN = Not A Number), alors on s'arrête
if (isNaN(articleId)) {
res.status(400).json({ message: 'articleId should be a number' })
return
}
// on affecte req.articleId pour l'exploiter dans toutes les routes qui en ont besoin
req.articleId = articleId
const article = articles.find(a => a.id === req.articleId)
if (!article) {
res.status(404).json({ message: 'article ' + articleId + ' does not exist' })
return
}
// on affecte req.article pour l'exploiter dans toutes les routes qui en ont besoin
req.article = article
next()
}
router.route('/article/:articleId')
/**
* Cette route envoie un article particulier
*/
.get(parseArticle, (req, res) => {
// req.article existe grâce au middleware parseArticle
res.json(req.article)
})
/**
* Cette route modifie un article.
* WARNING: dans un vrai site, elle devrait être authentifiée et valider que l'utilisateur est bien autorisé
* NOTE: lorsqu'on redémarre le serveur, la modification de l'article disparait
* Si on voulait persister l'information, on utiliserait une BDD (mysql, etc.)
*/
.put(parseArticle, (req, res) => {
const name = req.body.name
const description = req.body.description
const image = req.body.image
const price = parseInt(req.body.price)
req.article.name = name
req.article.description = description
req.article.image = image
req.article.price = price
res.send()
})
.delete(parseArticle, (req, res) => {
const index = articles.findIndex(a => a.id === req.articleId)
articles.splice(index, 1) // remove the article from the array
res.send()
})
module.exports = router |
Partager