From 84ca25a7751ab3d0143d7742d56a4b8a0d7c8bf4 Mon Sep 17 00:00:00 2001 From: mimitch2 Date: Mon, 21 May 2018 08:37:57 -0500 Subject: [PATCH 01/10] first push, got product populating --- .eslintrc | 2 +- src/App.js | 297 +++++++++++--------------------- src/App.test.js | 10 +- src/components/ProductDetail.js | 33 ++++ src/components/carousel.js | 0 src/components/footer.js | 0 src/components/header.js | 0 src/index.js | 16 +- 8 files changed, 149 insertions(+), 209 deletions(-) create mode 100644 src/components/ProductDetail.js create mode 100644 src/components/carousel.js create mode 100644 src/components/footer.js create mode 100644 src/components/header.js diff --git a/.eslintrc b/.eslintrc index ee54d86..577e479 100644 --- a/.eslintrc +++ b/.eslintrc @@ -94,7 +94,7 @@ "no-catch-shadow": 0, "no-class-assign": 2, "no-cond-assign": 2, - "no-console": 1, + "no-console": 0, "no-const-assign": 2, "no-constant-condition": 2, "no-continue": 0, diff --git a/src/App.js b/src/App.js index b6f04e9..fd08982 100644 --- a/src/App.js +++ b/src/App.js @@ -1,204 +1,109 @@ -import React, { Component } from 'react'; -import logo from './logo.svg'; -import './App.css'; +import React, { Component } from "react"; +import logo from "./logo.svg"; +import "./App.css"; +import ProductDetail from "./components/ProductDetail"; -function App() { - return ( -
- {/*
*/} - + {/*
*/} -
+
-
-

Shop Name

- +
+

Shop Name

+ +
-
- {/**/} -
+
+ {/* */} +
-
- +
+ + {/* */} +
+ {renderProductDetail()} + + {/*

Like this template?

@@ -206,30 +111,30 @@ function App() { View Tutorial
*/} -
-
+
+
-
+
-
+
-
+
- {/*
*/} + {/*
*/}
-
-
-

Copyright © Your Website 2014

-
+
+
+

Copyright © Your Website 2014

+
- {/*
*/} -
+ {/* */}
- ); +
+ ); } export default App; diff --git a/src/App.test.js b/src/App.test.js index b84af98..c9ac3ef 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -1,8 +1,8 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import App from './App'; +import React from "react"; +import ReactDOM from "react-dom"; +import App from "./App"; -it('renders without crashing', () => { - const div = document.createElement('div'); +it("renders without crashing", () => { + const div = document.createElement("div"); ReactDOM.render(, div); }); diff --git a/src/components/ProductDetail.js b/src/components/ProductDetail.js new file mode 100644 index 0000000..224cda5 --- /dev/null +++ b/src/components/ProductDetail.js @@ -0,0 +1,33 @@ +import React from "react"; +import "../App.css"; + +function ProductDetail(props) { + // console.log(props); + + return ( +
+
+ +
+

{props.product.price}

+

{props.product.name} +

+

{props.product.description} Bootsnipp - http://bootsnipp.com.

+
+
+

{props.product.reviews} reviews

+

+ + + + + +

+
+
+
+ ); + +} + +export default ProductDetail; diff --git a/src/components/carousel.js b/src/components/carousel.js new file mode 100644 index 0000000..e69de29 diff --git a/src/components/footer.js b/src/components/footer.js new file mode 100644 index 0000000..e69de29 diff --git a/src/components/header.js b/src/components/header.js new file mode 100644 index 0000000..e69de29 diff --git a/src/index.js b/src/index.js index e58303d..fc4f236 100644 --- a/src/index.js +++ b/src/index.js @@ -1,10 +1,12 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import App from './App'; -import './index.css'; -import state from './state'; +import React from "react"; +import ReactDOM from "react-dom"; +import App from "./App"; +import "./index.css"; +import state from "./state"; + + ReactDOM.render( - , - document.getElementById('root') + , + document.getElementById("root") ); From d46744996c72c972b611c03b9b5f2e4479fd98e7 Mon Sep 17 00:00:00 2001 From: mimitch2 Date: Mon, 21 May 2018 08:53:36 -0500 Subject: [PATCH 02/10] got star ratings to render proper number of filled stars --- src/components/ProductDetail.js | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/components/ProductDetail.js b/src/components/ProductDetail.js index 224cda5..8f119e2 100644 --- a/src/components/ProductDetail.js +++ b/src/components/ProductDetail.js @@ -3,6 +3,22 @@ import "../App.css"; function ProductDetail(props) { // console.log(props); + + const determineStars = () => { + const stars = []; + for (let index = 0; index < props.product.rating; index++) { + stars.push(); + } + for (let index = 0; index < 5 - props.product.rating; index++) { + stars.push(); + } + return stars.map((star) => { + return star; + }); + + }; + + return (
@@ -17,11 +33,7 @@ function ProductDetail(props) {

{props.product.reviews} reviews

- - - - - + {determineStars()}

From 83246573cd7ab89eefffe92ac53d78f9a5a723c0 Mon Sep 17 00:00:00 2001 From: mimitch2 Date: Mon, 21 May 2018 09:05:26 -0500 Subject: [PATCH 03/10] got all components broken out into files --- src/App.js | 96 ++++---------------------------------- src/components/carousel.js | 42 +++++++++++++++++ src/components/footer.js | 19 ++++++++ src/components/header.js | 49 +++++++++++++++++++ src/components/side.js | 21 +++++++++ 5 files changed, 140 insertions(+), 87 deletions(-) create mode 100644 src/components/side.js diff --git a/src/App.js b/src/App.js index fd08982..69febc6 100644 --- a/src/App.js +++ b/src/App.js @@ -1,7 +1,11 @@ -import React, { Component } from "react"; +import React from "react"; import logo from "./logo.svg"; import "./App.css"; import ProductDetail from "./components/ProductDetail"; +import Header from "./components/header"; +import Carousel from "./components/carousel"; +import Footer from "./components/footer"; +import Side from "./components/side"; function App(props) { @@ -16,90 +20,16 @@ function App(props) { return (
- {/* */} +
- {/*
*/} - - {/*
*/} -
-
-

Shop Name

- -
+
- {/* */} -
- -
- -
- -
- {/*
*/} +
{renderProductDetail()} @@ -123,15 +53,7 @@ function App(props) {
- {/*
*/} -
-
-
-

Copyright © Your Website 2014

-
-
-
- {/*
*/} +
); diff --git a/src/components/carousel.js b/src/components/carousel.js index e69de29..2d1a2e3 100644 --- a/src/components/carousel.js +++ b/src/components/carousel.js @@ -0,0 +1,42 @@ + +import React from "react"; +import "../App.css"; + +function Carousel() { + + return ( +
+ +
+ +
+ +
+ + ); +} + +export default Carousel; diff --git a/src/components/footer.js b/src/components/footer.js index e69de29..cf9bae4 100644 --- a/src/components/footer.js +++ b/src/components/footer.js @@ -0,0 +1,19 @@ +import React from "react"; +import "../App.css"; + +function Footer() { + + + return ( +
+
+
+

Copyright © Your Website 2014

+
+
+
+ + ); +} + +export default Footer; diff --git a/src/components/header.js b/src/components/header.js index e69de29..963debd 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -0,0 +1,49 @@ + +import React from "react"; +import "../App.css"; + +function Header() { + + + + return ( + + + + ); + +} + +export default Header; diff --git a/src/components/side.js b/src/components/side.js new file mode 100644 index 0000000..2b9bb9d --- /dev/null +++ b/src/components/side.js @@ -0,0 +1,21 @@ +import React from "react"; +import "../App.css"; + + +function Side() { + + return ( +
+

Shop Name

+ +
+ + ); + +} + +export default Side; From 37f3bf33ce4d0a7210ce5f14ad314ae88ae2d7eb Mon Sep 17 00:00:00 2001 From: mimitch2 Date: Mon, 21 May 2018 09:42:19 -0500 Subject: [PATCH 04/10] got clicking button to increase cart count, need to now use state to track what is added --- src/App.js | 59 +++++++------ src/components/ProductDetail.js | 1 + src/components/header.js | 5 +- src/index.js | 2 +- src/state.js | 145 ++++++++++++++++---------------- 5 files changed, 111 insertions(+), 101 deletions(-) diff --git a/src/App.js b/src/App.js index 69febc6..00edd46 100644 --- a/src/App.js +++ b/src/App.js @@ -1,4 +1,4 @@ -import React from "react"; +import React, { Component } from "react"; import logo from "./logo.svg"; import "./App.css"; import ProductDetail from "./components/ProductDetail"; @@ -7,33 +7,41 @@ import Carousel from "./components/carousel"; import Footer from "./components/footer"; import Side from "./components/side"; -function App(props) { +class App extends Component { + state = { + itemsInCart: 0 + } - const renderProductDetail = () => { - - return props.products.map((prod, key) => { - return ; + addItem = () => { + // console.log("here"); + this.setState({itemsInCart: this.state.itemsInCart + 1}); + + } + + renderProductDetail = () => { + return this.props.products.map((prod, key) => { + return ; }); }; - - return ( -
-
+ render() { + return ( +
+
-
+
-
+
- + -
- -
- {renderProductDetail()} +
+ +
+ {this.renderProductDetail()} - {/* + {/*

Like this template?

@@ -41,22 +49,23 @@ function App(props) { View Tutorial
*/} +
+
- -
-
+
-
+
-
+
+
-
- ); + ); + } } export default App; diff --git a/src/components/ProductDetail.js b/src/components/ProductDetail.js index 8f119e2..5ec7669 100644 --- a/src/components/ProductDetail.js +++ b/src/components/ProductDetail.js @@ -35,6 +35,7 @@ function ProductDetail(props) {

{determineStars()}

+
diff --git a/src/components/header.js b/src/components/header.js index 963debd..7071223 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -2,9 +2,8 @@ import React from "react"; import "../App.css"; -function Header() { - +function Header(props) { return ( @@ -33,7 +32,7 @@ function Header() { Contact
  • - Items In Cart (0) + Items In Cart ({props.count})
  • diff --git a/src/index.js b/src/index.js index fc4f236..2c4f35a 100644 --- a/src/index.js +++ b/src/index.js @@ -7,6 +7,6 @@ import state from "./state"; ReactDOM.render( - , + , document.getElementById("root") ); diff --git a/src/state.js b/src/state.js index 4083fb0..c060164 100644 --- a/src/state.js +++ b/src/state.js @@ -1,84 +1,85 @@ export default { numberOfItemsInCart: 0, products: [ { - "id": 1, - "name": "Body Luxuries Sweet Lavender Hand Sanitizer", - "description": "Psychotropic drugs, not elsewhere classified", - "reviews": 46, - "rating": 2, - "imgUrl": "http://dummyimage.com/136x167.bmp/cc0000/ffffff", - "price": "$95.11" + id: 1, + name: "Body Luxuries Sweet Lavender Hand Sanitizer", + description: "Psychotropic drugs, not elsewhere classified", + reviews: 46, + rating: 2, + imgUrl: "http://dummyimage.com/136x167.bmp/cc0000/ffffff", + price: "$95.11" }, { - "id": 2, - "name": "Topiramate", - "description": "You will be so happy when you use this product", - "reviews": 2, - "rating": 2, - "imgUrl": "http://dummyimage.com/125x134.jpg/cc0000/ffffff", - "price": "$37.09" + id: 2, + name: "Topiramate", + description: "You will be so happy when you use this product", + reviews: 2, + rating: 2, + imgUrl: "http://dummyimage.com/125x134.jpg/cc0000/ffffff", + price: "$37.09" }, { - "id": 3, - "name": "Almond", - "description": "Other disorders of continuity of bone, unsp tibia and fibula", - "reviews": 27, - "rating": 5, - "imgUrl": "http://dummyimage.com/149x190.jpg/dddddd/000000", - "price": "$51.83" + id: 3, + name: "Almond", + description: "Other disorders of continuity of bone, unsp tibia and fibula", + reviews: 27, + rating: 5, + imgUrl: "http://dummyimage.com/149x190.jpg/dddddd/000000", + price: "$51.83" }, { - "id": 4, - "name": "VYTORIN", - "description": "Orchard as the place of occurrence of the external cause", - "reviews": 60, - "rating": 3, - "imgUrl": "http://dummyimage.com/162x153.jpg/cc0000/ffffff", - "price": "$86.93" + id: 4, + name: "VYTORIN", + description: "Orchard as the place of occurrence of the external cause", + reviews: 60, + rating: 3, + imgUrl: "http://dummyimage.com/162x153.jpg/cc0000/ffffff", + price: "$86.93" }, { - "id": 5, - "name": "Decolorized Iodine", - "description": "Injury of prostate", - "reviews": 20, - "rating": 1, - "imgUrl": "http://dummyimage.com/120x245.jpg/cc0000/ffffff", - "price": "$70.10" + id: 5, + name: "Decolorized Iodine", + description: "Injury of prostate", + reviews: 20, + rating: 1, + imgUrl: "http://dummyimage.com/120x245.jpg/cc0000/ffffff", + price: "$70.10" }, { - "id": 6, - "name": "Fresh Sugar Honey Tinted Lip Treatment SPF15", - "description": "this stuff is awesome", - "reviews": 79, - "rating": 3, - "imgUrl": "http://dummyimage.com/211x227.bmp/5fa2dd/ffffff", - "price": "$39.25" + id: 6, + name: "Fresh Sugar Honey Tinted Lip Treatment SPF15", + description: "this stuff is awesome", + reviews: 79, + rating: 3, + imgUrl: "http://dummyimage.com/211x227.bmp/5fa2dd/ffffff", + price: "$39.25" }, { - "id": 7, - "name": "LBel", - "description": "The best product ever", - "reviews": 76, - "rating": 3, - "imgUrl": "http://dummyimage.com/212x144.jpg/ff4444/ffffff", - "price": "$99.91" + id: 7, + name: "LBel", + description: "The best product ever", + reviews: 76, + rating: 3, + imgUrl: "http://dummyimage.com/212x144.jpg/ff4444/ffffff", + price: "$99.91" }, { - "id": 8, - "name": "Cholestyramine", - "description": "Product 3", - "reviews": 74, - "rating": 3, - "imgUrl": "http://dummyimage.com/204x175.jpg/5fa2dd/ffffff", - "price": "$67.17" + id: 8, + name: "Cholestyramine", + description: "Product 3", + reviews: 74, + rating: 3, + imgUrl: "http://dummyimage.com/204x175.jpg/5fa2dd/ffffff", + price: "$67.17" }, { - "id": 9, - "name": "Risperidone", - "description": " cephalospor/oth beta-lactm antibiot, undet, sequela", - "reviews": 9, - "rating": 1, - "imgUrl": "http://dummyimage.com/212x108.bmp/cc0000/ffffff", - "price": "$96.84" + id: 9, + name: "Risperidone", + description: " cephalospor/oth beta-lactm antibiot, undet, sequela", + reviews: 9, + rating: 1, + imgUrl: "http://dummyimage.com/212x108.bmp/cc0000/ffffff", + price: "$96.84" }, { - "id": 10, - "name": "MAC", - "description": "Other Gram-negative sepsis", - "reviews": 45, - "rating": 2, - "imgUrl": "http://dummyimage.com/189x109.png/cc0000/ffffff", - "price": "$74.37" - }] -} \ No newline at end of file + id: 10, + name: "MAC", + description: "Other Gram-negative sepsis", + reviews: 45, + rating: 2, + imgUrl: "http://dummyimage.com/189x109.png/cc0000/ffffff", + price: "$74.37" + }], + cart: ["HELLO"] +}; From 4c9e246bfe61715bbb91759340481eecb8d8b54d Mon Sep 17 00:00:00 2001 From: mimitch2 Date: Mon, 21 May 2018 10:22:48 -0500 Subject: [PATCH 05/10] items are now added to a cart key array in state. Now need to push up to server for checkout --- .eslintrc | 4 ++++ src/App.js | 15 ++++++++++----- src/components/ProductDetail.js | 9 +++------ src/state.js | 4 ++-- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/.eslintrc b/.eslintrc index 577e479..801aafc 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,4 +1,6 @@ { + + "parser": "babel-eslint", "plugins": [ @@ -6,6 +8,7 @@ "eslint-plugin-react", "react" ], + "extends": ["eslint:recommended", "plugin:react/recommended"], @@ -43,6 +46,7 @@ }, "rules": { + "react/prop-types": 0, "babel/arrow-parens": [2, "as-needed"], "babel/array-bracket-spacing": [2, "always"], "babel/generator-star-spacing": [2, {"before": true, "after": false}], diff --git a/src/App.js b/src/App.js index 00edd46..29d1334 100644 --- a/src/App.js +++ b/src/App.js @@ -10,12 +10,17 @@ import Side from "./components/side"; class App extends Component { state = { - itemsInCart: 0 + numberOfItemsInCart: this.props.cart.length } - addItem = () => { - // console.log("here"); - this.setState({itemsInCart: this.state.itemsInCart + 1}); + addItem = (e) => { + const currentItem = e.target.parentElement.parentElement.parentElement.id; + const tempArr = this.props.products.find((item) => { + return currentItem == item.id; + }); + this.props.cart.push(tempArr); + console.log(this.props.cart); + this.setState({numberOfItemsInCart: this.props.cart.length}); } @@ -28,7 +33,7 @@ class App extends Component { render() { return (
    -
    +
    diff --git a/src/components/ProductDetail.js b/src/components/ProductDetail.js index 5ec7669..38e8c6a 100644 --- a/src/components/ProductDetail.js +++ b/src/components/ProductDetail.js @@ -2,7 +2,6 @@ import React from "react"; import "../App.css"; function ProductDetail(props) { - // console.log(props); const determineStars = () => { const stars = []; @@ -15,13 +14,10 @@ function ProductDetail(props) { return stars.map((star) => { return star; }); - }; - - return ( -
    +
    @@ -35,8 +31,9 @@ function ProductDetail(props) {

    {determineStars()}

    - +
    +
    ); diff --git a/src/state.js b/src/state.js index c060164..e0be76b 100644 --- a/src/state.js +++ b/src/state.js @@ -1,5 +1,6 @@ export default { numberOfItemsInCart: 0, + cart: [], products: [ { id: 1, name: "Body Luxuries Sweet Lavender Hand Sanitizer", @@ -80,6 +81,5 @@ export default { rating: 2, imgUrl: "http://dummyimage.com/189x109.png/cc0000/ffffff", price: "$74.37" - }], - cart: ["HELLO"] + }] }; From 9c0405cd9caf6a1f1867cd7dcc63798d481a9e80 Mon Sep 17 00:00:00 2001 From: mimitch2 Date: Mon, 21 May 2018 15:21:19 -0500 Subject: [PATCH 06/10] full orders now being pushed up to the database --- package-lock.json | 364 ++++++++++++++++++++++-------------- package.json | 6 +- server/index.js | 41 ++++ server/order.js | 11 ++ src/App.js | 11 +- src/components/header.js | 9 +- src/components/postOrder.js | 11 ++ src/index.js | 3 + src/state.js | 2 +- 9 files changed, 308 insertions(+), 150 deletions(-) create mode 100644 server/index.js create mode 100644 server/order.js create mode 100644 src/components/postOrder.js diff --git a/package-lock.json b/package-lock.json index 29156fd..3849fe4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, "requires": { "mime-types": "2.1.18", "negotiator": "0.6.1" @@ -190,8 +189,7 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-union": { "version": "1.0.2", @@ -1254,35 +1252,20 @@ "dev": true }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "dev": true, + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "requires": { "bytes": "3.0.0", "content-type": "1.0.4", "debug": "2.6.9", "depd": "1.1.2", "http-errors": "1.6.3", - "iconv-lite": "0.4.19", + "iconv-lite": "0.4.23", "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", + "qs": "6.5.2", + "raw-body": "2.3.3", "type-is": "1.6.16" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - } } }, "boolbase": { @@ -1375,6 +1358,11 @@ "node-int64": "0.4.0" } }, + "bson": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz", + "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ==" + }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -1407,8 +1395,7 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "caller-path": { "version": "0.1.0", @@ -1798,14 +1785,12 @@ "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "content-type-parser": { "version": "1.0.2", @@ -1822,14 +1807,12 @@ "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "core-js": { "version": "1.2.7", @@ -2090,7 +2073,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -2167,14 +2149,12 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-indent": { "version": "4.0.0", @@ -2300,8 +2280,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { "version": "1.3.45", @@ -2324,8 +2303,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "encoding": { "version": "0.1.12", @@ -2476,8 +2454,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -2756,8 +2733,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "event-emitter": { "version": "0.3.5", @@ -2827,7 +2803,6 @@ "version": "4.16.3", "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "dev": true, "requires": { "accepts": "1.3.5", "array-flatten": "1.1.1", @@ -2861,17 +2836,71 @@ "vary": "1.1.2" }, "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.3", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" } } }, @@ -3031,7 +3060,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "1.0.2", @@ -3142,14 +3170,12 @@ "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fs-extra": { "version": "0.30.0", @@ -4502,7 +4528,6 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, "requires": { "depd": "1.1.2", "inherits": "2.0.3", @@ -4630,8 +4655,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { "version": "0.12.0", @@ -4678,8 +4702,7 @@ "ipaddr.js": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", - "dev": true + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" }, "is-absolute-url": { "version": "2.1.0", @@ -5468,6 +5491,11 @@ "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", "dev": true }, + "kareem": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.0.7.tgz", + "integrity": "sha512-p8+lEpsNs4N0fvNOC1/zzDO0wDrD3Pb1G+OwfIG+gKVK3MyY5jeaGYh+9Qx6jb4fEG2b3E6U98vaE9MH7Gilsw==" + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -5550,8 +5578,7 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, "lodash._arraycopy": { "version": "3.0.0", @@ -5641,6 +5668,11 @@ "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", @@ -5767,8 +5799,7 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memory-fs": { "version": "0.3.0", @@ -5789,14 +5820,12 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { "version": "2.3.11", @@ -5828,14 +5857,12 @@ "mime-db": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" }, "mime-types": { "version": "2.1.18", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, "requires": { "mime-db": "1.33.0" } @@ -5864,11 +5891,88 @@ "minimist": "0.0.8" } }, + "mongodb": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.8.tgz", + "integrity": "sha512-mj7yIUyAr9xnO2ev8pcVJ9uX7gSum5LLs1qIFoWLxA5Il50+jcojKtaO1/TbexsScZ9Poz00Pc3b86GiSqJ7WA==", + "requires": { + "mongodb-core": "3.0.8" + } + }, + "mongodb-core": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.8.tgz", + "integrity": "sha512-dFxfhH9N7ohuQnINyIl6dqEF8sYOE0WKuymrFf3L3cipJNrx+S8rAbNOTwa00/fuJCjBMJNFsaA+R2N16//UIw==", + "requires": { + "bson": "1.0.6", + "require_optional": "1.0.1" + } + }, + "mongoose": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.1.1.tgz", + "integrity": "sha512-pmVX//61yX8hV/Db790Cym8CGYd29OYQROYx6ve6ab4LbUW0+GehiBVDlnE9Tvogaz8nndHlVUb+iXwOBw/MNw==", + "requires": { + "async": "2.1.4", + "bson": "1.0.6", + "kareem": "2.0.7", + "lodash.get": "4.4.2", + "mongodb": "3.0.8", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.4.1", + "mquery": "3.0.0", + "ms": "2.0.0", + "regexp-clone": "0.0.1", + "sliced": "1.0.1" + }, + "dependencies": { + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "requires": { + "lodash": "4.17.10" + } + } + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" + }, + "mpath": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.4.1.tgz", + "integrity": "sha512-NNY/MpBkALb9jJmjpBlIi6GRoLveLUM0pJzgbp9vY9F7IQEb/HREC/nxrixechcQwd1NevOhJnWWV8QQQRE+OA==" + }, + "mquery": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.0.0.tgz", + "integrity": "sha512-WL1Lk8v4l8VFSSwN3yCzY9TXw+fKVYKn6f+w86TRzOLSE8k1yTgGaLBPUByJQi8VcLbOdnUneFV/y3Kv874pnQ==", + "requires": { + "bluebird": "3.5.0", + "debug": "2.6.9", + "regexp-clone": "0.0.1", + "sliced": "0.0.5" + }, + "dependencies": { + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + }, + "sliced": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "mute-stream": { "version": "0.0.5", @@ -5892,8 +5996,7 @@ "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "next-tick": { "version": "1.0.0", @@ -6105,7 +6208,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, "requires": { "ee-first": "1.1.1" } @@ -6272,8 +6374,7 @@ "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, "path-browserify": { "version": "0.0.0", @@ -6311,8 +6412,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { "version": "1.1.0", @@ -7071,7 +7171,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", - "dev": true, "requires": { "forwarded": "0.1.2", "ipaddr.js": "1.6.0" @@ -7104,8 +7203,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { "version": "4.3.4", @@ -7163,51 +7261,17 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "dev": true, + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "requires": { "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } } }, "react": { @@ -7563,6 +7627,11 @@ "is-equal-shallow": "0.1.3" } }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -7709,6 +7778,22 @@ "resolve-from": "1.0.1" } }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.5.0" + }, + "dependencies": { + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + } + } + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -7821,14 +7906,12 @@ "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, "requires": { "debug": "2.6.9", "depd": "1.1.2", @@ -7848,8 +7931,7 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" } } }, @@ -7872,7 +7954,6 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, "requires": { "encodeurl": "1.0.2", "escape-html": "1.0.3", @@ -7900,8 +7981,7 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "sha.js": { "version": "2.2.6", @@ -7938,6 +8018,11 @@ "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, "sntp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", @@ -8069,8 +8154,7 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, "stream-browserify": { "version": "2.0.1", @@ -8387,7 +8471,6 @@ "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "2.1.18" @@ -8452,8 +8535,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "upper-case": { "version": "1.1.3", @@ -8548,8 +8630,7 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { "version": "3.2.1", @@ -8570,8 +8651,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vendors": { "version": "1.0.2", diff --git a/package.json b/package.json index 9a0699c..44b8087 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,9 @@ "react-scripts": "^0.9.5" }, "dependencies": { + "body-parser": "^1.18.3", + "express": "^4.16.3", + "mongoose": "^5.1.1", "react": "^15.5.4", "react-dom": "^15.5.4" }, @@ -18,5 +21,6 @@ "build": "react-scripts build", "test": "npm run lint && react-scripts test --env=jsdom", "eject": "react-scripts eject" - } + }, + "proxy": "http://localhost:3001" } diff --git a/server/index.js b/server/index.js new file mode 100644 index 0000000..26d82e3 --- /dev/null +++ b/server/index.js @@ -0,0 +1,41 @@ +const express = require("express"); +const app = express(); +const bodyParser = require("body-parser"); +app.use(bodyParser.json()); +const Order = require("./order"); +const mongoose = require("mongoose"); +mongoose.Promise = global.Promise; +mongoose.connect("mongodb://mimitch:Bladerunner80@ds129560.mlab.com:29560/advanced-homework-1"); + +// const orders = []; + + +app.post("/newOrders", function (req, res) { +// console.log(req.body); + const newOrder = new Order( + {order: [...req.body]} + ); + newOrder.save().then(savedOrder => { + // console.log(savedOrder); + return res.json(savedOrder); + }); +}); + + + + + + +const port = 3001; + +app.listen(port, (err) => { + if (err) { + return console.log("Error", err); + } + console.log("Web server is now running on port " + port); +}); + +// <-----------handle bad request-------------> +app.use(function (request,response) { + response.send("NOPE!!!!"); +}); diff --git a/server/order.js b/server/order.js new file mode 100644 index 0000000..80a563c --- /dev/null +++ b/server/order.js @@ -0,0 +1,11 @@ +const mongoose = require("mongoose"); + +const schema = new mongoose.Schema({ + order: { + require: false, + type: Array, + }, +} +); + +module.exports = mongoose.model("Order", schema); diff --git a/src/App.js b/src/App.js index 29d1334..e35d96e 100644 --- a/src/App.js +++ b/src/App.js @@ -1,11 +1,11 @@ import React, { Component } from "react"; -import logo from "./logo.svg"; +// import logo from "./logo.svg"; import "./App.css"; import ProductDetail from "./components/ProductDetail"; import Header from "./components/header"; import Carousel from "./components/carousel"; import Footer from "./components/footer"; -import Side from "./components/side"; +import Side from "./components/side"; class App extends Component { @@ -14,9 +14,9 @@ class App extends Component { } addItem = (e) => { - const currentItem = e.target.parentElement.parentElement.parentElement.id; + const currentItem = Number(e.target.parentElement.parentElement.parentElement.id); const tempArr = this.props.products.find((item) => { - return currentItem == item.id; + return currentItem === item.id; }); this.props.cart.push(tempArr); console.log(this.props.cart); @@ -24,6 +24,7 @@ class App extends Component { } + renderProductDetail = () => { return this.props.products.map((prod, key) => { return ; @@ -33,7 +34,7 @@ class App extends Component { render() { return (
    -
    +
    diff --git a/src/components/header.js b/src/components/header.js index 7071223..80dcd04 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -1,10 +1,14 @@ import React from "react"; import "../App.css"; - +import sendCart from "./postOrder"; function Header(props) { + const sendOrder = (data) => { + sendCart.order(data); + }; + return (
    diff --git a/src/components/postOrder.js b/src/components/postOrder.js new file mode 100644 index 0000000..702ce58 --- /dev/null +++ b/src/components/postOrder.js @@ -0,0 +1,11 @@ +exports.order = function (order) { + console.log("here"); + + return fetch("/newOrders", { + body: JSON.stringify(order), + headers: { + "content-type": "application/json" + }, + method: "POST" + }).then(response => response.json()); +}; diff --git a/src/index.js b/src/index.js index 2c4f35a..cacb06b 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,10 @@ import App from "./App"; import "./index.css"; import state from "./state"; +// const sendOrder = () => { + +// }; ReactDOM.render( , diff --git a/src/state.js b/src/state.js index e0be76b..60bc5e5 100644 --- a/src/state.js +++ b/src/state.js @@ -1,5 +1,5 @@ export default { - numberOfItemsInCart: 0, + // numberOfItemsInCart: 0, cart: [], products: [ { id: 1, From 99991f5ad5a7ba07ec9a4d7a6ba42a8a84907635 Mon Sep 17 00:00:00 2001 From: mimitch2 Date: Mon, 21 May 2018 16:11:05 -0500 Subject: [PATCH 07/10] cleaned up code, changed up images so it would look nicer, added _id generator --- server/index.js | 19 +++++++------------ server/order.js | 6 +++++- src/App.js | 24 ------------------------ src/components/carousel.js | 6 +++--- src/components/header.js | 15 +++++---------- src/components/postOrder.js | 4 ++-- src/index.js | 4 ---- src/state.js | 26 +++++++++++++------------- 8 files changed, 35 insertions(+), 69 deletions(-) diff --git a/server/index.js b/server/index.js index 26d82e3..29f8673 100644 --- a/server/index.js +++ b/server/index.js @@ -1,32 +1,27 @@ const express = require("express"); const app = express(); const bodyParser = require("body-parser"); -app.use(bodyParser.json()); const Order = require("./order"); const mongoose = require("mongoose"); -mongoose.Promise = global.Promise; -mongoose.connect("mongodb://mimitch:Bladerunner80@ds129560.mlab.com:29560/advanced-homework-1"); -// const orders = []; +app.use(bodyParser.json()); +mongoose.Promise = global.Promise; +mongoose.connect("mongodb://mimitch:Bladerunner80@ds129560.mlab.com:29560/advanced-homework-1"); +let newId = 1; app.post("/newOrders", function (req, res) { -// console.log(req.body); const newOrder = new Order( - {order: [...req.body]} + {_id: newId, order: [...req.body]} ); newOrder.save().then(savedOrder => { - // console.log(savedOrder); return res.json(savedOrder); }); + newId++; }); - - - - -const port = 3001; +const port = 3001; // easily change port # app.listen(port, (err) => { if (err) { diff --git a/server/order.js b/server/order.js index 80a563c..5a01e58 100644 --- a/server/order.js +++ b/server/order.js @@ -1,8 +1,12 @@ const mongoose = require("mongoose"); const schema = new mongoose.Schema({ + _id: { + require: true, + type: Number, + }, order: { - require: false, + require: true, type: Array, }, } diff --git a/src/App.js b/src/App.js index e35d96e..7155a41 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,4 @@ import React, { Component } from "react"; -// import logo from "./logo.svg"; import "./App.css"; import ProductDetail from "./components/ProductDetail"; import Header from "./components/header"; @@ -19,12 +18,9 @@ class App extends Component { return currentItem === item.id; }); this.props.cart.push(tempArr); - console.log(this.props.cart); this.setState({numberOfItemsInCart: this.props.cart.length}); - } - renderProductDetail = () => { return this.props.products.map((prod, key) => { return ; @@ -35,38 +31,18 @@ class App extends Component { return (
    -
    -
    - -
    {this.renderProductDetail()} - - {/* -
    -

    Like this template? -

    -

    If you like this template, then check out this tutorial on how to build a working review system for your online store!

    - View Tutorial -
    -*/}
    -
    -
    -
    -
    - -
    -
    diff --git a/src/components/carousel.js b/src/components/carousel.js index 2d1a2e3..6968902 100644 --- a/src/components/carousel.js +++ b/src/components/carousel.js @@ -16,13 +16,13 @@ function Carousel() {
    - +
    - +
    - +
    diff --git a/src/components/header.js b/src/components/header.js index 80dcd04..7a6205d 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -1,21 +1,15 @@ import React from "react"; -import "../App.css"; -import sendCart from "./postOrder"; +import postOrder from "./postOrder"; function Header(props) { - - const sendOrder = (data) => { - sendCart.order(data); - }; - return ( -