-
Notifications
You must be signed in to change notification settings - Fork 11
Khiro-W2-Node.js #20
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Khiro-W2-Node.js #20
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
node_modules/ | ||
.env | ||
.DS_Store | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
import express from "express"; | ||
import fetch from "node-fetch"; | ||
import { API_KEY } from "./sources/keys.js"; | ||
const app = express(); | ||
app.use(express.json()); | ||
|
||
app.get("/", (req, res) => { | ||
res.send("Hello from the backend "); | ||
}); | ||
app.post("/weather", async (req, res) => { | ||
Comment on lines
+3
to
+10
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. consistent line spacing improves readability. |
||
const { cityName } = req.body; | ||
if (!cityName) { | ||
return res.status(400).json({ Error: "Please provide a city name" }); | ||
} | ||
|
||
try { | ||
const response = await fetch( | ||
`https://api.openweathermap.org/data/2.5/weather?q=${cityName}&appid=${API_KEY}&units=metric` | ||
); | ||
|
||
const weatherData = await response.json(); | ||
|
||
if (response.status === 404) { | ||
return res.status(404).json({ Error: "Invalid city name" }); | ||
} else { | ||
Comment on lines
+23
to
+25
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Two points:
|
||
const weatherobj = { | ||
Temp: Math.floor(weatherData.main.temp), | ||
Feels: Math.floor(weatherData.main.feels_like), | ||
Description: weatherData.weather[0].description, | ||
}; | ||
return res.json({ | ||
Temperature: ` the temperature in ${cityName} is ${weatherobj.Temp}`, | ||
Feels: `Feels like ${weatherobj.Feels}`, | ||
Description: `${weatherobj.Description}`, | ||
}); | ||
} | ||
} catch (error) { | ||
res.status(500).json({ Error: "Server error, please try later" }); | ||
} | ||
}); | ||
|
||
export default app; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
module.exports = { | ||
presets: [ | ||
[ | ||
// This is a configuration, here we are telling babel what configuration to use | ||
"@babel/preset-env", | ||
{ | ||
targets: { | ||
node: "current", | ||
}, | ||
}, | ||
], | ||
], | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
export default { | ||
// Tells jest that any file that has 2 .'s in it and ends with either js or jsx should be run through the babel-jest transformer | ||
transform: { | ||
"^.+\\.jsx?$": "babel-jest", | ||
}, | ||
// By default our `node_modules` folder is ignored by jest, this tells jest to transform those as well | ||
transformIgnorePatterns: [], | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
{ | ||
"name": "hackyourtemperature", | ||
"version": "1.0.0", | ||
"main": "server.js", | ||
"type": "module", | ||
"scripts": { | ||
"test": "jest", | ||
"start": "node server.js", | ||
"dev": "nodemon server.js" | ||
Comment on lines
+6
to
+9
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Love it. |
||
}, | ||
"keywords": [], | ||
"author": "", | ||
"license": "ISC", | ||
"description": "", | ||
"dependencies": { | ||
"dotenv": "^16.4.7", | ||
"express": "^4.21.2", | ||
"node-fetch": "^3.3.2" | ||
}, | ||
"devDependencies": { | ||
"@babel/preset-env": "^7.26.9", | ||
"babel-jest": "^29.7.0", | ||
"jest": "^29.7.0", | ||
"nodemon": "^3.1.9", | ||
"supertest": "^7.0.0" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
import app from "./app.js"; | ||
|
||
const PORT = 3000; | ||
app.listen(PORT, () => console.log(`Server is running on port ${PORT}!`)); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
import dotenv from "dotenv"; | ||
dotenv.config(); | ||
export const API_KEY = process.env.API_KEY; | ||
Comment on lines
+1
to
+3
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🥇 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
import app from "../app.js"; | ||
import supertest from "supertest"; | ||
|
||
const request = supertest(app); | ||
|
||
describe("POST /weather", () => { | ||
it("should return weather data for a valid city name", async () => { | ||
const response = await request.post("/weather").send({ | ||
cityName: "Amsterdam", | ||
}); | ||
expect(response.status).toBe(200); | ||
expect(response.body).toHaveProperty("Temperature"); | ||
}); | ||
|
||
it("should return an error if city name is not provided ", async () => { | ||
const response = await request.post("/weather").send({}); | ||
expect(response.status).toBe(400); | ||
expect(response.body.Error).toBe("Please provide a city name"); | ||
}); | ||
it("should return 404 status error for invalid city names", async () => { | ||
const response = await request.post("/weather").send({ | ||
cityName: "NoCity", | ||
}); | ||
expect(response.status).toBe(404); | ||
expect(response.body.Error).toBe("Invalid city name"); | ||
}); | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
{ | ||
"dependencies": { | ||
"express": "^4.21.2" | ||
}, | ||
"name": "node.js-cohort51", | ||
"version": "1.0.0", | ||
"description": "> If you are following the HackYourFuture curriculum we recommend you to start with module 1: [HTML/CSS/GIT](https://github.com/HackYourFuture/HTML-CSS). To get a complete overview of the HackYourFuture curriculum first, click [here](https://github.com/HackYourFuture/curriculum).", | ||
"main": "index.js", | ||
"type": "module", | ||
|
||
"scripts": { | ||
"test": "echo \"Error: no test specified\" && exit 1" | ||
}, | ||
"keywords": [], | ||
"author": "", | ||
"license": "ISC", | ||
"devDependencies": { | ||
"nodemon": "^3.1.9" | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍🏻