From e223aa0551bc2c080d82225cd274de046e896a6c Mon Sep 17 00:00:00 2001 From: Yana Seniuk Date: Wed, 30 Apr 2025 16:33:54 +0200 Subject: [PATCH 1/8] feat: complete week 1 assignment --- assignments/hackyourtemperature/.gitignore | 4 ++++ assignments/hackyourtemperature/package.json | 18 ++++++++++++++++++ assignments/hackyourtemperature/src/server.js | 17 +++++++++++++++++ .../src/temperature.controller.js | 19 +++++++++++++++++++ .../src/temperature.service.js | 5 +++++ 5 files changed, 63 insertions(+) create mode 100644 assignments/hackyourtemperature/.gitignore create mode 100644 assignments/hackyourtemperature/package.json create mode 100644 assignments/hackyourtemperature/src/server.js create mode 100644 assignments/hackyourtemperature/src/temperature.controller.js create mode 100644 assignments/hackyourtemperature/src/temperature.service.js diff --git a/assignments/hackyourtemperature/.gitignore b/assignments/hackyourtemperature/.gitignore new file mode 100644 index 000000000..9a3d3c991 --- /dev/null +++ b/assignments/hackyourtemperature/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.env +.vscode +npm-debug.log \ No newline at end of file diff --git a/assignments/hackyourtemperature/package.json b/assignments/hackyourtemperature/package.json new file mode 100644 index 000000000..d804045de --- /dev/null +++ b/assignments/hackyourtemperature/package.json @@ -0,0 +1,18 @@ +{ + "name": "hackyourtemperature", + "version": "1.0.0", + "description": "", + "main": "server.js", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node --watch --env-file=.env src/server.js" + }, + "author": "yanaesher", + "license": "ISC", + "devDependencies": { + "express": "^5.1.0", + "express-handlebars": "^8.0.3", + "node-fetch": "^3.3.2" + } +} diff --git a/assignments/hackyourtemperature/src/server.js b/assignments/hackyourtemperature/src/server.js new file mode 100644 index 000000000..74850cd2f --- /dev/null +++ b/assignments/hackyourtemperature/src/server.js @@ -0,0 +1,17 @@ +import express from "express"; +import { temperatureRouter } from "./temperature.controller.js"; + +const app = express(); +const PORT = process.env.PORT || 3000; + +function main() { + app.use(express.json()); + + app.use("/api/weather", temperatureRouter); + + app.listen(PORT, () => { + console.log(`Server is running at http://127.0.0.1:${PORT}`); + }); +} + +main(); diff --git a/assignments/hackyourtemperature/src/temperature.controller.js b/assignments/hackyourtemperature/src/temperature.controller.js new file mode 100644 index 000000000..983ee6295 --- /dev/null +++ b/assignments/hackyourtemperature/src/temperature.controller.js @@ -0,0 +1,19 @@ +import { Router } from "express"; +import { TemperatureService } from "./temperature.service.js"; +const temperatureRouter = Router(); +const temperatureService = new TemperatureService(); + +temperatureRouter.post("/", (req, res) => { + const { cityName } = req.body; + + if (!cityName) + return res.status(400).json({ + error: "Bad Request", + message: "Required parameter 'title' is missing", + }); + + const result = temperatureService.getCityName(cityName); + res.status(200).json(cityName); +}); + +export { temperatureRouter }; diff --git a/assignments/hackyourtemperature/src/temperature.service.js b/assignments/hackyourtemperature/src/temperature.service.js new file mode 100644 index 000000000..e5ac389b4 --- /dev/null +++ b/assignments/hackyourtemperature/src/temperature.service.js @@ -0,0 +1,5 @@ +export class TemperatureService { + getCityName(cityName) { + return cityName; + } +} From 793c1243e992551795f8bdb125b4193355690ccc Mon Sep 17 00:00:00 2001 From: Yana Seniuk Date: Wed, 30 Apr 2025 17:03:48 +0200 Subject: [PATCH 2/8] feat: add GET route and error handler --- assignments/hackyourtemperature/src/server.js | 6 +++++- .../hackyourtemperature/src/temperature.controller.js | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/assignments/hackyourtemperature/src/server.js b/assignments/hackyourtemperature/src/server.js index 74850cd2f..62426d8cd 100644 --- a/assignments/hackyourtemperature/src/server.js +++ b/assignments/hackyourtemperature/src/server.js @@ -7,7 +7,11 @@ const PORT = process.env.PORT || 3000; function main() { app.use(express.json()); - app.use("/api/weather", temperatureRouter); + app.use("/api", temperatureRouter); + + app.use((req, res) => { + res.status(404).json({ message: "Not found" }); + }); app.listen(PORT, () => { console.log(`Server is running at http://127.0.0.1:${PORT}`); diff --git a/assignments/hackyourtemperature/src/temperature.controller.js b/assignments/hackyourtemperature/src/temperature.controller.js index 983ee6295..0fb4deebf 100644 --- a/assignments/hackyourtemperature/src/temperature.controller.js +++ b/assignments/hackyourtemperature/src/temperature.controller.js @@ -3,6 +3,10 @@ import { TemperatureService } from "./temperature.service.js"; const temperatureRouter = Router(); const temperatureService = new TemperatureService(); +temperatureRouter.get("/", (req, res) => { + res.status(200).send("hello from backend to frontend!"); +}); + temperatureRouter.post("/", (req, res) => { const { cityName } = req.body; From d0bc139053ca73c2ac4016aca587e2b003e2684c Mon Sep 17 00:00:00 2001 From: Yana Seniuk Date: Wed, 30 Apr 2025 17:08:48 +0200 Subject: [PATCH 3/8] fix: update route/weather post path --- assignments/hackyourtemperature/package.json | 1 - assignments/hackyourtemperature/src/temperature.controller.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/assignments/hackyourtemperature/package.json b/assignments/hackyourtemperature/package.json index d804045de..99fc6585a 100644 --- a/assignments/hackyourtemperature/package.json +++ b/assignments/hackyourtemperature/package.json @@ -5,7 +5,6 @@ "main": "server.js", "type": "module", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", "start": "node --watch --env-file=.env src/server.js" }, "author": "yanaesher", diff --git a/assignments/hackyourtemperature/src/temperature.controller.js b/assignments/hackyourtemperature/src/temperature.controller.js index 0fb4deebf..8b7363c2b 100644 --- a/assignments/hackyourtemperature/src/temperature.controller.js +++ b/assignments/hackyourtemperature/src/temperature.controller.js @@ -7,7 +7,7 @@ temperatureRouter.get("/", (req, res) => { res.status(200).send("hello from backend to frontend!"); }); -temperatureRouter.post("/", (req, res) => { +temperatureRouter.post("/weather", (req, res) => { const { cityName } = req.body; if (!cityName) From 872594c01f0a4ebb65ec793125aa1ea1139ad567 Mon Sep 17 00:00:00 2001 From: Yana Seniuk Date: Wed, 30 Apr 2025 17:15:20 +0200 Subject: [PATCH 4/8] fix:: return the result from the service in the POST /weather endpoint --- assignments/hackyourtemperature/src/temperature.controller.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignments/hackyourtemperature/src/temperature.controller.js b/assignments/hackyourtemperature/src/temperature.controller.js index 8b7363c2b..4125dc86d 100644 --- a/assignments/hackyourtemperature/src/temperature.controller.js +++ b/assignments/hackyourtemperature/src/temperature.controller.js @@ -13,11 +13,11 @@ temperatureRouter.post("/weather", (req, res) => { if (!cityName) return res.status(400).json({ error: "Bad Request", - message: "Required parameter 'title' is missing", + message: "Required parameter 'cityName' is missing", }); const result = temperatureService.getCityName(cityName); - res.status(200).json(cityName); + res.status(200).json(result); }); export { temperatureRouter }; From 475c58de21a07bc2c76c8d45ac0bf05e93aaed0f Mon Sep 17 00:00:00 2001 From: Yana Seniuk Date: Fri, 2 May 2025 19:01:31 +0200 Subject: [PATCH 5/8] Refactor: added error handler --- .../src/controllers/weather.controller.js | 11 +++++++++ .../src/middlewares/error.middleware.js | 5 ++++ .../src/middlewares/notFound.middleware.js | 5 ++++ .../src/middlewares/validateBody.js | 9 ++++++++ .../src/routes/temperature.routes.js | 8 +++++++ assignments/hackyourtemperature/src/server.js | 21 ----------------- .../src/temperature.controller.js | 23 ------------------- .../src/temperature.service.js | 5 ---- 8 files changed, 38 insertions(+), 49 deletions(-) create mode 100644 assignments/hackyourtemperature/src/controllers/weather.controller.js create mode 100644 assignments/hackyourtemperature/src/middlewares/error.middleware.js create mode 100644 assignments/hackyourtemperature/src/middlewares/notFound.middleware.js create mode 100644 assignments/hackyourtemperature/src/middlewares/validateBody.js create mode 100644 assignments/hackyourtemperature/src/routes/temperature.routes.js delete mode 100644 assignments/hackyourtemperature/src/server.js delete mode 100644 assignments/hackyourtemperature/src/temperature.controller.js delete mode 100644 assignments/hackyourtemperature/src/temperature.service.js diff --git a/assignments/hackyourtemperature/src/controllers/weather.controller.js b/assignments/hackyourtemperature/src/controllers/weather.controller.js new file mode 100644 index 000000000..0cd25c2b2 --- /dev/null +++ b/assignments/hackyourtemperature/src/controllers/weather.controller.js @@ -0,0 +1,11 @@ +export function getCityName(req, res, next) { + const { cityName } = req.body; + + if (!cityName?.trim()) { + const error = new Error("Required parameter 'cityName' is missing"); + error.status = 400; + return next(error); + } + + res.status(200).json({ cityName }); +} diff --git a/assignments/hackyourtemperature/src/middlewares/error.middleware.js b/assignments/hackyourtemperature/src/middlewares/error.middleware.js new file mode 100644 index 000000000..dcd23d2af --- /dev/null +++ b/assignments/hackyourtemperature/src/middlewares/error.middleware.js @@ -0,0 +1,5 @@ +export function errorHandler(err, req, res, next) { + const statusCode = err.status || 500; + const message = err.message || "Something went wrong"; + res.status(statusCode).json({ message }); +} diff --git a/assignments/hackyourtemperature/src/middlewares/notFound.middleware.js b/assignments/hackyourtemperature/src/middlewares/notFound.middleware.js new file mode 100644 index 000000000..46b644b6f --- /dev/null +++ b/assignments/hackyourtemperature/src/middlewares/notFound.middleware.js @@ -0,0 +1,5 @@ +export function notFound(req, res, next) { + const error = new Error(`Not found`); + error.status = 404; + next(error); +} diff --git a/assignments/hackyourtemperature/src/middlewares/validateBody.js b/assignments/hackyourtemperature/src/middlewares/validateBody.js new file mode 100644 index 000000000..a988d0bcd --- /dev/null +++ b/assignments/hackyourtemperature/src/middlewares/validateBody.js @@ -0,0 +1,9 @@ +export function validateBody(req, res, next) { + if (!req.body || Object.keys(req.body).length === 0) { + const error = new Error("Request body is missing"); + error.status = 400; + return next(error); + } + + next(); +} diff --git a/assignments/hackyourtemperature/src/routes/temperature.routes.js b/assignments/hackyourtemperature/src/routes/temperature.routes.js new file mode 100644 index 000000000..9c6ebf277 --- /dev/null +++ b/assignments/hackyourtemperature/src/routes/temperature.routes.js @@ -0,0 +1,8 @@ +import { Router } from "express"; +import { validateBody } from "../middlewares/validateBody.js"; +import { getCityName } from "../controllers/weather.controller.js"; +const router = Router(); + +router.post("/", validateBody, getCityName); + +export default router; diff --git a/assignments/hackyourtemperature/src/server.js b/assignments/hackyourtemperature/src/server.js deleted file mode 100644 index 62426d8cd..000000000 --- a/assignments/hackyourtemperature/src/server.js +++ /dev/null @@ -1,21 +0,0 @@ -import express from "express"; -import { temperatureRouter } from "./temperature.controller.js"; - -const app = express(); -const PORT = process.env.PORT || 3000; - -function main() { - app.use(express.json()); - - app.use("/api", temperatureRouter); - - app.use((req, res) => { - res.status(404).json({ message: "Not found" }); - }); - - app.listen(PORT, () => { - console.log(`Server is running at http://127.0.0.1:${PORT}`); - }); -} - -main(); diff --git a/assignments/hackyourtemperature/src/temperature.controller.js b/assignments/hackyourtemperature/src/temperature.controller.js deleted file mode 100644 index 4125dc86d..000000000 --- a/assignments/hackyourtemperature/src/temperature.controller.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Router } from "express"; -import { TemperatureService } from "./temperature.service.js"; -const temperatureRouter = Router(); -const temperatureService = new TemperatureService(); - -temperatureRouter.get("/", (req, res) => { - res.status(200).send("hello from backend to frontend!"); -}); - -temperatureRouter.post("/weather", (req, res) => { - const { cityName } = req.body; - - if (!cityName) - return res.status(400).json({ - error: "Bad Request", - message: "Required parameter 'cityName' is missing", - }); - - const result = temperatureService.getCityName(cityName); - res.status(200).json(result); -}); - -export { temperatureRouter }; diff --git a/assignments/hackyourtemperature/src/temperature.service.js b/assignments/hackyourtemperature/src/temperature.service.js deleted file mode 100644 index e5ac389b4..000000000 --- a/assignments/hackyourtemperature/src/temperature.service.js +++ /dev/null @@ -1,5 +0,0 @@ -export class TemperatureService { - getCityName(cityName) { - return cityName; - } -} From 5fa752591fd876e45dafff1599a066cb570be4b7 Mon Sep 17 00:00:00 2001 From: Yana Seniuk Date: Fri, 2 May 2025 19:04:46 +0200 Subject: [PATCH 6/8] Include server.js --- assignments/hackyourtemperature/server.js | 33 +++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 assignments/hackyourtemperature/server.js diff --git a/assignments/hackyourtemperature/server.js b/assignments/hackyourtemperature/server.js new file mode 100644 index 000000000..b8553a956 --- /dev/null +++ b/assignments/hackyourtemperature/server.js @@ -0,0 +1,33 @@ +import express from "express"; +import weatherRouter from "./src/routes/temperature.routes.js"; + +import { notFound } from "./src/middlewares/notFound.middleware.js"; +import { errorHandler } from "./src/middlewares/error.middleware.js"; + +const app = express(); +const PORT = process.env.PORT || 3000; + +function main() { + app.use(express.json()); + app.use(express.urlencoded({ extended: false })); + + //check server works + app.get("/", (req, res) => { + res.status(200).send("hello from backend to frontend!"); + }); + + //Api Routes + app.use("/api/weather", weatherRouter); + + //non-exist path + app.use(notFound); + + //error handling + app.use(errorHandler); + + app.listen(PORT, () => { + console.log(`Server is running at http://127.0.0.1:${PORT}`); + }); +} + +main(); From 03c1982f943baa4bff376f3d9f3ef59076f12716 Mon Sep 17 00:00:00 2001 From: Yana Seniuk Date: Fri, 2 May 2025 19:06:33 +0200 Subject: [PATCH 7/8] include server.js --- assignments/hackyourtemperature/package.json | 2 +- assignments/hackyourtemperature/server.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assignments/hackyourtemperature/package.json b/assignments/hackyourtemperature/package.json index 99fc6585a..5cc9a66c3 100644 --- a/assignments/hackyourtemperature/package.json +++ b/assignments/hackyourtemperature/package.json @@ -5,7 +5,7 @@ "main": "server.js", "type": "module", "scripts": { - "start": "node --watch --env-file=.env src/server.js" + "start": "node --watch --env-file=.env server.js" }, "author": "yanaesher", "license": "ISC", diff --git a/assignments/hackyourtemperature/server.js b/assignments/hackyourtemperature/server.js index b8553a956..7c9a4f37d 100644 --- a/assignments/hackyourtemperature/server.js +++ b/assignments/hackyourtemperature/server.js @@ -21,7 +21,7 @@ function main() { //non-exist path app.use(notFound); - + //error handling app.use(errorHandler); From 903fe1ab6ecda06581f79af9c4130ea3524c1a22 Mon Sep 17 00:00:00 2001 From: yanaesher Date: Mon, 5 May 2025 23:24:03 +0200 Subject: [PATCH 8/8] refactor: json scripts changes, server moves src, get route changed --- assignments/hackyourtemperature/package.json | 3 +- assignments/hackyourtemperature/server.js | 33 ------------------- assignments/hackyourtemperature/src/server.js | 23 +++++++++++++ 3 files changed, 25 insertions(+), 34 deletions(-) delete mode 100644 assignments/hackyourtemperature/server.js create mode 100644 assignments/hackyourtemperature/src/server.js diff --git a/assignments/hackyourtemperature/package.json b/assignments/hackyourtemperature/package.json index 5cc9a66c3..9d77f23c3 100644 --- a/assignments/hackyourtemperature/package.json +++ b/assignments/hackyourtemperature/package.json @@ -5,7 +5,8 @@ "main": "server.js", "type": "module", "scripts": { - "start": "node --watch --env-file=.env server.js" + "start": "node src/server.js", + "dev": "node --watch --env-file=.env src/server.js" }, "author": "yanaesher", "license": "ISC", diff --git a/assignments/hackyourtemperature/server.js b/assignments/hackyourtemperature/server.js deleted file mode 100644 index 7c9a4f37d..000000000 --- a/assignments/hackyourtemperature/server.js +++ /dev/null @@ -1,33 +0,0 @@ -import express from "express"; -import weatherRouter from "./src/routes/temperature.routes.js"; - -import { notFound } from "./src/middlewares/notFound.middleware.js"; -import { errorHandler } from "./src/middlewares/error.middleware.js"; - -const app = express(); -const PORT = process.env.PORT || 3000; - -function main() { - app.use(express.json()); - app.use(express.urlencoded({ extended: false })); - - //check server works - app.get("/", (req, res) => { - res.status(200).send("hello from backend to frontend!"); - }); - - //Api Routes - app.use("/api/weather", weatherRouter); - - //non-exist path - app.use(notFound); - - //error handling - app.use(errorHandler); - - app.listen(PORT, () => { - console.log(`Server is running at http://127.0.0.1:${PORT}`); - }); -} - -main(); diff --git a/assignments/hackyourtemperature/src/server.js b/assignments/hackyourtemperature/src/server.js new file mode 100644 index 000000000..093907d4e --- /dev/null +++ b/assignments/hackyourtemperature/src/server.js @@ -0,0 +1,23 @@ +import express from "express"; +import weatherRouter from "./routes/temperature.routes.js"; + +import { notFound } from "./middlewares/notFound.middleware.js"; +import { errorHandler } from "./middlewares/error.middleware.js"; + +const app = express(); +const PORT = process.env.PORT || 3000; + +app.use(express.json()); +app.use(express.urlencoded({ extended: false })); + +app.use("/api/weather", weatherRouter); +app.get("/api", (req, res) => { + res.status(200).send("hello from backend to frontend!"); +}); + +app.use(notFound); +app.use(errorHandler); + +app.listen(PORT, () => { + console.log(`Server is running at http://127.0.0.1:${PORT}`); +});