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/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 0000000..a11777c
Binary files /dev/null and b/poke-mongo/client/public/favicon.ico differ
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
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
diff --git a/poke-mongo/client/public/logo192.png b/poke-mongo/client/public/logo192.png
new file mode 100644
index 0000000..fc44b0a
Binary files /dev/null and b/poke-mongo/client/public/logo192.png differ
diff --git a/poke-mongo/client/public/logo512.png b/poke-mongo/client/public/logo512.png
new file mode 100644
index 0000000..a4e47a6
Binary files /dev/null and b/poke-mongo/client/public/logo512.png differ
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);
+ }}
+ />
+
Add pokemon
+ {/* {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(
+
+ Delete All
+
+ )
+}
+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);
+ }}
+ />
+
Search
+
+ {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 (
+
+ Poke-Mongo
+
+
+
+ View Pokemons
+
+
+
+ Add New Pokemon
+
+
+ Edit a Pokemon
+
+
+ Delete All Pokemons
+
+
+
+
+ );
+}
+
+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}
+
deleteOnePokemon(pokemon.number)}>Delete your pokemon
+
EditPokemon(pokemon.number)}>Update your pokemon
+
{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/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/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/poke-mongo/server/resources/pokemon/pokemonRouter.js b/poke-mongo/poke-mongo/server/resources/pokemon/pokemonRouter.js
new file mode 100644
index 0000000..4fd46d1
--- /dev/null
+++ b/poke-mongo/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('./pokemonController.js');
+const Pokemon = require('./pokemon.js');
+
+
+router.get('/', pokemonController.get_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);
+router.delete('/:number', pokemonController.delete_number_pokemon);
+
+
+
+
+
+module.exports = router;
\ No newline at end of file
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