diff --git a/package-lock.json b/package-lock.json index 29156fd..54eaf51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1375,6 +1375,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", @@ -2090,7 +2095,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" } @@ -5468,6 +5472,11 @@ "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", "dev": true }, + "kareem": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.1.0.tgz", + "integrity": "sha512-ycoMY1tVkcH1/NaxGn2erZaUC3CodmX7Fl6DUVXjN73+uecWYTaaldRkxNY3HeSKQnQTWnoxRKnZfVHcB8tIWg==" + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -5550,8 +5559,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 +5649,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", @@ -5864,11 +5877,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.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.1.3.tgz", + "integrity": "sha512-v+hHI/NxJtcVPm2cY+/kJfTfkkXVCz/le0iVdnh3enGi+fClhoaztjTtXQMdzIzNc+M0R93KcARpzvPQq/cWKQ==", + "requires": { + "async": "2.1.4", + "bson": "1.0.6", + "kareem": "2.1.0", + "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", @@ -7563,6 +7653,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 +7804,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,8 +7932,7 @@ "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", @@ -7938,6 +8048,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", diff --git a/package.json b/package.json index 9a0699c..7130113 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "react-scripts": "^0.9.5" }, "dependencies": { + "mongoose": "^5.1.3", "react": "^15.5.4", "react-dom": "^15.5.4" }, diff --git a/server/controllers/ordercontrollers.js b/server/controllers/ordercontrollers.js new file mode 100644 index 0000000..739c399 --- /dev/null +++ b/server/controllers/ordercontrollers.js @@ -0,0 +1,36 @@ +const OrderModel = require("../models/ordermodels"); + +module.exports.list = function (request, response) { + OrderModel.find({}) + .exec() + .then((products) => { + return response.json(products); + }); +}; + +module.exports.show = function (request, response) { + OrderModel.findById({ + id: request.params.id, + }) + .exec() + .then((product) => { + return response.json(product); + }); +}; + +module.exports.create = function (request, response) { + const newOrder = new Order({ + id: request.body.id || shortid.generate(), + date: request.body.date, + items: request.body.items.map((i) => { + return { + productId: i.id, + price: i.price, + }; + }), + }); + newOrder.save().then((order) => { + return response.json(order); + }); + +} \ No newline at end of file diff --git a/server/controllers/productcontrollers.js b/server/controllers/productcontrollers.js new file mode 100644 index 0000000..6627243 --- /dev/null +++ b/server/controllers/productcontrollers.js @@ -0,0 +1,19 @@ +const ProductModel = require("../models/productmodels"); + +module.exports.list = function (request, response) { + ProductModel.find({}) + .exec() + .then((products) => { + return response.json(products); + }); +}; + +module.exports.show = function (request, response) { + ProductModel.findById({ + id: request.params.id, + }) + .exec() + .then((product) => { + return response.json(product); + }); +}; \ No newline at end of file diff --git a/server/index.js b/server/index.js new file mode 100644 index 0000000..7be77b7 --- /dev/null +++ b/server/index.js @@ -0,0 +1,19 @@ +const express = require("express"); +const app = express(); +const bodyParser = require("body-parser"); +const mongoose = require("mongoose"); + +app.use(bodyParser.json()); + +app.use(require("./routes/orderroutes")); +app.use(require("./routes/productroutes")); + +mongoose.Promise = global.Promise; +mongoose.connect("mongodb://aeadmin1:aeadmin1@ds135540.mlab.com:35540/advanced-ecommerce-1"); + +app.listen(3001, (err) => { + if (err) { + return console.log("Error", err); + } + console.log("Web server is now running on port 3001"); + }); \ No newline at end of file diff --git a/server/models/ordermodels.js b/server/models/ordermodels.js new file mode 100644 index 0000000..cb7beae --- /dev/null +++ b/server/models/ordermodels.js @@ -0,0 +1,15 @@ +const mongoose = require("mongoose"); + +const schema = new mongoose.Schema({ + id: { + type: String, + required: true, + }, + date: { + type: String, + required: true, + }, + // items: [schema] - need to create a schema for the items +}); + +module.exports = mongoose.model("OrderModel", schema); \ No newline at end of file diff --git a/server/models/productmodels.js b/server/models/productmodels.js new file mode 100644 index 0000000..7ba7815 --- /dev/null +++ b/server/models/productmodels.js @@ -0,0 +1,34 @@ +const mongoose = require("mongoose"); + +const schema = new mongoose.Schema({ + id: { + type: Number, + required: true, + }, + name: { + type: String, + required: true, + }, + description: { + type: String, + required: true, + }, + reviews: { + type: Number, + required: false, + }, + rating: { + type: Number, + required: false, + }, + imgUrl: { + type: String, + required: false, + }, + price: { + type: String, + required: true, + }, +}); + +module.exports = mongoose.model("ProductModel", schema); diff --git a/server/routes/orderroutes.js b/server/routes/orderroutes.js new file mode 100644 index 0000000..8091a8c --- /dev/null +++ b/server/routes/orderroutes.js @@ -0,0 +1,10 @@ +const express = require("express"); +const app = express(); +const router = express.Router(); +const { list, show, create } = require("../controllers/ordercontrollers"); + +router.get("/orders", list); +router.get("/orders/:id", show) +router.post("/orders", create); + +module.exports = router; \ No newline at end of file diff --git a/server/routes/productroutes.js b/server/routes/productroutes.js new file mode 100644 index 0000000..6af3951 --- /dev/null +++ b/server/routes/productroutes.js @@ -0,0 +1,10 @@ +const express = require("express"); +const app = express(); +const router = express.Router(); +const { list, show, create } = require("../controllers/productcontrollers"); + +router.get("/products", list); +router.get("/products/:id", show) +router.post("/products", create); + +module.exports = router; \ No newline at end of file diff --git a/src/App.js b/src/App.js index b6f04e9..1cd231f 100644 --- a/src/App.js +++ b/src/App.js @@ -1,235 +1,65 @@ import React, { Component } from 'react'; import logo from './logo.svg'; import './App.css'; +import ProductDetail from "./components/ProductDetail"; +import Header from "./components/Header" +import Footer from "./components/Footer" +import Carousel from "./components/Carousel" -function App() { - return ( -
- {/*
*/} - -{/*
*/} - -
- -
+class App extends Component { + state = { + numberOfItemsInCart: 0, + }; -
-

Shop Name

-
- Category 1 - Category 2 - Category 3 -
-
+ addItem = () => { + this.setState({numberOfItemsInCart: this.state.numberOfItemsInCart + 1}); + + } -
- {/**/} -
+ productArray(products) { + return this.props.products.map((prod, key) => { + return ; + }); + }; -
- -
+ render(){ + return ( +
+
+
-
- {/**/} -
- {/**/} -
-
- -
-

$24.99

-

First Product -

-

See more snippets like this online store item at Bootsnipp - http://bootsnipp.com.

-
-
-

15 reviews

-

- - - - - -

-
-
-
- {/*
*/} -
-
- -
-

$64.99

-

Second Product -

-

This is a short description. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

-
-
-

12 reviews

-

- - - - - -

-
-
-
+
-
-
- -
-

$74.99

-

Third Product -

-

This is a short description. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

-
-
-

31 reviews

-

- - - - - -

-
-
+
+

Shop Name

+ +
-
-
- -
-

$84.99

-

Fourth Product -

-

This is a short description. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

-
-
-

6 reviews

-

- - - - - -

-
-
+
+ +
+

{this.productArray()}

-
-
- -
-

$94.99

-

Fifth Product -

-

This is a short description. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

-
-
-

18 reviews

-

- - - - - -

-
-
-
-{/* -
-

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 -
-*/}
+ +
-
- -
- -
- - {/*
*/} -
-
-
-

Copyright © Your Website 2014

-
-
-
- {/*
*/} -
-
- ); -} +
+
+
+
+ + ); + }; +}; export default App; diff --git a/src/components/Carousel.js b/src/components/Carousel.js new file mode 100644 index 0000000..ee2202b --- /dev/null +++ b/src/components/Carousel.js @@ -0,0 +1,38 @@ +import React from "react"; + +function Carousel(){ + return ( +
+ +
+ +
+ +
); +} + + +export default Carousel; diff --git a/src/components/Footer.js b/src/components/Footer.js new file mode 100644 index 0000000..2388ef0 --- /dev/null +++ b/src/components/Footer.js @@ -0,0 +1,14 @@ +import React from "react"; + +function Footer(){ + return( +
+
+
+

Copyright © Your Website 2014

+
+
+
); +} + +export default Footer; \ No newline at end of file diff --git a/src/components/Header.js b/src/components/Header.js new file mode 100644 index 0000000..7369d40 --- /dev/null +++ b/src/components/Header.js @@ -0,0 +1,39 @@ +import React from "react"; + +function Header(props){ + return( + ); +} + +export default Header; diff --git a/src/components/ProductDetail.js b/src/components/ProductDetail.js new file mode 100644 index 0000000..4f4988c --- /dev/null +++ b/src/components/ProductDetail.js @@ -0,0 +1,46 @@ +import { Component } from "react" + +class ProductDetail extends Component{ + render(){ + const showStars = (i) => { + const stars = []; + for (i = 0; i < props.product.rating; i++) { + stars.push(); + } + + for (i = 0; i < 5 - props.product.rating; i++) { + stars.push(); + } + return stars.map((star) => { + return star; + }); + }; + + return( +
+
+ +
+

{props.product.price}

+

{props.product.name} +

+

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

+
+
+

{props.product.reviews} reviews

+

+ {showStars()} +

+
+
+ +
+
+
+ ); +}; +}; + +export default ProductDetail; \ No newline at end of file diff --git a/src/index.js b/src/index.js index e58303d..5a7d6b7 100644 --- a/src/index.js +++ b/src/index.js @@ -5,6 +5,6 @@ import './index.css'; import state from './state'; ReactDOM.render( - , + , document.getElementById('root') );