From d8b297a871f58cc3e91111ef9a16804ddc56044d Mon Sep 17 00:00:00 2001 From: rayan589 Date: Thu, 30 Dec 2021 13:59:10 +0100 Subject: [PATCH 1/2] backend --- poke-mongo/app.js | 47 +++++++ poke-mongo/package.json | 21 +++ poke-mongo/server.js | 8 ++ poke-mongo/server/db/index.js | 9 +- .../server/resources/pokemon/pokemon.js | 18 +++ .../resources/pokemon/pokemonController.js | 122 ++++++++++++++++++ .../server/resources/pokemon/pokemonRouter.js | 20 +++ 7 files changed, 242 insertions(+), 3 deletions(-) create mode 100644 poke-mongo/app.js create mode 100644 poke-mongo/package.json create mode 100644 poke-mongo/server.js create mode 100644 poke-mongo/server/resources/pokemon/pokemon.js create mode 100644 poke-mongo/server/resources/pokemon/pokemonController.js create mode 100644 poke-mongo/server/resources/pokemon/pokemonRouter.js diff --git a/poke-mongo/app.js b/poke-mongo/app.js new file mode 100644 index 0000000..ae1b5a8 --- /dev/null +++ b/poke-mongo/app.js @@ -0,0 +1,47 @@ +const mongoose = require ('mongoose'); +const express = require('express'); +const app = express(); +const morgan = require('morgan'); +const bodyParser = require('body-parser'); // to extract request bodies + +mongoose.connect('mongodb+srv://rayan:azerty123@bbkar-project.smvmj.mongodb.net/myFirstDatabase?retryWrites=true&w=majority'); + +const pokemonRoutes = require('/Users/macbookpro/Documents/GitHub/final-projects/poke-mongo/server/resources/pokemon/pokemonRouter.js'); + + +app.use(morgan('dev')); +app.use(bodyParser.urlencoded({extended: false})); // True allows you to parse extend bodies containing rich data +app.use(bodyParser.json()); // Extract json data and makes it easily readable to us. + +app.use((req, res, next) => { + res.header('Access-Control-Allow-Origin', '*'); + res.header( + 'Access-Control-Allow-Headers', + 'Origin, X-Requested-Width, Content-Type, Accept, Authorization' + ); + if (req.method === 'OPTIONS') { + res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET'); + return res.status.json({}); + } + next(); +}); + +// Routes which should handle requests +app.use('/pokemons', pokemonRoutes); + +app.use((req, res, next) => { + const error = new Error('Not found'); + error.status = 404; + next(error); +}); + +app.use((error, req, res, next) => { + res.status(error.status || 500); + res.json({ + error: { + message: error.message + } + }); +}); + +module.exports = app; \ No newline at end of file diff --git a/poke-mongo/package.json b/poke-mongo/package.json new file mode 100644 index 0000000..fec2b9a --- /dev/null +++ b/poke-mongo/package.json @@ -0,0 +1,21 @@ +{ + "name": "poke-mongo", + "version": "1.0.0", + "description": "pokemon API", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "nodemon server.js" + }, + "author": "Poparis", + "license": "ISC", + "dependencies": { + "body-parser": "^1.19.1", + "express": "^4.17.2", + "mongoose": "^6.1.3", + "morgan": "^1.10.0" + }, + "devDependencies": { + "nodemon": "^2.0.15" + } +} diff --git a/poke-mongo/server.js b/poke-mongo/server.js new file mode 100644 index 0000000..d6bc3f8 --- /dev/null +++ b/poke-mongo/server.js @@ -0,0 +1,8 @@ +const http = require('http'); +const app = require('./app'); + +const port = process.env.PORT || 3000; + +const server = http.createServer(app); + +server.listen(port); \ No newline at end of file diff --git a/poke-mongo/server/db/index.js b/poke-mongo/server/db/index.js index 433babf..23c7460 100644 --- a/poke-mongo/server/db/index.js +++ b/poke-mongo/server/db/index.js @@ -1,3 +1,6 @@ -/** - * Your Database Connection comes here - */ \ No newline at end of file +const mongoose = require ('mongoose'); + + +mongoose.connect('mongodb+srv://rayan:azerty123@cluster0.f8ili.mongodb.net/Pokemon?retryWrites=true&w=majority'); + +module.exports = router; \ No newline at end of file diff --git a/poke-mongo/server/resources/pokemon/pokemon.js b/poke-mongo/server/resources/pokemon/pokemon.js new file mode 100644 index 0000000..cba1181 --- /dev/null +++ b/poke-mongo/server/resources/pokemon/pokemon.js @@ -0,0 +1,18 @@ +const mongoose = require('mongoose'); + + +const pokemonSchema = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + number: { + type: Number, + unique: true + }, + name: { + type: String, + unique: true + }, + types: [String], + imgUrl: String +}); + +module.exports = mongoose.model('Pokemon', pokemonSchema); \ No newline at end of file diff --git a/poke-mongo/server/resources/pokemon/pokemonController.js b/poke-mongo/server/resources/pokemon/pokemonController.js new file mode 100644 index 0000000..2854165 --- /dev/null +++ b/poke-mongo/server/resources/pokemon/pokemonController.js @@ -0,0 +1,122 @@ +const express = require('express'); + +const mongoose = require('mongoose'); + +const Pokemon = require('/Users/macbookpro/Documents/GitHub/final-projects/poke-mongo/server/resources/pokemon/pokemon.js'); + +exports.get_pokemon = function(req, res, next) { + Pokemon.find() + .exec() + .then(docs => { + console.log(docs); + res.status(200).json(docs); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); + }; + +exports.post_pokemon = function(req, res, next) { + const pokemon = new Pokemon({ + _id: new mongoose.Types.ObjectId(), + number: req.body.number, + name: req.body.name, + types: req.body.types, + imgUrl: req.body.imgUrl + }); + pokemon + .save() //method save provided by mongoose to save in the database + .then(result => { + console.log(result); + res.status(201).json({ + message: 'Handling POST requests to /pokemon', + createdPokemon: result + }); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); +} + +exports.delete_pokemon = function(req, res, next) { + Pokemon.remove() + .exec() + .then(result => { + console.log(result); + res.status(200).json({ + message: 'Deleting All Pokemons', + deletedPokemons: result + }); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); + }; + +exports.get_number_pokemon = function(req, res, next) { + const Number = req.params.number; + Pokemon.find({number: Number}) + .exec() + .then(doc => { + console.log("From database", doc); + if (doc) { + res.status(200).json(doc); + } else { + res.status(404).json({message: 'No valid entry for provided number'}); + } + }) + .catch(err => { + console.log(err); + res.status(500).json({error: err}); + }); +} + +exports.update_number_pokemon = function(req, res, next) { + const Number = req.params.number; + Pokemon.update({number: Number}, {$set: {name: req.body.newName}}) + .exec() + .then(result => { + console.log(result); + res.status(200).json(result); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); +} + +exports.delete_number_pokemon = function(req, res, next) { + const Number = req.params.number; + m = Pokemon.find({number: Number}); + console.log(m); + Pokemon.deleteOne(m) + .exec() + .then(result => { + console.log(result); + res.status(200).json({ + message: (JSON.stringify(result) +'Deleted Pokemon'), + deletedPokemon: result + }); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }) +}; + + + + diff --git a/poke-mongo/server/resources/pokemon/pokemonRouter.js b/poke-mongo/server/resources/pokemon/pokemonRouter.js new file mode 100644 index 0000000..1ccb7ae --- /dev/null +++ b/poke-mongo/server/resources/pokemon/pokemonRouter.js @@ -0,0 +1,20 @@ +const express = require('express'); +const mongoose = require('mongoose'); +const router = express.Router(); // to manage routes + +const pokemonController = require('/Users/macbookpro/Documents/GitHub/final-projects/poke-mongo/server/resources/pokemon/pokemonController.js'); +const Pokemon = require('/Users/macbookpro/Documents/GitHub/final-projects/poke-mongo/server/resources/pokemon/pokemon.js'); + + +router.get('/', pokemonController.get_pokemon); +router.post('/', pokemonController.post_pokemon); +router.delete('/', pokemonController.delete_pokemon); +router.get('/:number', pokemonController.get_number_pokemon); +router.put('/:number', pokemonController.update_number_pokemon); +router.delete('/:number', pokemonController.delete_number_pokemon); + + + + + +module.exports = router; \ No newline at end of file From 23a9c1981ac24925af96b9dbbf3c30a0d9d2fff3 Mon Sep 17 00:00:00 2001 From: rayan589 Date: Sat, 1 Jan 2022 11:21:40 +0100 Subject: [PATCH 2/2] Final Version --- poke-mongo/client/.gitignore | 23 + poke-mongo/client/README.md | 70 ++ poke-mongo/client/package.json | 40 + poke-mongo/client/public/favicon.ico | Bin 0 -> 3870 bytes poke-mongo/client/public/index.html | 43 + poke-mongo/client/public/logo192.png | Bin 0 -> 5347 bytes poke-mongo/client/public/logo512.png | Bin 0 -> 9664 bytes poke-mongo/client/public/manifest.json | 25 + poke-mongo/client/public/robots.txt | 3 + poke-mongo/client/src/App.css | 54 ++ poke-mongo/client/src/App.js | 44 + poke-mongo/client/src/App.test.js | 8 + .../client/src/Components/AddNewPokemon2.js | 78 ++ .../src/Components/DeleteAllPokemons.js | 33 + poke-mongo/client/src/Components/Filter.js | 47 + poke-mongo/client/src/Components/Navbar.js | 38 + .../client/src/Components/PokemonList.js | 95 ++ poke-mongo/client/src/index.css | 13 + poke-mongo/client/src/index.js | 13 + poke-mongo/client/src/logo.svg | 1 + poke-mongo/client/src/nav.css | 31 + poke-mongo/poke-mongo/README.md | 104 ++ poke-mongo/poke-mongo/app.js | 57 ++ poke-mongo/poke-mongo/data/pokemon.json | 908 ++++++++++++++++++ poke-mongo/poke-mongo/package.json | 22 + poke-mongo/poke-mongo/server.js | 8 + poke-mongo/poke-mongo/server/index.js | 3 + .../server/resources/pokemon/pokemon.js | 17 + .../resources/pokemon/pokemonController.js | 123 +++ .../server/resources/pokemon/pokemonRouter.js | 6 +- poke-mongo/server/db/index.js | 9 +- .../server/resources/pokemon/pokemon.js | 18 - .../resources/pokemon/pokemonController.js | 122 --- 33 files changed, 1907 insertions(+), 149 deletions(-) create mode 100644 poke-mongo/client/.gitignore create mode 100644 poke-mongo/client/README.md create mode 100644 poke-mongo/client/package.json create mode 100644 poke-mongo/client/public/favicon.ico create mode 100644 poke-mongo/client/public/index.html create mode 100644 poke-mongo/client/public/logo192.png create mode 100644 poke-mongo/client/public/logo512.png create mode 100644 poke-mongo/client/public/manifest.json create mode 100644 poke-mongo/client/public/robots.txt create mode 100644 poke-mongo/client/src/App.css create mode 100644 poke-mongo/client/src/App.js create mode 100644 poke-mongo/client/src/App.test.js create mode 100644 poke-mongo/client/src/Components/AddNewPokemon2.js create mode 100644 poke-mongo/client/src/Components/DeleteAllPokemons.js create mode 100644 poke-mongo/client/src/Components/Filter.js create mode 100644 poke-mongo/client/src/Components/Navbar.js create mode 100644 poke-mongo/client/src/Components/PokemonList.js create mode 100644 poke-mongo/client/src/index.css create mode 100644 poke-mongo/client/src/index.js create mode 100644 poke-mongo/client/src/logo.svg create mode 100644 poke-mongo/client/src/nav.css create mode 100644 poke-mongo/poke-mongo/README.md create mode 100644 poke-mongo/poke-mongo/app.js create mode 100644 poke-mongo/poke-mongo/data/pokemon.json create mode 100644 poke-mongo/poke-mongo/package.json create mode 100644 poke-mongo/poke-mongo/server.js create mode 100644 poke-mongo/poke-mongo/server/index.js create mode 100644 poke-mongo/poke-mongo/server/resources/pokemon/pokemon.js create mode 100644 poke-mongo/poke-mongo/server/resources/pokemon/pokemonController.js rename poke-mongo/{ => poke-mongo}/server/resources/pokemon/pokemonRouter.js (58%) delete mode 100644 poke-mongo/server/resources/pokemon/pokemon.js delete mode 100644 poke-mongo/server/resources/pokemon/pokemonController.js diff --git a/poke-mongo/client/.gitignore b/poke-mongo/client/.gitignore new file mode 100644 index 0000000..4d29575 --- /dev/null +++ b/poke-mongo/client/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/poke-mongo/client/README.md b/poke-mongo/client/README.md new file mode 100644 index 0000000..58beeac --- /dev/null +++ b/poke-mongo/client/README.md @@ -0,0 +1,70 @@ +# Getting Started with Create React App + +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in your browser. + +The page will reload when you make changes.\ +You may also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can't go back!** + +If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. + +You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) + +### Analyzing the Bundle Size + +This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) + +### Making a Progressive Web App + +This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) + +### Advanced Configuration + +This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) + +### Deployment + +This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) + +### `npm run build` fails to minify + +This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) diff --git a/poke-mongo/client/package.json b/poke-mongo/client/package.json new file mode 100644 index 0000000..b42f0c1 --- /dev/null +++ b/poke-mongo/client/package.json @@ -0,0 +1,40 @@ +{ + "name": "client", + "version": "0.1.0", + "private": true, + "dependencies": { + "@testing-library/jest-dom": "^5.16.1", + "@testing-library/react": "^12.1.2", + "@testing-library/user-event": "^13.5.0", + "axios": "^0.24.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-router-dom": "^6.2.1", + "react-scripts": "5.0.0", + "web-vitals": "^2.1.2" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/poke-mongo/client/public/favicon.ico b/poke-mongo/client/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a GIT binary patch literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ literal 0 HcmV?d00001 diff --git a/poke-mongo/client/public/index.html b/poke-mongo/client/public/index.html new file mode 100644 index 0000000..aa069f2 --- /dev/null +++ b/poke-mongo/client/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
+ + + diff --git a/poke-mongo/client/public/logo192.png b/poke-mongo/client/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 diff --git a/poke-mongo/client/public/manifest.json b/poke-mongo/client/public/manifest.json new file mode 100644 index 0000000..080d6c7 --- /dev/null +++ b/poke-mongo/client/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/poke-mongo/client/public/robots.txt b/poke-mongo/client/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/poke-mongo/client/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/poke-mongo/client/src/App.css b/poke-mongo/client/src/App.css new file mode 100644 index 0000000..7f44141 --- /dev/null +++ b/poke-mongo/client/src/App.css @@ -0,0 +1,54 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +nav{ + display: flex; + justify-content: space-around; + align-items: center; + min-height: 10vh; + background: rgb(251, 255, 0); + color: rgb(255, 0, 0) +} +.nav-links{ + width: 50%; + display: flex; + justify-content: space-around; + align-items: center; + list-style: none +} \ No newline at end of file diff --git a/poke-mongo/client/src/App.js b/poke-mongo/client/src/App.js new file mode 100644 index 0000000..b0c9f50 --- /dev/null +++ b/poke-mongo/client/src/App.js @@ -0,0 +1,44 @@ +import React from "react"; + +import "./App.css"; + +import Navbar from "./Components/Navbar.js"; + +import PokemonList from "./Components/PokemonList.js"; + +import AddNewPokemon2 from "./Components/AddNewPokemon2.js"; + +import { + BrowserRouter as Router, + Switch, + Route, + Routes, +} from "react-router-dom"; + + + +import DeleteAllPokemons from './Components/DeleteAllPokemons.js'; +import Filter from './Components/Filter.js'; +function App() { + return ( +
+ + + +
+ + + } /> + } /> + {/* } /> */} + + }/> + }/> + +
+
+
+ ); +} + +export default App; diff --git a/poke-mongo/client/src/App.test.js b/poke-mongo/client/src/App.test.js new file mode 100644 index 0000000..1f03afe --- /dev/null +++ b/poke-mongo/client/src/App.test.js @@ -0,0 +1,8 @@ +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/poke-mongo/client/src/Components/AddNewPokemon2.js b/poke-mongo/client/src/Components/AddNewPokemon2.js new file mode 100644 index 0000000..ff08539 --- /dev/null +++ b/poke-mongo/client/src/Components/AddNewPokemon2.js @@ -0,0 +1,78 @@ +import React, { useState, useEffect } from "react"; + +import axios from "axios"; + +function AddNewPokemon2() { + const [name, setName] = useState(""); + const [types, setType] = useState([]); + const [number, setNumber] = useState(0); + const [imageUrl, setimageUrl] = useState(""); + + const [ListOfPokemons, setListOfPokemons] = useState([]); + const [isLoading, setLoading] = useState(true); + + useEffect(() => { + axios.get("http://localhost:7500/pokemons").then((response) => { + setListOfPokemons(response.data); + }); + }, []); + const createPokemon = () => { + axios + .post("http://localhost:7500/pokemons/pokemon", { + name, + number, + types, + imageUrl, + }) + .then((response) => { + setListOfPokemons([...ListOfPokemons, name, number, types, imageUrl]); + setLoading(false); + }); + }; + + return ( +
+ { + setName(event.target.value); + }} + /> + { + setNumber(event.target.value); + }} + /> + { + setType(event.target.value); + }} + /> + { + setimageUrl(event.target.value); + }} + /> + + {/* {ListOfPokemons.map((pokemon) => { + return ( +
+ {" "} +

{pokemon.name}

{pokemon.number}

{pokemon.types}

{" "} + +

{pokemon.imageUrl}

+
+ ); + })} */} +
+ ); +} + +export default AddNewPokemon2; diff --git a/poke-mongo/client/src/Components/DeleteAllPokemons.js b/poke-mongo/client/src/Components/DeleteAllPokemons.js new file mode 100644 index 0000000..9f947ed --- /dev/null +++ b/poke-mongo/client/src/Components/DeleteAllPokemons.js @@ -0,0 +1,33 @@ +import axios from 'axios'; +import React, { useState, useEffect } from "react"; + +function DeleteAllPokemons() { + +useEffect(() => { + axios.get("http://localhost:7500/pokemons").then((response) => { + // setListOfPokemons(response.data); + }); + }, []); + const deletePokemon = () => { + axios + .delete("http://localhost:7500/pokemon" ) + .then((response) => { + // setListOfPokemons([...ListOfPokemons, name, number, types, imageUrl]); + // setLoading(false); + }); + }; + + + return( + + + + ) +} +export default DeleteAllPokemons; + + + + + + diff --git a/poke-mongo/client/src/Components/Filter.js b/poke-mongo/client/src/Components/Filter.js new file mode 100644 index 0000000..406d267 --- /dev/null +++ b/poke-mongo/client/src/Components/Filter.js @@ -0,0 +1,47 @@ +import Axios from 'axios'; +import React, { useState, useEffect } from "react"; + +export default function Filter() { + const [listOfPokemons, setListOfPokemons] = useState([]); + + const [searchTerm, setSearchTerm] = useState(""); + + useEffect(() => { + Axios.get("http://localhost:7500/pokemons").then((response) => { + setListOfPokemons(response.data); + }); + }, []); + + return ( +
{ + setSearchTerm(event.target.value); + }} + /> + + + {listOfPokemons + .filter((user) => { + if (searchTerm == "") { + } else if ( + user.types[0].toLowerCase().includes(searchTerm.toLocaleLowerCase()) + ) { + return user; + } + }) + .map((user, key) => { + return ( +
+

author: {user.types}

+

title: {user.number}

+

comments: {user.name}

+

Points: {user.imageUrl}

+
+ ); + })} +
+); +} + diff --git a/poke-mongo/client/src/Components/Navbar.js b/poke-mongo/client/src/Components/Navbar.js new file mode 100644 index 0000000..cfed1e7 --- /dev/null +++ b/poke-mongo/client/src/Components/Navbar.js @@ -0,0 +1,38 @@ +import React from "react"; + + + +import { Link } from "react-router-dom"; + +import { BrowserRouter as Router, Switch, Route } from "react-router-dom"; + +function Navbar() { + const navStyle = { + color: "black", + }; + + return ( + + ); +} + +export default Navbar; diff --git a/poke-mongo/client/src/Components/PokemonList.js b/poke-mongo/client/src/Components/PokemonList.js new file mode 100644 index 0000000..40f0002 --- /dev/null +++ b/poke-mongo/client/src/Components/PokemonList.js @@ -0,0 +1,95 @@ +import React from "react"; +import { useState, useEffect } from "react"; + +import { + BrowserRouter as Router, + Switch, + Route, + Routes, +} from "react-router-dom"; +import { Link } from "react-router-dom"; +import axios from "axios"; + + +function PokemonList() { + const [listOfPokemons, setListOfPokemons] = useState([]); + useEffect(() => { + axios.get("http://localhost:7500/pokemons").then((response) => { + setListOfPokemons(response.data); + }); + }, []); + +const [Number, setNumber] = useState(0); + + + +const deleteOnePokemon = (number) => { + + axios.delete (`http://localhost:7500/pokemons/${number}`) + .then(()=> { + + }) + +} +const EditPokemon = (number) => { + axios.put(`http://localhost:7500/pokemons/${number}`,{Number: Number}) +} + + const navStyle = { + color: "white", + }; + + return ( +
+ Filter Pokemons + Home Page +

List Of Pokemons

+ +
+ Name + {listOfPokemons.map((pokemon) => { + console.log("test"); + return ( +
+ + {" "} +

{pokemon.name}

{pokemon.number}

{" "} +

{pokemon.types}

+

{pokemon.imageUrl}

+ + + {setNumber(event.target.value)}} /> + +
+ ); + })} +
+ +
+ Number + {listOfPokemons.map((pokemon) => { + return

{pokemon.number}

; + })} +
+ +
+ Type + {listOfPokemons.map((pokemon) => { + return

{pokemon.types}

; + })} +
+ +
+ imgUrl + {listOfPokemons.map((pokemon) => { + return

{pokemon.imgageUrl}

; + })} +
+ + + +
+ ); +} + +export default PokemonList; diff --git a/poke-mongo/client/src/index.css b/poke-mongo/client/src/index.css new file mode 100644 index 0000000..ec2585e --- /dev/null +++ b/poke-mongo/client/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/poke-mongo/client/src/index.js b/poke-mongo/client/src/index.js new file mode 100644 index 0000000..84ccb82 --- /dev/null +++ b/poke-mongo/client/src/index.js @@ -0,0 +1,13 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './index.css'; +import App from './App'; + + +ReactDOM.render( + + + , + document.getElementById('root') +); + diff --git a/poke-mongo/client/src/logo.svg b/poke-mongo/client/src/logo.svg new file mode 100644 index 0000000..9dfc1c0 --- /dev/null +++ b/poke-mongo/client/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/poke-mongo/client/src/nav.css b/poke-mongo/client/src/nav.css new file mode 100644 index 0000000..bf14465 --- /dev/null +++ b/poke-mongo/client/src/nav.css @@ -0,0 +1,31 @@ +.navbar { + + display: flex; + + justify-content: space-around; + + align-items: center; + + min-width: 10vh; + + background: rgb(243, 243, 106); + + color: black; + + } + + + + .nav-links { + + width: 40%; + + display: flex; + + justify-content: space-around; + + align-items: center; + + list-style: none; + + } \ No newline at end of file diff --git a/poke-mongo/poke-mongo/README.md b/poke-mongo/poke-mongo/README.md new file mode 100644 index 0000000..1a09e94 --- /dev/null +++ b/poke-mongo/poke-mongo/README.md @@ -0,0 +1,104 @@ +# Poké-MongoDB + +You are going to build a Pokémon API with Node, Express, and MongoDB. Your API will allow users to perform CRUD operations on each of the 151 original Pokémon, and power a front-end. + +## Project Structure + +The project contains 2 main directories + +- `server`: for your server side +- `client`: for your client side _(will be generated in the following steps)_ + +## Get Started + +## Requirements + +In addition to your frequent commits, **make a commit after completing each of the following steps** (marked by check boxes), indicating that you have just completed it. It may not be the case that you have time to complete all of the following steps, but regardless, **you must work on them in order.** + +- Back-end +- Front-end +- Middleware + +### Back-end + +> **Pro tip:** Install and use [Postman](https://www.getpostman.com/) to test your API routes for this section + +Using the existing code provided in `server/`, follow the steps below to build out a Pokémon API: + +| URL | HTTP Verb | Request Body | Result | +| :------------------: | :-------: | :----------: | :----------------------------------------------------------------------: | +| /api/pokemon | GET | empty | Return JSON of all Pokémon | +| /api/pokemon | POST | JSON | Create new Pokémon and return JSON of created Pokémon | +| /api/pokemon | DELETE | empty | Delete all Pokémon in and return JSON of deleted Pokémon | +| /api/pokemon/:number | GET | empty | Return JSON of single Pokémon with matching `number` | +| /api/pokemon/:number | PUT | JSON | Update Pokémon with matching `number` and return JSON of updated Pokémon | +| /api/pokemon/:number | DELETE | empty | Delete Pokémon with matching `number` and return JSON of deleted Pokémon | + +- [ ] Connect Mongoose to your local Mongo database in `db/index.js` +- [ ] Create a Pokémon model in `resources/pokemon/Pokemon.js` and register it with Mongoose as the `Pokemon` collection with the following properties: + - [ ] `number`, a unique number + - [ ] `name`, a unique string + - [ ] `types`, an array of strings + - [ ] `imgUrl`, a string +- [ ] Populate your Mongo database with the 151 original Pokémon found in `data/pokemon.json` +- [ ] Create a controller in `resources/pokemon/pokemonController.js` that interacts with your Pokémon model +- [ ] Create a router in `resources/pokemon/pokemonRouter.js` that utilizes each of your controller's methods. Be sure to handle errors appropriately. +- [ ] Import `pokemon.router` into `server.js` and assign it to the correct route + +### Front-end + +Inside of `client/`, implement a single page front end to interact with this API using React. + +Your front end should be served from Express and should allow the user to: + +- [ ] Display all Pokémon (with their images) +- [ ] Add a new Pokémon +- [ ] Filter Pokémon based on their type +- [ ] Edit existing Pokémon +- [ ] Delete Pokémon + +> **Instructions:** follow these instructions to have a well structured client application + +- [ ] Run this command a brand new React App in a folder named `client`. Then navigate to it. + +``` +npx create-react-app client +cd client/ +``` + +- [ ] Create a new folder called `components` +- [ ] Create the components that you'll need there: + - PokemonList.js + - PokemonDetails.js + - +- [ ] Use [React Router](https://reactrouter.com/) to route and pass data between components +- [ ] Create a `.env` file for your [environment variables](https://stackoverflow.com/questions/42182577/is-it-possible-to-use-dotenv-in-a-react-project), like so: + +``` +REACT_APP_API_URL="http://localhost:8000/api" +``` + +### Middleware (bonus) + +> **Important:** You must complete all of the steps in [back-end](#back-end) before moving onto this section. + +Inside of `server/middleware/rateLimiter.js`, create a custom middleware function in which you implement rate limiting for your API with the following guidelines. + +- [ ] Require each request to `/api/pokemon` to include a `User` property in the header +- [ ] Only allow a single user to make 100 requests per hour +- [ ] Mount your middleware in an appropriate location in `server/server.js` +- [ ] Update your front-end to send `user` property with each request + +### Available Resources + +You may visit each of these resources directly, or search for them on Google with the [`site:`](https://support.google.com/websearch/answer/2466433?hl=en) operator: + +- [MDN](https://developer.mozilla.org/en-US/) +- [Stack Overflow](http://stackoverflow.com/) +- [Express docs](https://expressjs.com/) +- [Mongo docs](https://docs.mongodb.com/) +- [Mongoose docs](http://mongoosejs.com/docs/index.html) +- [React docs](https://facebook.github.io/react/docs/getting-started.html) +- [Angular docs](https://docs.angularjs.org/api) +- [Backbone docs](http://backbonejs.org/) +- [Webpack docs](https://webpack.github.io/docs/) diff --git a/poke-mongo/poke-mongo/app.js b/poke-mongo/poke-mongo/app.js new file mode 100644 index 0000000..f8cd180 --- /dev/null +++ b/poke-mongo/poke-mongo/app.js @@ -0,0 +1,57 @@ +const mongoose = require("mongoose"); +const express = require("express"); +const app = express(); +const morgan = require("morgan"); +const cors = require("cors"); +const bodyParser = require("body-parser"); // to extract request bodies + +mongoose + .connect("mongodb://127.0.0.1:27017/pokemongo", { + useNewUrlParser: true, + useUnifiedTopology: true, + }) + .then(() => { + console.log("Connected to MongoDB..."); + }) + .catch((err) => { + console.log(err); + }); + +const pokemonRoutes = require("./server/resources/pokemon/pokemonRouter.js"); + +app.use(morgan("dev")); +app.use(bodyParser.urlencoded({ extended: false })); // True allows you to parse extend bodies containing rich data +app.use(bodyParser.json()); // Extract json data and makes it easily readable to us. +app.use(cors()); +// app.use((req, res, next) => { +// res.header("Access-Control-Allow-Origin", "*"); +// res.header( +// "Access-Control-Allow-Headers", +// "Origin, X-Requested-Width, Content-Type, Accept, Authorization" +// ); +// if (req.method === "OPTIONS") { +// res.header("Access-Control-Allow-Methods", "PUT, POST, PATCH, DELETE, GET"); +// return res.status.json({}); +// } +// next(); +// }); + +// Routes which should handle requests +app.use("/pokemons", pokemonRoutes); + +app.use((req, res, next) => { + const error = new Error("Not found"); + error.status = 404; + next(error); +}); + +app.use((error, req, res, next) => { + res.status(error.status || 500); + res.json({ + error: { + message: error.message, + }, + }); +}); + +module.exports = app; diff --git a/poke-mongo/poke-mongo/data/pokemon.json b/poke-mongo/poke-mongo/data/pokemon.json new file mode 100644 index 0000000..863c9ad --- /dev/null +++ b/poke-mongo/poke-mongo/data/pokemon.json @@ -0,0 +1,908 @@ +[ + { + "number": 1, + "name": "Bulbasaur", + "types": ["Grass", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/001.png?raw=true" + }, + { + "number": 2, + "name": "Ivysaur", + "types": ["Grass", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/002.png?raw=true" + }, + { + "number": 3, + "name": "Venusaur", + "types": ["Grass", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/003.png?raw=true" + }, + { + "number": 4, + "name": "Charmander", + "types": ["Fire"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/004.png?raw=true" + }, + { + "number": 5, + "name": "Charmeleon", + "types": ["Fire"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/005.png?raw=true" + }, + { + "number": 6, + "name": "Charizard", + "types": ["Fire", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/006.png?raw=true" + }, + { + "number": 7, + "name": "Squirtle", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/007.png?raw=true" + }, + { + "number": 8, + "name": "Wartortle", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/008.png?raw=true" + }, + { + "number": 9, + "name": "Blastoise", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/009.png?raw=true" + }, + { + "number": 10, + "name": "Caterpie", + "types": ["Bug"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/010.png?raw=true" + }, + { + "number": 11, + "name": "Metapod", + "types": ["Bug"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/011.png?raw=true" + }, + { + "number": 12, + "name": "Butterfree", + "types": ["Bug", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/012.png?raw=true" + }, + { + "number": 13, + "name": "Weedle", + "types": ["Bug", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/013.png?raw=true" + }, + { + "number": 14, + "name": "Kakuna", + "types": ["Bug", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/014.png?raw=true" + }, + { + "number": 15, + "name": "Beedrill", + "types": ["Bug", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/015.png?raw=true" + }, + { + "number": 16, + "name": "Pidgey", + "types": ["Normal", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/016.png?raw=true" + }, + { + "number": 17, + "name": "Pidgeotto", + "types": ["Normal", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/017.png?raw=true" + }, + { + "number": 18, + "name": "Pidgeot", + "types": ["Normal", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/018.png?raw=true" + }, + { + "number": 19, + "name": "Rattata", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/019.png?raw=true" + }, + { + "number": 20, + "name": "Raticate", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/020.png?raw=true" + }, + { + "number": 21, + "name": "Spearow", + "types": ["Normal", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/021.png?raw=true" + }, + { + "number": 22, + "name": "Fearow", + "types": ["Normal", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/022.png?raw=true" + }, + { + "number": 23, + "name": "Ekans", + "types": ["Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/023.png?raw=true" + }, + { + "number": 24, + "name": "Arbok", + "types": ["Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/024.png?raw=true" + }, + { + "number": 25, + "name": "Pikachu", + "types": ["Electric"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/025.png?raw=true" + }, + { + "number": 26, + "name": "Raichu", + "types": ["Electric"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/026.png?raw=true" + }, + { + "number": 27, + "name": "Sandshrew", + "types": ["Ground"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/027.png?raw=true" + }, + { + "number": 28, + "name": "Sandslash", + "types": ["Ground"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/028.png?raw=true" + }, + { + "number": 29, + "name": "Nidoran (♀)", + "types": ["Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/029.png?raw=true" + }, + { + "number": 30, + "name": "Nidorina", + "types": ["Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/030.png?raw=true" + }, + { + "number": 31, + "name": "Nidoqueen", + "types": ["Poison", "Ground"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/031.png?raw=true" + }, + { + "number": 32, + "name": "Nidoran (♂)", + "types": ["Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/032.png?raw=true" + }, + { + "number": 33, + "name": "Nidorino", + "types": ["Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/033.png?raw=true" + }, + { + "number": 34, + "name": "Nidoking", + "types": ["Poison", "Ground"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/034.png?raw=true" + }, + { + "number": 35, + "name": "Clefairy", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/035.png?raw=true" + }, + { + "number": 36, + "name": "Clefable", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/036.png?raw=true" + }, + { + "number": 37, + "name": "Vulpix", + "types": ["Fire"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/037.png?raw=true" + }, + { + "number": 38, + "name": "Ninetales", + "types": ["Fire"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/038.png?raw=true" + }, + { + "number": 39, + "name": "Jigglypuff", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/039.png?raw=true" + }, + { + "number": 40, + "name": "Wigglytuff", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/040.png?raw=true" + }, + { + "number": 41, + "name": "Zubat", + "types": ["Poison", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/041.png?raw=true" + }, + { + "number": 42, + "name": "Golbat", + "types": ["Poison", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/042.png?raw=true" + }, + { + "number": 43, + "name": "Oddish", + "types": ["Grass", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/043.png?raw=true" + }, + { + "number": 44, + "name": "Gloom", + "types": ["Grass", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/044.png?raw=true" + }, + { + "number": 45, + "name": "Vileplume", + "types": ["Grass", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/045.png?raw=true" + }, + { + "number": 46, + "name": "Paras", + "types": ["Bug", "Grass"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/046.png?raw=true" + }, + { + "number": 47, + "name": "Parasect", + "types": ["Bug", "Grass"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/047.png?raw=true" + }, + { + "number": 48, + "name": "Venonat", + "types": ["Bug", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/048.png?raw=true" + }, + { + "number": 49, + "name": "Venomoth", + "types": ["Bug", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/049.png?raw=true" + }, + { + "number": 50, + "name": "Diglett", + "types": ["Ground"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/050.png?raw=true" + }, + { + "number": 51, + "name": "Dugtrio", + "types": ["Ground"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/051.png?raw=true" + }, + { + "number": 52, + "name": "Meowth", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/052.png?raw=true" + }, + { + "number": 53, + "name": "Persian", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/053.png?raw=true" + }, + { + "number": 54, + "name": "Psyduck", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/054.png?raw=true" + }, + { + "number": 55, + "name": "Golduck", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/055.png?raw=true" + }, + { + "number": 56, + "name": "Mankey", + "types": ["Fighting"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/056.png?raw=true" + }, + { + "number": 57, + "name": "Primeape", + "types": ["Fighting"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/057.png?raw=true" + }, + { + "number": 58, + "name": "Growlithe", + "types": ["Fire"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/058.png?raw=true" + }, + { + "number": 59, + "name": "Arcanine", + "types": ["Fire"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/059.png?raw=true" + }, + { + "number": 60, + "name": "Poliwag", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/060.png?raw=true" + }, + { + "number": 61, + "name": "Poliwhirl", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/061.png?raw=true" + }, + { + "number": 62, + "name": "Poliwrath", + "types": ["Water", "Fighting"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/062.png?raw=true" + }, + { + "number": 63, + "name": "Abra", + "types": ["Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/063.png?raw=true" + }, + { + "number": 64, + "name": "Kadabra", + "types": ["Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/064.png?raw=true" + }, + { + "number": 65, + "name": "Alakazam", + "types": ["Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/065.png?raw=true" + }, + { + "number": 66, + "name": "Machop", + "types": ["Fighting"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/066.png?raw=true" + }, + { + "number": 67, + "name": "Machoke", + "types": ["Fighting"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/067.png?raw=true" + }, + { + "number": 68, + "name": "Machamp", + "types": ["Fighting"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/068.png?raw=true" + }, + { + "number": 69, + "name": "Bellsprout", + "types": ["Grass", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/069.png?raw=true" + }, + { + "number": 70, + "name": "Weepinbell", + "types": ["Grass", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/070.png?raw=true" + }, + { + "number": 71, + "name": "Victreebel", + "types": ["Grass", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/071.png?raw=true" + }, + { + "number": 72, + "name": "Tentacool", + "types": ["Water", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/072.png?raw=true" + }, + { + "number": 73, + "name": "Tentacruel", + "types": ["Water", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/073.png?raw=true" + }, + { + "number": 74, + "name": "Geodude", + "types": ["Rock", "Ground"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/074.png?raw=true" + }, + { + "number": 75, + "name": "Graveler", + "types": ["Rock", "Ground"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/075.png?raw=true" + }, + { + "number": 76, + "name": "Golem", + "types": ["Rock", "Ground"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/076.png?raw=true" + }, + { + "number": 77, + "name": "Ponyta", + "types": ["Fire"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/077.png?raw=true" + }, + { + "number": 78, + "name": "Rapidash", + "types": ["Fire"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/078.png?raw=true" + }, + { + "number": 79, + "name": "Slowpoke", + "types": ["Water", "Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/079.png?raw=true" + }, + { + "number": 80, + "name": "Slowbro", + "types": ["Water", "Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/080.png?raw=true" + }, + { + "number": 81, + "name": "Magnemite", + "types": ["Electric"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/081.png?raw=true" + }, + { + "number": 82, + "name": "Magneton", + "types": ["Electric"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/082.png?raw=true" + }, + { + "number": 83, + "name": "Farfetch'd", + "types": ["Normal", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/083.png?raw=true" + }, + { + "number": 84, + "name": "Doduo", + "types": ["Normal", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/084.png?raw=true" + }, + { + "number": 85, + "name": "Dodrio", + "types": ["Normal", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/085.png?raw=true" + }, + { + "number": 86, + "name": "Seel", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/086.png?raw=true" + }, + { + "number": 87, + "name": "Dewgong", + "types": ["Water", "Ice"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/087.png?raw=true" + }, + { + "number": 88, + "name": "Grimer", + "types": ["Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/088.png?raw=true" + }, + { + "number": 89, + "name": "Muk", + "types": ["Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/089.png?raw=true" + }, + { + "number": 90, + "name": "Shellder", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/090.png?raw=true" + }, + { + "number": 91, + "name": "Cloyster", + "types": ["Water", "Ice"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/091.png?raw=true" + }, + { + "number": 92, + "name": "Gastly", + "types": ["Ghost", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/092.png?raw=true" + }, + { + "number": 93, + "name": "Haunter", + "types": ["Ghost", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/093.png?raw=true" + }, + { + "number": 94, + "name": "Gengar", + "types": ["Ghost", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/094.png?raw=true" + }, + { + "number": 95, + "name": "Onix", + "types": ["Rock"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/095.png?raw=true" + }, + { + "number": 96, + "name": "Drowzee", + "types": ["Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/096.png?raw=true" + }, + { + "number": 97, + "name": "Hypno", + "types": ["Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/097.png?raw=true" + }, + { + "number": 98, + "name": "Krabby", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/098.png?raw=true" + }, + { + "number": 99, + "name": "Kingler", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/099.png?raw=true" + }, + { + "number": 100, + "name": "Voltorb", + "types": ["Electric"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/100.png?raw=true" + }, + { + "number": 101, + "name": "Electrode", + "types": ["Electric"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/101.png?raw=true" + }, + { + "number": 102, + "name": "Exeggcute", + "types": ["Grass", "Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/102.png?raw=true" + }, + { + "number": 103, + "name": "Exeggutor", + "types": ["Grass", "Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/103.png?raw=true" + }, + { + "number": 104, + "name": "Cubone", + "types": ["Ground"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/104.png?raw=true" + }, + { + "number": 105, + "name": "Marowak", + "types": ["Ground"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/105.png?raw=true" + }, + { + "number": 106, + "name": "Hitmonlee", + "types": ["Fighting"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/106.png?raw=true" + }, + { + "number": 107, + "name": "Hitmonchan", + "types": ["Fighting"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/107.png?raw=true" + }, + { + "number": 108, + "name": "Lickitung", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/108.png?raw=true" + }, + { + "number": 109, + "name": "Koffing", + "types": ["Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/109.png?raw=true" + }, + { + "number": 110, + "name": "Weezing", + "types": ["Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/110.png?raw=true" + }, + { + "number": 111, + "name": "Rhyhorn", + "types": ["Ground", "Rock"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/111.png?raw=true" + }, + { + "number": 112, + "name": "Rhydon", + "types": ["Ground", "Rock"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/112.png?raw=true" + }, + { + "number": 113, + "name": "Chansey", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/113.png?raw=true" + }, + { + "number": 114, + "name": "Tangela", + "types": ["Grass"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/114.png?raw=true" + }, + { + "number": 115, + "name": "Kangaskhan", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/115.png?raw=true" + }, + { + "number": 116, + "name": "Horsea", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/116.png?raw=true" + }, + { + "number": 117, + "name": "Seadra", + "types": ["Water", "Poison"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/117.png?raw=true" + }, + { + "number": 118, + "name": "Goldeen", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/118.png?raw=true" + }, + { + "number": 119, + "name": "Seaking", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/119.png?raw=true" + }, + { + "number": 120, + "name": "Staryu", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/120.png?raw=true" + }, + { + "number": 121, + "name": "Starmie", + "types": ["Water", "Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/121.png?raw=true" + }, + { + "number": 122, + "name": "Mr. Mime", + "types": ["Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/122.png?raw=true" + }, + { + "number": 123, + "name": "Scyther", + "types": ["Bug", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/123.png?raw=true" + }, + { + "number": 124, + "name": "Jynx", + "types": ["Ice", "Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/124.png?raw=true" + }, + { + "number": 125, + "name": "Electabuzz", + "types": ["Electric"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/125.png?raw=true" + }, + { + "number": 126, + "name": "Magmar", + "types": ["Fire"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/126.png?raw=true" + }, + { + "number": 127, + "name": "Pinsir", + "types": ["Bug"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/127.png?raw=true" + }, + { + "number": 128, + "name": "Tauros", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/128.png?raw=true" + }, + { + "number": 129, + "name": "Magikarp", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/129.png?raw=true" + }, + { + "number": 130, + "name": "Gyarados", + "types": ["Water", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/130.png?raw=true" + }, + { + "number": 131, + "name": "Lapras", + "types": ["Water", "Ice"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/131.png?raw=true" + }, + { + "number": 132, + "name": "Ditto", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/132.png?raw=true" + }, + { + "number": 133, + "name": "Eevee", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/133.png?raw=true" + }, + { + "number": 134, + "name": "Vaporeon", + "types": ["Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/134.png?raw=true" + }, + { + "number": 135, + "name": "Jolteon", + "types": ["Electric"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/135.png?raw=true" + }, + { + "number": 136, + "name": "Flareon", + "types": ["Fire"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/136.png?raw=true" + }, + { + "number": 137, + "name": "Porygon", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/137.png?raw=true" + }, + { + "number": 138, + "name": "Omanyte", + "types": ["Rock", "Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/138.png?raw=true" + }, + { + "number": 139, + "name": "Omastar", + "types": ["Rock", "Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/139.png?raw=true" + }, + { + "number": 140, + "name": "Kabuto", + "types": ["Rock", "Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/140.png?raw=true" + }, + { + "number": 141, + "name": "Kabutops", + "types": ["Rock", "Water"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/141.png?raw=true" + }, + { + "number": 142, + "name": "Aerodactyl", + "types": ["Rock", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/142.png?raw=true" + }, + { + "number": 143, + "name": "Snorlax", + "types": ["Normal"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/143.png?raw=true" + }, + { + "number": 144, + "name": "Articuno", + "types": ["Ice", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/144.png?raw=true" + }, + { + "number": 145, + "name": "Zapdos", + "types": ["Electric", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/145.png?raw=true" + }, + { + "number": 146, + "name": "Moltres", + "types": ["Fire", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/146.png?raw=true" + }, + { + "number": 147, + "name": "Dratini", + "types": ["Dragon"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/147.png?raw=true" + }, + { + "number": 148, + "name": "Dragonair", + "types": ["Dragon"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/148.png?raw=true" + }, + { + "number": 149, + "name": "Dragonite", + "types": ["Dragon", "Flying"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/149.png?raw=true" + }, + { + "number": 150, + "name": "Mewtwo", + "types": ["Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/150.png?raw=true" + }, + { + "number": 151, + "name": "Mew", + "types": ["Psychic"], + "imageUrl": "https://github.com/HybridShivam/Pokemon/blob/master/assets/images/151.png?raw=true" + } + ] \ No newline at end of file diff --git a/poke-mongo/poke-mongo/package.json b/poke-mongo/poke-mongo/package.json new file mode 100644 index 0000000..f375a02 --- /dev/null +++ b/poke-mongo/poke-mongo/package.json @@ -0,0 +1,22 @@ +{ + "name": "poke-mongo", + "version": "1.0.0", + "description": "pokemon API", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "nodemon server.js" + }, + "author": "Poparis", + "license": "ISC", + "dependencies": { + "body-parser": "^1.19.1", + "cors": "^2.8.5", + "express": "^4.17.2", + "mongoose": "^6.1.3", + "morgan": "^1.10.0" + }, + "devDependencies": { + "nodemon": "^2.0.15" + } +} diff --git a/poke-mongo/poke-mongo/server.js b/poke-mongo/poke-mongo/server.js new file mode 100644 index 0000000..7d706c7 --- /dev/null +++ b/poke-mongo/poke-mongo/server.js @@ -0,0 +1,8 @@ +const http = require('http'); +const app = require('./app'); + +const port = process.env.PORT || 7500; + +const server = http.createServer(app); + +server.listen(port); \ No newline at end of file diff --git a/poke-mongo/poke-mongo/server/index.js b/poke-mongo/poke-mongo/server/index.js new file mode 100644 index 0000000..66cd61e --- /dev/null +++ b/poke-mongo/poke-mongo/server/index.js @@ -0,0 +1,3 @@ +/** + * Your server comes here + */ \ No newline at end of file diff --git a/poke-mongo/poke-mongo/server/resources/pokemon/pokemon.js b/poke-mongo/poke-mongo/server/resources/pokemon/pokemon.js new file mode 100644 index 0000000..76b67ac --- /dev/null +++ b/poke-mongo/poke-mongo/server/resources/pokemon/pokemon.js @@ -0,0 +1,17 @@ +const mongoose = require("mongoose"); + +const pokemonSchema = mongoose.Schema({ + // _id: mongoose.Schema.Types.ObjectId, + number: { + type: Number, + unique: true, + }, + name: { + type: String, + unique: true, + }, + types: [Array], + imgUrl: String, +}); + +module.exports = mongoose.model("Pokemon", pokemonSchema); diff --git a/poke-mongo/poke-mongo/server/resources/pokemon/pokemonController.js b/poke-mongo/poke-mongo/server/resources/pokemon/pokemonController.js new file mode 100644 index 0000000..8d702b4 --- /dev/null +++ b/poke-mongo/poke-mongo/server/resources/pokemon/pokemonController.js @@ -0,0 +1,123 @@ +const express = require("express"); + +const mongoose = require("mongoose"); + +const Pokemon = require("./pokemon.js"); + +exports.get_pokemon = function (req, res, next) { + Pokemon.find() + .exec() + .then((docs) => { + console.log(docs); + res.status(200).json(docs); + }) + .catch((err) => { + console.log(err); + res.status(500).json({ + error: err, + }); + }); +}; + +exports.post_pokemon = function (req, res, next) { + const user = req.body; + const newpokemon = new Pokemon(user); + newpokemon.save(); + res.json(); + + // const pokemon = new Pokemon({ + // // _id: new mongoose.Types.ObjectId(), + // number: req.body.number, + // name: req.body.name, + // types: req.body.types, + // imgUrl: req.body.imgUrl, + // }); + // pokemon + // .save() //method save provided by mongoose to save in the database + // .then((result) => { + // console.log(result); + // res.status(201).json({ + // message: "Handling POST requests to /pokemon", + // createdPokemon: result, + // }); + // }) + // .catch((err) => { + // console.log(err); + // res.status(500).json({ + // error: err, + // }); + // }); +}; + +exports.delete_pokemon = function (req, res, next) { + Pokemon.remove() + .exec() + .then((result) => { + console.log(result); + res.status(200).json({ + message: "Deleting All Pokemons", + deletedPokemons: result, + }); + }) + .catch((err) => { + console.log(err); + res.status(500).json({ + error: err, + }); + }); +}; + +exports.get_number_pokemon = function (req, res, next) { + const Number = req.params.number; + Pokemon.find({ number: Number }) + .exec() + .then((doc) => { + console.log("From database", doc); + if (doc) { + res.status(200).json(doc); + } else { + res.status(404).json({ message: "No valid entry for provided number" }); + } + }) + .catch((err) => { + console.log(err); + res.status(500).json({ error: err }); + }); +}; + +exports.update_number_pokemon = function (req, res, next) { + const Number = req.params.number; + Pokemon.update({ number: Number }, { $set: { name: req.body.newName } }) + .exec() + .then((result) => { + console.log(result); + res.status(200).json(result); + }) + .catch((err) => { + console.log(err); + res.status(500).json({ + error: err, + }); + }); +}; + +exports.delete_number_pokemon = function (req, res, next) { + const Number = req.params.number; + m = Pokemon.find({ number: Number }); + console.log(m); + Pokemon.deleteOne(m) + .exec() + .then((result) => { + console.log(result); + res.status(200).json({ + message: JSON.stringify(result) + "Deleted Pokemon", + deletedPokemon: result, + }); + }) + .catch((err) => { + console.log(err); + res.status(500).json({ + error: err, + }); + }); +}; diff --git a/poke-mongo/server/resources/pokemon/pokemonRouter.js b/poke-mongo/poke-mongo/server/resources/pokemon/pokemonRouter.js similarity index 58% rename from poke-mongo/server/resources/pokemon/pokemonRouter.js rename to poke-mongo/poke-mongo/server/resources/pokemon/pokemonRouter.js index 1ccb7ae..4fd46d1 100644 --- a/poke-mongo/server/resources/pokemon/pokemonRouter.js +++ b/poke-mongo/poke-mongo/server/resources/pokemon/pokemonRouter.js @@ -2,12 +2,12 @@ const express = require('express'); const mongoose = require('mongoose'); const router = express.Router(); // to manage routes -const pokemonController = require('/Users/macbookpro/Documents/GitHub/final-projects/poke-mongo/server/resources/pokemon/pokemonController.js'); -const Pokemon = require('/Users/macbookpro/Documents/GitHub/final-projects/poke-mongo/server/resources/pokemon/pokemon.js'); +const pokemonController = require('./pokemonController.js'); +const Pokemon = require('./pokemon.js'); router.get('/', pokemonController.get_pokemon); -router.post('/', pokemonController.post_pokemon); +router.post('/pokemon', pokemonController.post_pokemon); router.delete('/', pokemonController.delete_pokemon); router.get('/:number', pokemonController.get_number_pokemon); router.put('/:number', pokemonController.update_number_pokemon); diff --git a/poke-mongo/server/db/index.js b/poke-mongo/server/db/index.js index 23c7460..433babf 100644 --- a/poke-mongo/server/db/index.js +++ b/poke-mongo/server/db/index.js @@ -1,6 +1,3 @@ -const mongoose = require ('mongoose'); - - -mongoose.connect('mongodb+srv://rayan:azerty123@cluster0.f8ili.mongodb.net/Pokemon?retryWrites=true&w=majority'); - -module.exports = router; \ No newline at end of file +/** + * Your Database Connection comes here + */ \ No newline at end of file diff --git a/poke-mongo/server/resources/pokemon/pokemon.js b/poke-mongo/server/resources/pokemon/pokemon.js deleted file mode 100644 index cba1181..0000000 --- a/poke-mongo/server/resources/pokemon/pokemon.js +++ /dev/null @@ -1,18 +0,0 @@ -const mongoose = require('mongoose'); - - -const pokemonSchema = mongoose.Schema({ - _id: mongoose.Schema.Types.ObjectId, - number: { - type: Number, - unique: true - }, - name: { - type: String, - unique: true - }, - types: [String], - imgUrl: String -}); - -module.exports = mongoose.model('Pokemon', pokemonSchema); \ No newline at end of file diff --git a/poke-mongo/server/resources/pokemon/pokemonController.js b/poke-mongo/server/resources/pokemon/pokemonController.js deleted file mode 100644 index 2854165..0000000 --- a/poke-mongo/server/resources/pokemon/pokemonController.js +++ /dev/null @@ -1,122 +0,0 @@ -const express = require('express'); - -const mongoose = require('mongoose'); - -const Pokemon = require('/Users/macbookpro/Documents/GitHub/final-projects/poke-mongo/server/resources/pokemon/pokemon.js'); - -exports.get_pokemon = function(req, res, next) { - Pokemon.find() - .exec() - .then(docs => { - console.log(docs); - res.status(200).json(docs); - }) - .catch(err => { - console.log(err); - res.status(500).json({ - error: err - }); - }); - }; - -exports.post_pokemon = function(req, res, next) { - const pokemon = new Pokemon({ - _id: new mongoose.Types.ObjectId(), - number: req.body.number, - name: req.body.name, - types: req.body.types, - imgUrl: req.body.imgUrl - }); - pokemon - .save() //method save provided by mongoose to save in the database - .then(result => { - console.log(result); - res.status(201).json({ - message: 'Handling POST requests to /pokemon', - createdPokemon: result - }); - }) - .catch(err => { - console.log(err); - res.status(500).json({ - error: err - }); - }); -} - -exports.delete_pokemon = function(req, res, next) { - Pokemon.remove() - .exec() - .then(result => { - console.log(result); - res.status(200).json({ - message: 'Deleting All Pokemons', - deletedPokemons: result - }); - }) - .catch(err => { - console.log(err); - res.status(500).json({ - error: err - }); - }); - }; - -exports.get_number_pokemon = function(req, res, next) { - const Number = req.params.number; - Pokemon.find({number: Number}) - .exec() - .then(doc => { - console.log("From database", doc); - if (doc) { - res.status(200).json(doc); - } else { - res.status(404).json({message: 'No valid entry for provided number'}); - } - }) - .catch(err => { - console.log(err); - res.status(500).json({error: err}); - }); -} - -exports.update_number_pokemon = function(req, res, next) { - const Number = req.params.number; - Pokemon.update({number: Number}, {$set: {name: req.body.newName}}) - .exec() - .then(result => { - console.log(result); - res.status(200).json(result); - }) - .catch(err => { - console.log(err); - res.status(500).json({ - error: err - }); - }); -} - -exports.delete_number_pokemon = function(req, res, next) { - const Number = req.params.number; - m = Pokemon.find({number: Number}); - console.log(m); - Pokemon.deleteOne(m) - .exec() - .then(result => { - console.log(result); - res.status(200).json({ - message: (JSON.stringify(result) +'Deleted Pokemon'), - deletedPokemon: result - }); - }) - .catch(err => { - console.log(err); - res.status(500).json({ - error: err - }); - }) -}; - - - -