diff --git a/README.md b/README.md index 962bfd07799bf2bcd0338b4c1cf3cc991c66123a..e8b843ab591261b6a5f7c9d2f21943ae194ed0bb 100644 --- a/README.md +++ b/README.md @@ -96,16 +96,16 @@ Une authentification sans mot de passe permet l'identification de l'utilisateur ### Interface REST API -Voici l'API REST CRUD exposée par le backend - -| Verbe HTTP | Endpoint | Données | Description | -|:-----------|:-------------------------|:------------|:------------| -| GET | emails/ | | Retourne la liste des mails des utilisateurs | -| GET | evaluated-jokes/ | | Retourne les blagues les mieux notées | -| GET | evaluated-jokes/*:email* | email* | Retourne les blagues notées par l'utilisateur | -| POST | evaluated-jokes/ | email*, id* | Ajout d'une nouvelle note à la blague (id) | -| PUT | evaluated-jokes/ | email*, id* | Modification de la note de la blague (id) | -| DELETE | evaluated-jokes/ | email*, id* | Suppression de la note de la blague (id) | +Voici l'API REST CRUD exposée par le backend sur /api/v1/ + +| Verbe HTTP | Endpoint | Données | Description | +|:-----------|:-----------------------------|:----------------------|:------------| +| GET | emails/ | | Retourne la liste des mails des utilisateurs | +| GET | jokes/:limit | | Retourne les blagues les mieux notées | +| GET | jokes/*:userEmail*/:limit | | Retourne les blagues notées par l'utilisateur | +| POST | jokes/ | userEmail\*, jokeId\* | Ajout d'une nouvelle note à la blague (jokeId) | +| DELETE | jokes/ | userEmail\*, jokeId\* | Suppression de la note de la blague (jokeId) | +| GET | likes/*:userEmail*/*:jokeId* | | Retourne la note d'une blague (jokeId) | \* Obligatoire diff --git a/backend/server.js b/backend/server.js index 642d75697a54e2c01f88034fd2a01558b836fc6b..e6234d7353d88ee1feece14af56cd57cc9be5ca2 100644 --- a/backend/server.js +++ b/backend/server.js @@ -9,18 +9,42 @@ app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(express.static('../frontend')) +/* +* API Documentation +*/ app.get('/api', function(request, response) { response.setHeader('Content-Type', 'text/plain'); - response.send('Documentation de l\'API à venir...'); - }) + response.send(` + Voici l'API REST CRUD exposée par le backend sur /api/v1/ + + | Verbe HTTP | Endpoint | Données | Description | + |:-----------|:-----------------------------|:--------------------|:-----------------------------------------------| + | GET | emails/ | | Retourne la liste des mails des utilisateurs | + | GET | jokes/:limit | | Retourne les blagues les mieux notées | + | GET | jokes/*:userEmail*/:limit | | Retourne les blagues notées par l'utilisateur | + | POST | jokes/ | userEmail\*, jokeId\* | Ajout d'une nouvelle note à la blague (jokeId) | + | DELETE | jokes/ | userEmail\*, jokeId\* | Suppression de la note de la blague (jokeId) | + | GET | likes/*:userEmail*/*:jokeId* | | Retourne la note d'une blague (jokeId) | + `); + }); +/* +* Best jokes +* params limit the number of jokes returned +*/ app.get('/api/v1/jokes/:limit?', function(request, response) { console.log('Best jokes', request.params); - response.json(jokes.getBestJokes()); - }) - + const limit = request.params.limit ? request.params.limit : 10; + response.json(jokes.getBestJokes(limit)); + }); + +/* +* Best jokes of specific users +* params userEmail* user's e-mail +* params limit the number of jokes returned +*/ app.get('/api/v1/jokes/:userEmail/:limit?', function(request, response) { console.log('My jokes', request.params); @@ -31,8 +55,13 @@ app.get('/api/v1/jokes/:userEmail/:limit?', function(request, response) { } response.status(400).end(); // Bad request - }) + }); +/* +* Like a joke +* params userEmail* user's e-mail +* params jokeId* joke id to like +*/ app.post('/api/v1/jokes', function(request, response) { console.log('Like joke', request.body); @@ -47,8 +76,14 @@ app.post('/api/v1/jokes', function(request, response) { } response.status(400).end(); // 400: Bad request - }) + }); + +/* +* Dislike a joke +* params userEmail* user's e-mail +* params jokeId* joke id to dislike +*/ app.delete('/api/v1/jokes', function(request, response) { console.log('Dislike', request.body); @@ -64,7 +99,12 @@ app.delete('/api/v1/jokes', function(request, response) { response.status(400).end(); // 400: Bad request }); - + +/* +* Is specific joke liked or not by specific user +* params userEmail* user's e-mail +* params jokeId* joke id to retreive +*/ app.get('/api/v1/likes/:userEmail/:jokeId', function(request, response) { console.log('Get like', request.params); @@ -73,7 +113,7 @@ app.get('/api/v1/likes/:userEmail/:jokeId', function(request, response) { let result = jokes.getJokeFor(request.params.jokeId, request.params.userEmail); - response.status(200).send(result); // 200: Ok + response.status(200).json({ isLiked: result }); // 200: Ok } response.status(400).end(); // 400: Bad request diff --git a/frontend/res/css/style.css b/frontend/res/css/style.css index d7701c5f91e06bf33bf370ec3c5d5c07f3892748..09b8e43201bd1c1ab9b6fdbafffd04e5cdbca98d 100644 --- a/frontend/res/css/style.css +++ b/frontend/res/css/style.css @@ -54,6 +54,7 @@ header > .container { header > .container > img { height: 100%; + margin: 0 54px; } header > .container > span { @@ -71,6 +72,18 @@ header > .container h1 { font-size: 2em; } +@media (max-width: 800px) { + header > .container h1 { + font-size: 1em; + } +} + +@media (max-width: 500px) { + header > .container img { + display: none; + } +} + /* NAVIGATION */ .console { @@ -95,6 +108,24 @@ header > .container h1 { margin: 0 var(--content-padding); } +@media (max-width: 600px) { + .console-content { + flex-direction: column; + } + + .console-content > input, .console-content button { + height: 32px; + } + + .console-content > input { + margin: 0; + } + + .console-content button { + width: 100%; + } +} + #console-error { color: red; } @@ -152,6 +183,16 @@ div.joke { } } +@media (max-width: 600px) { + nav { + flex-direction: column; + } + + nav > button { + height: 32px; + } +} + /* FOOTER */ body { diff --git a/frontend/res/js/display.js b/frontend/res/js/display.js index d498fceaf2888062634dbb38632fe52023907712..aaa78f7e87bccf507ce2a4697d686f200af0944d 100644 --- a/frontend/res/js/display.js +++ b/frontend/res/js/display.js @@ -32,7 +32,6 @@ function displayUserConnected(data) { document.getElementById('user-disconnected').style.display = 'none'; document.getElementById('user-connected').style.display = 'flex'; - // document.getElementById('my-jokes').disabled = false; document.getElementById('welcome-user').innerHTML = 'Connecté: ' + data.userEmail; changeDisabledPropertyForAllLikeBtn(false); @@ -48,8 +47,6 @@ function displayUserDisconnected() { document.getElementById('user-connected').style.display = 'none'; document.getElementById('user-disconnected').style.display = 'flex'; - // document.getElementById('my-jokes').disabled = true; - changeDisabledPropertyForAllLikeBtn(true); } diff --git a/frontend/res/js/jokes.js b/frontend/res/js/jokes.js index a245ff1803e9287ea0a010e18f00c37c383ce1d9..9c73d3c4bf8becb1d73614a678ff67a14d92638d 100644 --- a/frontend/res/js/jokes.js +++ b/frontend/res/js/jokes.js @@ -12,9 +12,7 @@ const JOKES_LIMIT = 10; export default { init: () => { - // TODO events.listen(events.MY_JOKES_BTN_CLICKED, retreiveMyJokes); events.listen([events.RANDOM_JOKES_BTN_CLICKED, events.LOGIN_SUCCEED], retreiveRandomJokes); - // TODO events.listen(events.BEST_JOKES_BTN_CLICKED, retreiveBestJokes); events.listen(events.LAST_JOKES_BTN_CLICKED, retreiveLastJokes); events.listen(events.LIKE_JOKE_BTN_CLICKED, likeJoke); events.listen(events.DISLIKE_JOKE_BTN_CLICKED, dislikeJoke); @@ -90,9 +88,9 @@ function checkLike(data) { const userEmail = login.getConnectedUserEmail(); data.forEach(joke => { return fetch('//localhost:8080/api/v1/likes/' + userEmail + '/' + joke.id) - .then(response => response.text()) + .then(response => response.json()) .then(result => { - if(result === 'true') { + if(result.isLiked) { events.send(events.RETREIVE_LIKE_SUCCEED, { jokeId: joke.id}); } }); diff --git a/frontend/res/js/login.js b/frontend/res/js/login.js index bdc4a710de740b6af01ced10c0bc339221117d58..3a7588160a4fb40af89d4f57f0a04523ae82746f 100644 --- a/frontend/res/js/login.js +++ b/frontend/res/js/login.js @@ -20,7 +20,6 @@ export default { function login(data) { console.log('Connecting...'); - // TODO regex for mail if (validateEmail(data.userEmail)) { userEmail = data.userEmail; events.send(events.LOGIN_SUCCEED, data);