diff --git a/Procfile b/Procfile deleted file mode 100644 index 0aaef48..0000000 --- a/Procfile +++ /dev/null @@ -1 +0,0 @@ -web: node dist/server.js \ No newline at end of file diff --git a/backend/config.js b/backend/config.js deleted file mode 100644 index 4467a7d..0000000 --- a/backend/config.js +++ /dev/null @@ -1,12 +0,0 @@ -import dotenv from 'dotenv'; - -dotenv.config(); - -export default { - PORT: process.env.PORT || 5000, - MONGODB_URL: process.env.MONGODB_URL || 'mongodb://localhost/amazona', - JWT_SECRET: process.env.JWT_SECRET || 'somethingsecret', - PAYPAL_CLIENT_ID: process.env.PAYPAL_CLIENT_ID || 'sb', - accessKeyId: process.env.accessKeyId || 'accessKeyId', - secretAccessKey: process.env.secretAccessKey || 'secretAccessKey', -}; diff --git a/backend/data.js b/backend/data.js deleted file mode 100644 index df964e3..0000000 --- a/backend/data.js +++ /dev/null @@ -1,46 +0,0 @@ -export default { - products: [ - { - _id: '1', - name: 'Slim Shirt', - category: 'Shirts', - image: '/images/d1.jpg', - price: 60, - brand: ' Nike', - rating: 4.5, - numReviews: 10, - countInStock: 6, - }, - { - _id: '2', - name: 'Fit Shirt', - category: 'Shirts', - image: '/images/d1.jpg', - price: 50, - brand: ' Nike', - rating: 4.2, - numReviews: 5 - }, - { - _id: '3', - name: 'Best Pants', - category: 'Pants', - image: '/images/d1.jpg', - price: 70, - brand: ' Nike', - rating: 4.5, - numReviews: 8, - countInStock: 6, - }, { - _id: '4', - name: 'Best Pants', - category: 'Pants', - image: '/images/d1.jpg', - price: 70, - brand: ' Nike', - rating: 4.5, - numReviews: 8, - countInStock: 6, - }, - ] -} \ No newline at end of file diff --git a/backend/models/orderModel.js b/backend/models/orderModel.js deleted file mode 100644 index 8871d25..0000000 --- a/backend/models/orderModel.js +++ /dev/null @@ -1,43 +0,0 @@ -import mongoose from 'mongoose'; -const shippingSchema = { - address: { type: String, required: true }, - city: { type: String, required: true }, - postalCode: { type: String, required: true }, - country: { type: String, required: true }, -}; - -const paymentSchema = { - paymentMethod: { type: String, required: true } -}; - -const orderItemSchema = new mongoose.Schema({ - name: { type: String, required: true }, - qty: { type: Number, required: true }, - image: { type: String, required: true }, - price: { type: String, required: true }, - product: { - type: mongoose.Schema.Types.ObjectId, - ref: 'Product', - required: true - }, -}); - -const orderSchema = new mongoose.Schema({ - user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true }, - orderItems: [orderItemSchema], - shipping: shippingSchema, - payment: paymentSchema, - itemsPrice: { type: Number }, - taxPrice: { type: Number }, - shippingPrice: { type: Number }, - totalPrice: { type: Number }, - isPaid: { type: Boolean, default: false }, - paidAt: { type: Date }, - isDelivered: { type: Boolean, default: false }, - deliveredAt: { type: Date }, -}, { - timestamps: true -}); - -const orderModel = mongoose.model("Order", orderSchema); -export default orderModel; \ No newline at end of file diff --git a/backend/models/productModel.js b/backend/models/productModel.js deleted file mode 100644 index 7c60507..0000000 --- a/backend/models/productModel.js +++ /dev/null @@ -1,28 +0,0 @@ -import mongoose from 'mongoose'; - -const reviewSchema = new mongoose.Schema( - { - name: { type: String, required: true }, - rating: { type: Number, default: 0 }, - comment: { type: String, required: true }, - }, - { - timestamps: true, - } -); -const prodctSchema = new mongoose.Schema({ - name: { type: String, required: true }, - image: { type: String, required: true }, - brand: { type: String, required: true }, - price: { type: Number, default: 0, required: true }, - category: { type: String, required: true }, - countInStock: { type: Number, default: 0, required: true }, - description: { type: String, required: true }, - rating: { type: Number, default: 0, required: true }, - numReviews: { type: Number, default: 0, required: true }, - reviews: [reviewSchema], -}); - -const productModel = mongoose.model('Product', prodctSchema); - -export default productModel; diff --git a/backend/models/userModel.js b/backend/models/userModel.js deleted file mode 100644 index d33b083..0000000 --- a/backend/models/userModel.js +++ /dev/null @@ -1,14 +0,0 @@ -import mongoose from 'mongoose'; - -const userSchema = new mongoose.Schema({ - name: { type: String, required: true }, - email: { - type: String, required: true, unique: true, index: true, dropDups: true, - }, - password: { type: String, required: true }, - isAdmin: { type: Boolean, required: true, default: false }, -}); - -const userModel = mongoose.model('User', userSchema); - -export default userModel; diff --git a/backend/routes/orderRoute.js b/backend/routes/orderRoute.js deleted file mode 100644 index ad9181a..0000000 --- a/backend/routes/orderRoute.js +++ /dev/null @@ -1,70 +0,0 @@ -import express from 'express'; -import Order from '../models/orderModel'; -import { isAuth, isAdmin } from '../util'; - -const router = express.Router(); - -router.get("/", isAuth, async (req, res) => { - const orders = await Order.find({}).populate('user'); - res.send(orders); -}); -router.get("/mine", isAuth, async (req, res) => { - const orders = await Order.find({ user: req.user._id }); - res.send(orders); -}); - -router.get("/:id", isAuth, async (req, res) => { - const order = await Order.findOne({ _id: req.params.id }); - if (order) { - res.send(order); - } else { - res.status(404).send("Order Not Found.") - } -}); - -router.delete("/:id", isAuth, isAdmin, async (req, res) => { - const order = await Order.findOne({ _id: req.params.id }); - if (order) { - const deletedOrder = await order.remove(); - res.send(deletedOrder); - } else { - res.status(404).send("Order Not Found.") - } -}); - -router.post("/", isAuth, async (req, res) => { - const newOrder = new Order({ - orderItems: req.body.orderItems, - user: req.user._id, - shipping: req.body.shipping, - payment: req.body.payment, - itemsPrice: req.body.itemsPrice, - taxPrice: req.body.taxPrice, - shippingPrice: req.body.shippingPrice, - totalPrice: req.body.totalPrice, - }); - const newOrderCreated = await newOrder.save(); - res.status(201).send({ message: "New Order Created", data: newOrderCreated }); -}); - -router.put("/:id/pay", isAuth, async (req, res) => { - const order = await Order.findById(req.params.id); - if (order) { - order.isPaid = true; - order.paidAt = Date.now(); - order.payment = { - paymentMethod: 'paypal', - paymentResult: { - payerID: req.body.payerID, - orderID: req.body.orderID, - paymentID: req.body.paymentID - } - } - const updatedOrder = await order.save(); - res.send({ message: 'Order Paid.', order: updatedOrder }); - } else { - res.status(404).send({ message: 'Order not found.' }) - } -}); - -export default router; \ No newline at end of file diff --git a/backend/routes/productRoute.js b/backend/routes/productRoute.js deleted file mode 100644 index 8bc2799..0000000 --- a/backend/routes/productRoute.js +++ /dev/null @@ -1,110 +0,0 @@ -import express from 'express'; -import Product from '../models/productModel'; -import { isAuth, isAdmin } from '../util'; - -const router = express.Router(); - -router.get('/', async (req, res) => { - const category = req.query.category ? { category: req.query.category } : {}; - const searchKeyword = req.query.searchKeyword - ? { - name: { - $regex: req.query.searchKeyword, - $options: 'i', - }, - } - : {}; - const sortOrder = req.query.sortOrder - ? req.query.sortOrder === 'lowest' - ? { price: 1 } - : { price: -1 } - : { _id: -1 }; - const products = await Product.find({ ...category, ...searchKeyword }).sort( - sortOrder - ); - res.send(products); -}); - -router.get('/:id', async (req, res) => { - const product = await Product.findOne({ _id: req.params.id }); - if (product) { - res.send(product); - } else { - res.status(404).send({ message: 'Product Not Found.' }); - } -}); -router.post('/:id/reviews', isAuth, async (req, res) => { - const product = await Product.findById(req.params.id); - if (product) { - const review = { - name: req.body.name, - rating: Number(req.body.rating), - comment: req.body.comment, - }; - product.reviews.push(review); - product.numReviews = product.reviews.length; - product.rating = - product.reviews.reduce((a, c) => c.rating + a, 0) / - product.reviews.length; - const updatedProduct = await product.save(); - res.status(201).send({ - data: updatedProduct.reviews[updatedProduct.reviews.length - 1], - message: 'Review saved successfully.', - }); - } else { - res.status(404).send({ message: 'Product Not Found' }); - } -}); -router.put('/:id', isAuth, isAdmin, async (req, res) => { - const productId = req.params.id; - const product = await Product.findById(productId); - if (product) { - product.name = req.body.name; - product.price = req.body.price; - product.image = req.body.image; - product.brand = req.body.brand; - product.category = req.body.category; - product.countInStock = req.body.countInStock; - product.description = req.body.description; - const updatedProduct = await product.save(); - if (updatedProduct) { - return res - .status(200) - .send({ message: 'Product Updated', data: updatedProduct }); - } - } - return res.status(500).send({ message: ' Error in Updating Product.' }); -}); - -router.delete('/:id', isAuth, isAdmin, async (req, res) => { - const deletedProduct = await Product.findById(req.params.id); - if (deletedProduct) { - await deletedProduct.remove(); - res.send({ message: 'Product Deleted' }); - } else { - res.send('Error in Deletion.'); - } -}); - -router.post('/', isAuth, isAdmin, async (req, res) => { - const product = new Product({ - name: req.body.name, - price: req.body.price, - image: req.body.image, - brand: req.body.brand, - category: req.body.category, - countInStock: req.body.countInStock, - description: req.body.description, - rating: req.body.rating, - numReviews: req.body.numReviews, - }); - const newProduct = await product.save(); - if (newProduct) { - return res - .status(201) - .send({ message: 'New Product Created', data: newProduct }); - } - return res.status(500).send({ message: ' Error in Creating Product.' }); -}); - -export default router; diff --git a/backend/routes/uploadRoute.js b/backend/routes/uploadRoute.js deleted file mode 100644 index c962954..0000000 --- a/backend/routes/uploadRoute.js +++ /dev/null @@ -1,42 +0,0 @@ -import express from 'express'; -import multer from 'multer'; -import multerS3 from 'multer-s3'; -import aws from 'aws-sdk'; -import config from '../config'; - -const storage = multer.diskStorage({ - destination(req, file, cb) { - cb(null, 'uploads/'); - }, - filename(req, file, cb) { - cb(null, `${Date.now()}.jpg`); - }, -}); - -const upload = multer({ storage }); - -const router = express.Router(); - -router.post('/', upload.single('image'), (req, res) => { - res.send(`/${req.file.path}`); -}); - -aws.config.update({ - accessKeyId: config.accessKeyId, - secretAccessKey: config.secretAccessKey, -}); -const s3 = new aws.S3(); -const storageS3 = multerS3({ - s3, - bucket: 'amazona-bucket', - acl: 'public-read', - contentType: multerS3.AUTO_CONTENT_TYPE, - key(req, file, cb) { - cb(null, file.originalname); - }, -}); -const uploadS3 = multer({ storage: storageS3 }); -router.post('/s3', uploadS3.single('image'), (req, res) => { - res.send(req.file.location); -}); -export default router; diff --git a/backend/routes/userRoute.js b/backend/routes/userRoute.js deleted file mode 100644 index 40ab7d4..0000000 --- a/backend/routes/userRoute.js +++ /dev/null @@ -1,80 +0,0 @@ -import express from 'express'; -import User from '../models/userModel'; -import { getToken, isAuth } from '../util'; - -const router = express.Router(); - -router.put('/:id', isAuth, async (req, res) => { - const userId = req.params.id; - const user = await User.findById(userId); - if (user) { - user.name = req.body.name || user.name; - user.email = req.body.email || user.email; - user.password = req.body.password || user.password; - const updatedUser = await user.save(); - res.send({ - _id: updatedUser.id, - name: updatedUser.name, - email: updatedUser.email, - isAdmin: updatedUser.isAdmin, - token: getToken(updatedUser), - }); - } else { - res.status(404).send({ message: 'User Not Found' }); - } -}); - -router.post('/signin', async (req, res) => { - const signinUser = await User.findOne({ - email: req.body.email, - password: req.body.password, - }); - if (signinUser) { - res.send({ - _id: signinUser.id, - name: signinUser.name, - email: signinUser.email, - isAdmin: signinUser.isAdmin, - token: getToken(signinUser), - }); - } else { - res.status(401).send({ message: 'Invalid Email or Password.' }); - } -}); - -router.post('/register', async (req, res) => { - const user = new User({ - name: req.body.name, - email: req.body.email, - password: req.body.password, - }); - const newUser = await user.save(); - if (newUser) { - res.send({ - _id: newUser.id, - name: newUser.name, - email: newUser.email, - isAdmin: newUser.isAdmin, - token: getToken(newUser), - }); - } else { - res.status(401).send({ message: 'Invalid User Data.' }); - } -}); - -router.get('/createadmin', async (req, res) => { - try { - const user = new User({ - name: 'Basir', - email: 'admin@example.com', - password: '1234', - isAdmin: true, - }); - const newUser = await user.save(); - res.send(newUser); - } catch (error) { - res.send({ message: error.message }); - } -}); - -export default router; diff --git a/backend/server.js b/backend/server.js deleted file mode 100644 index f3abd1c..0000000 --- a/backend/server.js +++ /dev/null @@ -1,37 +0,0 @@ -import express from 'express'; -import path from 'path'; -import mongoose from 'mongoose'; -import bodyParser from 'body-parser'; -import config from './config'; -import userRoute from './routes/userRoute'; -import productRoute from './routes/productRoute'; -import orderRoute from './routes/orderRoute'; -import uploadRoute from './routes/uploadRoute'; - -const mongodbUrl = config.MONGODB_URL; -mongoose - .connect(mongodbUrl, { - useNewUrlParser: true, - useUnifiedTopology: true, - useCreateIndex: true, - }) - .catch((error) => console.log(error.reason)); - -const app = express(); -app.use(bodyParser.json()); -app.use('/api/uploads', uploadRoute); -app.use('/api/users', userRoute); -app.use('/api/products', productRoute); -app.use('/api/orders', orderRoute); -app.get('/api/config/paypal', (req, res) => { - res.send(config.PAYPAL_CLIENT_ID); -}); -app.use('/uploads', express.static(path.join(__dirname, '/../uploads'))); -app.use(express.static(path.join(__dirname, '/../frontend/build'))); -app.get('*', (req, res) => { - res.sendFile(path.join(`${__dirname}/../frontend/build/index.html`)); -}); - -app.listen(config.PORT, () => { - console.log('Server started at http://localhost:5000'); -}); diff --git a/backend/util.js b/backend/util.js deleted file mode 100644 index 36504db..0000000 --- a/backend/util.js +++ /dev/null @@ -1,44 +0,0 @@ -import jwt from 'jsonwebtoken'; -import config from './config'; -const getToken = (user) => { - return jwt.sign( - { - _id: user._id, - name: user.name, - email: user.email, - isAdmin: user.isAdmin, - }, - config.JWT_SECRET, - { - expiresIn: '48h', - } - ); -}; - -const isAuth = (req, res, next) => { - const token = req.headers.authorization; - - if (token) { - const onlyToken = token.slice(7, token.length); - jwt.verify(onlyToken, config.JWT_SECRET, (err, decode) => { - if (err) { - return res.status(401).send({ message: 'Invalid Token' }); - } - req.user = decode; - next(); - return; - }); - } else { - return res.status(401).send({ message: 'Token is not supplied.' }); - } -}; - -const isAdmin = (req, res, next) => { - console.log(req.user); - if (req.user && req.user.isAdmin) { - return next(); - } - return res.status(401).send({ message: 'Admin Token is not valid.' }); -}; - -export { getToken, isAuth, isAdmin }; diff --git a/frontend/src/App.js b/frontend/src/App.js index 0b2a186..66cc0bf 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -14,6 +14,7 @@ import PlaceOrderScreen from './screens/PlaceOrderScreen'; import OrderScreen from './screens/OrderScreen'; import ProfileScreen from './screens/ProfileScreen'; import OrdersScreen from './screens/OrdersScreen'; +import LogoEco from './../src/assets/ecologo.png'; function App() { const userSignin = useSelector((state) => state.userSignin); @@ -30,8 +31,7 @@ function App() {