diff --git a/README.md b/README.md index a9c7be4..1079b94 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ Run project with `npm run start` + +Sign up to the NASA Open API to get your personal key. +Create a `.env` local file and store your new key there to use this app. diff --git a/app/index.ts b/app/index.ts new file mode 100644 index 0000000..0c54342 --- /dev/null +++ b/app/index.ts @@ -0,0 +1,15 @@ +import express from "express"; +import roverRouter from "../routes/roverRouter"; + +const app = express(); + +app.get("/", (req: any, res: any) => { + res.send(`Hello space traveller! + What are you exploring today? + A) /rovers = all rovers' info + B) /rovers/[your preferred rover's name]/photos = photos from that rover`) +}); + +app.use("/rovers", roverRouter); + +export default app; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ace770e..c9fb3d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,17 @@ { - "name": "MarsAppAPI", + "name": "marsappapi", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "marsappapi", + "version": "1.0.0", + "license": "ISC", "dependencies": { "@types/express": "^5.0.0", "axios": "^1.7.7", + "dotenv": "^16.4.5", "express": "^4.21.1", "nodemon": "^3.1.7", "ts-node": "^10.9.2" @@ -899,6 +904,18 @@ "node": ">=0.3.1" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", diff --git a/package.json b/package.json index 7ece7bb..a3eb9c7 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "dependencies": { "@types/express": "^5.0.0", "axios": "^1.7.7", + "dotenv": "^16.4.5", "express": "^4.21.1", "nodemon": "^3.1.7", "ts-node": "^10.9.2" @@ -11,5 +12,12 @@ }, "devDependencies": { "tsx": "^4.19.2" - } + }, + "name": "marsappapi", + "version": "1.0.0", + "description": "Run project with `npm run start`", + "main": "index.js", + "keywords": [], + "author": "", + "license": "ISC" } diff --git a/routes/roverRouter.ts b/routes/roverRouter.ts new file mode 100644 index 0000000..fb2b86c --- /dev/null +++ b/routes/roverRouter.ts @@ -0,0 +1,101 @@ +import express from "express"; +import axios from "axios"; +const roverRouter = express.Router(); + +import dotenv from "dotenv"; +dotenv.config({ path: './.env' }); +const apiKey = process.env.NASA_API_KEY; + +enum Cameras { + FHAZ = "FHAZ", + RHAZ = "RHAZ", + MAST = "MAST", + CHEMCAM = "CHEMCAM", + MAHLI = "MAHLI", + MARDI = "MARDI", + NAVCAM = "NAVCAM", + PANCAM = "PANCAM", + MINITES = "MINITES" +} + +enum Rovers { + CURIOSITY = "Curiosity", + SPIRIT = "Spirit", + OPPORTUNITY = "Opportunity", + PERSEVERANCE = "Perseverance" +} + +interface Camera { + id?: number; + name: string; + rover_id?: number; + full_name: string; +} + +interface Rover { + id: number; + name: string; + landing_date: string; + launch_date: string; + status: string; + max_sol: number; + max_date: string; + total_photos: number; + cameras: Camera[]; +} + +interface Photo { + id: number; + sol: number; + camera: Camera; + img_src: string; + earth_date: string; + rover: Rover; +} + +roverRouter.get('/', (req: any, res: any) => { + axios.get(`https://api.nasa.gov/mars-photos/api/v1/rovers`, { + params: { + api_key: apiKey + } + }) + .then(response => { + res.send(response.data); + }) + .catch(error => { + console.error(error); + res.render("error"); + }) +}); + +roverRouter.get('/:roverName/photos', (req: any, res: any) => { + + const { roverName } = req.params; + + const { camera, sol, page, paginationStart, paginationEnd } = req.query; + + axios.get(`https://api.nasa.gov/mars-photos/api/v1/rovers/${roverName}/photos`, { + params: { + api_key: apiKey, + camera: camera, + page: page || 1, + sol: sol || 1000 + } + }) + .then(response => { + const photos: Photo[] = response.data.photos; + const urls: string[] = []; + + photos.forEach(photo => { + urls.push(photo.img_src); + }); + + res.send(urls.slice(paginationStart - 1, paginationEnd)); + }) + .catch(error => { + console.error(error); + res.render("error"); + }) +}); + +export default roverRouter; \ No newline at end of file diff --git a/src/server.ts b/src/server.ts index 5214fdc..09a1fd1 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,14 +1,7 @@ -import express from "express"; +import app from "../app"; -const app = express(); -const port = 5000; - -app.use(express.json()); -const router = express.Router(); - -router.get('/', (req: any, res: any) => res.send('Hello world !')); -app.use('/', router); +const port = 3000; app.listen(port, () => { console.log(`Test backend is running on port ${port}`); -}); +}); \ No newline at end of file