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..9d77f23c3 --- /dev/null +++ b/assignments/hackyourtemperature/package.json @@ -0,0 +1,18 @@ +{ + "name": "hackyourtemperature", + "version": "1.0.0", + "description": "", + "main": "server.js", + "type": "module", + "scripts": { + "start": "node src/server.js", + "dev": "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/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 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}`); +});