From c65efa27234d5a1ba2368de92511d20865ac606d Mon Sep 17 00:00:00 2001 From: skrooms Date: Tue, 16 Apr 2024 06:55:54 -0400 Subject: [PATCH 1/7] Implemented route to GET pokemon by Id --- src/routes/pokemon.ts | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/routes/pokemon.ts b/src/routes/pokemon.ts index 1edf970..bd12bce 100644 --- a/src/routes/pokemon.ts +++ b/src/routes/pokemon.ts @@ -5,35 +5,42 @@ const router = Router(); /* GET All Pokemon */ router.get("/", function (req: Request, res: Response, next: NextFunction): void { - res.json(pokedex); + res.json(pokedex); }); /* GET Pokemon by Id. */ -router.get("/:id", function (req: Request, res: Response, next: NextFunction): void { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs - res.status(501).json({ message: "Not Implemented" }); - return; +router.get("/:id", function (req: Request, res: Response, next: NextFunction) { + // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs + const result = pokedex.find((pokemon) => { + return String(pokemon.id) === req.params.id; + }); + + if (!result) { + return res.status(404).json({ message: `No Pokemon found with id:${req.params.id}` }); + } + + return res.status(200).json(result); }); /* GET Pokemon by English Name */ router.get("/name/:name", function (req: Request, res: Response, next: NextFunction): void { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs - res.status(501).json({ message: "Not Implemented" }); - return; + // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs + res.status(501).json({ message: "Not Implemented" }); + return; }); /* GET Pokemon by Type */ router.get("/type/:type", function (req: Request, res: Response, next: NextFunction): void { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs - res.status(501).json({ message: "Not Implemented" }); - return; + // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs + res.status(501).json({ message: "Not Implemented" }); + return; }); /* GET Pokemon by HP */ router.get("/hp", function (req: Request, res: Response, next: NextFunction): void { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs - res.status(501).json({ message: "Not Implemented" }); - return; + // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs + res.status(501).json({ message: "Not Implemented" }); + return; }); export default router; From a429a990b3c4461ef687f23215aaad42b6781f0b Mon Sep 17 00:00:00 2001 From: skrooms Date: Tue, 16 Apr 2024 07:13:19 -0400 Subject: [PATCH 2/7] Implemented route to GET pokemon by English name --- src/routes/pokemon.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/routes/pokemon.ts b/src/routes/pokemon.ts index bd12bce..9f9d4aa 100644 --- a/src/routes/pokemon.ts +++ b/src/routes/pokemon.ts @@ -4,13 +4,12 @@ import pokedex from "../db/pokedex.json"; const router = Router(); /* GET All Pokemon */ -router.get("/", function (req: Request, res: Response, next: NextFunction): void { - res.json(pokedex); +router.get("/", function (req: Request, res: Response, next: NextFunction) { + return res.status(200).json(pokedex); }); /* GET Pokemon by Id. */ router.get("/:id", function (req: Request, res: Response, next: NextFunction) { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs const result = pokedex.find((pokemon) => { return String(pokemon.id) === req.params.id; }); @@ -23,10 +22,17 @@ router.get("/:id", function (req: Request, res: Response, next: NextFunction) { }); /* GET Pokemon by English Name */ -router.get("/name/:name", function (req: Request, res: Response, next: NextFunction): void { +router.get("/name/:name", function (req: Request, res: Response, next: NextFunction) { // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs - res.status(501).json({ message: "Not Implemented" }); - return; + const result = pokedex.find((pokemon) => { + return pokemon.name.english.toLowerCase() === req.params.name; + }); + + if (!result) { + return res.status(404).json({ message: `No Pokemon found with name: ${req.params.name}` }); + } + + return res.status(200).json(result); }); /* GET Pokemon by Type */ From 79e77a921acecd31fd6ee2e47c4bc0ec8f06edd9 Mon Sep 17 00:00:00 2001 From: skrooms Date: Tue, 16 Apr 2024 07:28:25 -0400 Subject: [PATCH 3/7] Implemented route to GET Pokemon by type --- src/routes/pokemon.ts | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/routes/pokemon.ts b/src/routes/pokemon.ts index 9f9d4aa..687b285 100644 --- a/src/routes/pokemon.ts +++ b/src/routes/pokemon.ts @@ -23,7 +23,6 @@ router.get("/:id", function (req: Request, res: Response, next: NextFunction) { /* GET Pokemon by English Name */ router.get("/name/:name", function (req: Request, res: Response, next: NextFunction) { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs const result = pokedex.find((pokemon) => { return pokemon.name.english.toLowerCase() === req.params.name; }); @@ -36,10 +35,22 @@ router.get("/name/:name", function (req: Request, res: Response, next: NextFunct }); /* GET Pokemon by Type */ -router.get("/type/:type", function (req: Request, res: Response, next: NextFunction): void { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs - res.status(501).json({ message: "Not Implemented" }); - return; +router.get("/type/:type", function (req: Request, res: Response, next: NextFunction) { + const result = pokedex.filter((pokemon) => { + if (req.params.type) { + return pokemon.type + .map((type) => type.toLowerCase()) + .includes(req.params.type); + } else { + return false; + } + }); + + if (!result) { + return res.status(404).json({ message: `No Pokemon found with type: ${req.params.type}` }); + } + + return res.status(200).json(result); }); /* GET Pokemon by HP */ From 490f7a1b256136f5236378261e889d52dd1707b6 Mon Sep 17 00:00:00 2001 From: skrooms Date: Tue, 16 Apr 2024 07:35:41 -0400 Subject: [PATCH 4/7] Added error messages to :/id route as per Swagger docs --- src/routes/pokemon.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/routes/pokemon.ts b/src/routes/pokemon.ts index 687b285..755da67 100644 --- a/src/routes/pokemon.ts +++ b/src/routes/pokemon.ts @@ -10,12 +10,16 @@ router.get("/", function (req: Request, res: Response, next: NextFunction) { /* GET Pokemon by Id. */ router.get("/:id", function (req: Request, res: Response, next: NextFunction) { + if (!(typeof req.params.id === "number")) { + return res.status(400).json({ error: "Invalid ID" }); + } + const result = pokedex.find((pokemon) => { return String(pokemon.id) === req.params.id; }); if (!result) { - return res.status(404).json({ message: `No Pokemon found with id:${req.params.id}` }); + return res.status(404).json({ error: "Not found" }); } return res.status(200).json(result); From 806825337ac1c5bb365b23ae79e17f0dd6de246e Mon Sep 17 00:00:00 2001 From: skrooms Date: Tue, 16 Apr 2024 07:37:41 -0400 Subject: [PATCH 5/7] Updated error message for :name route as per Swagger docs --- src/routes/pokemon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/pokemon.ts b/src/routes/pokemon.ts index 755da67..ce27554 100644 --- a/src/routes/pokemon.ts +++ b/src/routes/pokemon.ts @@ -32,7 +32,7 @@ router.get("/name/:name", function (req: Request, res: Response, next: NextFunct }); if (!result) { - return res.status(404).json({ message: `No Pokemon found with name: ${req.params.name}` }); + return res.status(404).json({ error: "Not found" }); } return res.status(200).json(result); From 668702699346f1845c3f5d8caa094c94ece6f21b Mon Sep 17 00:00:00 2001 From: skrooms Date: Tue, 16 Apr 2024 07:41:26 -0400 Subject: [PATCH 6/7] Updated error message for :type route as per Swagger docs --- src/routes/pokemon.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/pokemon.ts b/src/routes/pokemon.ts index ce27554..4b50695 100644 --- a/src/routes/pokemon.ts +++ b/src/routes/pokemon.ts @@ -50,8 +50,8 @@ router.get("/type/:type", function (req: Request, res: Response, next: NextFunct } }); - if (!result) { - return res.status(404).json({ message: `No Pokemon found with type: ${req.params.type}` }); + if (result.length === 0) { + return res.status(400).json({ error: "Bad request" }); } return res.status(200).json(result); From 83e9dec0207b3ccd8ddb635ab9894af85ec2f55d Mon Sep 17 00:00:00 2001 From: skrooms Date: Tue, 16 Apr 2024 08:16:45 -0400 Subject: [PATCH 7/7] Implemented /hp route and corrected input validation for /:id route --- src/routes/pokemon.ts | 47 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/src/routes/pokemon.ts b/src/routes/pokemon.ts index 4b50695..0d66e1e 100644 --- a/src/routes/pokemon.ts +++ b/src/routes/pokemon.ts @@ -8,9 +8,47 @@ router.get("/", function (req: Request, res: Response, next: NextFunction) { return res.status(200).json(pokedex); }); +/* GET Pokemon by HP */ +router.get("/hp", function (req: Request, res: Response, next: NextFunction) { + // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs + let result = []; + + if (req.query.gt) { + result = pokedex.filter((pokemon) => { + // @ts-ignore + return pokemon.base.HP > req.query.gt; + }); + } else if (req.query.lt) { + result = pokedex.filter((pokemon) => { + // @ts-ignore + return pokemon.base.HP < req.query.lt; + }); + } else if (req.query.gte) { + result = pokedex.filter((pokemon) => { + // @ts-ignore + return pokemon.base.HP >= req.query.gte; + }); + } else if (req.query.lte) { + result = pokedex.filter((pokemon) => { + // @ts-ignore + return pokemon.base.HP <= req.query.lte; + }); + } else { + return res.status(400).json({ + error: "Invalid Operator. Must be one of [\"gt\",\"gte\",\"lt\",\"lte\"]" + }); + } + + if (result.length === 0) { + return res.status(404).json({ error: "Not found" }); + } + + return res.status(200).json(result); +}); + /* GET Pokemon by Id. */ router.get("/:id", function (req: Request, res: Response, next: NextFunction) { - if (!(typeof req.params.id === "number")) { + if (Number.isNaN(Number(req.params.id))) { return res.status(400).json({ error: "Invalid ID" }); } @@ -57,11 +95,4 @@ router.get("/type/:type", function (req: Request, res: Response, next: NextFunct return res.status(200).json(result); }); -/* GET Pokemon by HP */ -router.get("/hp", function (req: Request, res: Response, next: NextFunction): void { - // TODO: Implement this route. See swagger docs for details, by visiting http://localhost:3000/api-docs - res.status(501).json({ message: "Not Implemented" }); - return; -}); - export default router;