From 0fac273d8f9557d46afe2866a63e74447582fc85 Mon Sep 17 00:00:00 2001 From: Ajelmar Medina Date: Sat, 16 Dec 2023 01:13:40 +0800 Subject: [PATCH 1/7] Get by ID --- src/package.json | 2 +- src/routes/pokemon.js | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/package.json b/src/package.json index 0aa5e2c..903a5bf 100644 --- a/src/package.json +++ b/src/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node ./bin/www" + "start": "nodemon ./bin/www" }, "dependencies": { "cookie-parser": "~1.4.4", diff --git a/src/routes/pokemon.js b/src/routes/pokemon.js index f1b6a3c..a0dd131 100644 --- a/src/routes/pokemon.js +++ b/src/routes/pokemon.js @@ -9,8 +9,14 @@ router.get("/", function (req, res, next) { /* GET Pokemon by Id. */ router.get("/:id", function (req, res, next) { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs - res.status(501).json({ message: "Not Implemented" }); + try { + const id = parseInt(req.params.id); + const searchResult = pokedex.find(pokemon => pokemon.id === id); + if (searchResult) res.status(200).json(searchResult); + else res.status(404).json({ error: "Not found" }); + } catch (e) { + res.status(400).json({ error: "Invalid ID" }); // Validate + } return; }); From af3921b791ddabb550c4a79eb9cc328cfe2ca33a Mon Sep 17 00:00:00 2001 From: Ajelmar Medina Date: Sat, 16 Dec 2023 12:57:21 +0800 Subject: [PATCH 2/7] #2 Get Pokemon by English Name --- src/routes/pokemon.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/routes/pokemon.js b/src/routes/pokemon.js index a0dd131..8845b1d 100644 --- a/src/routes/pokemon.js +++ b/src/routes/pokemon.js @@ -15,15 +15,17 @@ router.get("/:id", function (req, res, next) { if (searchResult) res.status(200).json(searchResult); else res.status(404).json({ error: "Not found" }); } catch (e) { - res.status(400).json({ error: "Invalid ID" }); // Validate + res.status(400).json({ error: "Invalid ID" }); } return; }); /* GET Pokemon by English Name */ router.get("/name/:name", function (req, res, next) { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs - res.status(501).json({ message: "Not Implemented" }); + const name = req.params.name.toLowerCase(); + const searchResult = pokedex.find(pokemon => `${pokemon.name.english}`.toLowerCase() == name); + if (searchResult) res.status(200).json(searchResult); + else res.status(404).json({ error: "Not found" }); return; }); From d95e323e68eccdbcdb9b7f81c3ad8c825685d503 Mon Sep 17 00:00:00 2001 From: Ajelmar Medina Date: Sat, 16 Dec 2023 13:16:58 +0800 Subject: [PATCH 3/7] #3 Get Pokemon by type --- src/routes/pokemon.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/routes/pokemon.js b/src/routes/pokemon.js index 8845b1d..b41dc35 100644 --- a/src/routes/pokemon.js +++ b/src/routes/pokemon.js @@ -31,8 +31,10 @@ router.get("/name/:name", function (req, res, next) { /* GET Pokemon by Type */ router.get("/type/:type", function (req, res, next) { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs - res.status(501).json({ message: "Not Implemented" }); + const qType = req.params.type.toLowerCase(); + const searchResults = pokedex.filter(pokemon => pokemon.type.find(type => type.toLowerCase() === qType)); + if (searchResults) res.status(200).json(searchResults); + else res.status(404).json({ error: "Not found" }); return; }); From fa7d5843191740f06ea2d817197c6a107c5578b6 Mon Sep 17 00:00:00 2001 From: Ajelmar Medina Date: Sat, 16 Dec 2023 13:18:34 +0800 Subject: [PATCH 4/7] HotFix --- src/routes/pokemon.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/pokemon.js b/src/routes/pokemon.js index b41dc35..c05a3a4 100644 --- a/src/routes/pokemon.js +++ b/src/routes/pokemon.js @@ -33,8 +33,8 @@ router.get("/name/:name", function (req, res, next) { router.get("/type/:type", function (req, res, next) { const qType = req.params.type.toLowerCase(); const searchResults = pokedex.filter(pokemon => pokemon.type.find(type => type.toLowerCase() === qType)); - if (searchResults) res.status(200).json(searchResults); - else res.status(404).json({ error: "Not found" }); + if (searchResults.length) res.status(200).json(searchResults); + else res.status(400).json({ error: "Bad request" }); return; }); From 74910b4b65e97125e30848693362aaeb5f8425f7 Mon Sep 17 00:00:00 2001 From: Ajelmar Medina Date: Sat, 16 Dec 2023 14:28:10 +0800 Subject: [PATCH 5/7] #4 Get Pokemon by HP --- src/routes/pokemon.js | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/routes/pokemon.js b/src/routes/pokemon.js index c05a3a4..5677800 100644 --- a/src/routes/pokemon.js +++ b/src/routes/pokemon.js @@ -7,6 +7,28 @@ router.get("/", function (req, res, next) { res.json(pokedex); }); +/* GET Pokemon by HP */ +router.get("/hp", function (req, res, next) { + const queryKeys = Object.keys(req.query) + if (queryKeys.length > 1 || !queryKeys.length) res.status(404).json({ error: "Not found" }); + let predicate; + switch (queryKeys[0]) { + case 'gt': predicate = pokemon => pokemon.base.HP > req.query["gt"]; + break; + case 'lt': predicate = pokemon => pokemon.base.HP < req.query["lt"]; + break; + case 'gte': predicate = pokemon => pokemon.base.HP > req.query["gte"]; + break; + case 'lte': predicate = pokemon => pokemon.base.HP < req.query["lte"]; + break; + default: res.status(400).json({ error: 'Invalid Operator. Must be one of ["gt","gte","lt","lte"]' }) + break; + } + const searchResults = pokedex.filter(predicate); + res.status(200).json(searchResults) + return; +}); + /* GET Pokemon by Id. */ router.get("/:id", function (req, res, next) { try { @@ -38,11 +60,4 @@ router.get("/type/:type", function (req, res, next) { return; }); -/* GET Pokemon by HP */ -router.get("/hp", function (req, res, next) { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs - res.status(501).json({ message: "Not Implemented" }); - return; -}); - module.exports = router; From 4914c6c434a270b94e475b010223737281a0cfac Mon Sep 17 00:00:00 2001 From: Ajelmar Medina Date: Sat, 16 Dec 2023 14:35:56 +0800 Subject: [PATCH 6/7] fix ECONNREFUSED --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 903a5bf..0aa5e2c 100644 --- a/src/package.json +++ b/src/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "nodemon ./bin/www" + "start": "node ./bin/www" }, "dependencies": { "cookie-parser": "~1.4.4", From b3026757e55a849c201f5153d96db9daf819a225 Mon Sep 17 00:00:00 2001 From: Ajelmar Medina Date: Sat, 16 Dec 2023 15:39:12 +0800 Subject: [PATCH 7/7] HotFix --- src/routes/pokemon.js | 51 +++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/src/routes/pokemon.js b/src/routes/pokemon.js index 5677800..2598670 100644 --- a/src/routes/pokemon.js +++ b/src/routes/pokemon.js @@ -1,6 +1,7 @@ const express = require("express"); const router = express.Router(); const pokedex = require("../db/pokedex.json"); +const { search } = require("./pokemon"); /* GET All Pokemon */ router.get("/", function (req, res, next) { @@ -9,36 +10,38 @@ router.get("/", function (req, res, next) { /* GET Pokemon by HP */ router.get("/hp", function (req, res, next) { - const queryKeys = Object.keys(req.query) - if (queryKeys.length > 1 || !queryKeys.length) res.status(404).json({ error: "Not found" }); - let predicate; - switch (queryKeys[0]) { - case 'gt': predicate = pokemon => pokemon.base.HP > req.query["gt"]; - break; - case 'lt': predicate = pokemon => pokemon.base.HP < req.query["lt"]; - break; - case 'gte': predicate = pokemon => pokemon.base.HP > req.query["gte"]; - break; - case 'lte': predicate = pokemon => pokemon.base.HP < req.query["lte"]; - break; - default: res.status(400).json({ error: 'Invalid Operator. Must be one of ["gt","gte","lt","lte"]' }) - break; + const queryKeys = Object.keys(req.query); + if (!queryKeys.length) return res.status(404).json({ error: "Not found" }); + + /** + * @returns {Boolean} if a given value tests valid with the respective query + */ + function testQuery(query, value) { + switch (query) { + case 'gt': return value > req.query["gt"]; + case 'lt': return value < req.query["lt"]; + case 'gte': return value > req.query["gte"]; + case 'lte': return value < req.query["lte"]; + default: res.status(400).json({ error: 'Invalid Operator. Must be one of ["gt","gte","lt","lte"]' }) + } } - const searchResults = pokedex.filter(predicate); - res.status(200).json(searchResults) + + const searchResults = pokedex.filter(pokemon => + queryKeys.reduce((isPassed, query) => + isPassed = isPassed ? testQuery(query, pokemon.base.HP) : false + , true)); + if (searchResults.length) res.status(200).json(searchResults); + else res.status(404).json({ error: "Not found" }) return; }); /* GET Pokemon by Id. */ router.get("/:id", function (req, res, next) { - try { - const id = parseInt(req.params.id); - const searchResult = pokedex.find(pokemon => pokemon.id === id); - if (searchResult) res.status(200).json(searchResult); - else res.status(404).json({ error: "Not found" }); - } catch (e) { - res.status(400).json({ error: "Invalid ID" }); - } + const id = parseInt(req.params.id); + if (isNaN(id)) return res.status(400).json({ error: "Invalid ID" }); + const searchResult = pokedex.find(pokemon => pokemon.id === id); + if (searchResult) res.status(200).json(searchResult); + else res.status(404).json({ error: "Not found" }); return; });