Skip to content

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

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions assignments/config-files/hackyourtemperature/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules/
.env
.DS_Store
Comment on lines +1 to +3
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏻

42 changes: 42 additions & 0 deletions assignments/config-files/hackyourtemperature/app.js
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
Copy link

Choose a reason for hiding this comment

The 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
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two points:

  • it's a good idea to check for the response.ok as it's not always a 404 same as not okay
  • you are returning, it's an early return, no need for an else statement.

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;
13 changes: 13 additions & 0 deletions assignments/config-files/hackyourtemperature/babel.config.cjs
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",
},
},
],
],
};
8 changes: 8 additions & 0 deletions assignments/config-files/hackyourtemperature/jest.config.js
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: [],
};
27 changes: 27 additions & 0 deletions assignments/config-files/hackyourtemperature/package.json
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
Copy link

Choose a reason for hiding this comment

The 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"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions assignments/config-files/hackyourtemperature/server.js
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}!`));
3 changes: 3 additions & 0 deletions assignments/config-files/hackyourtemperature/sources/keys.js
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
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🥇

Empty file.
27 changes: 27 additions & 0 deletions assignments/config-files/hackyourtemperature/tests/app.test.js
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");
});
});
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 20 additions & 0 deletions package.json
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"
}
}