From 91ae0f79a5ab7f2825e7af93db701817050a2e15 Mon Sep 17 00:00:00 2001 From: Juthatip McDevitt Date: Tue, 28 May 2024 00:36:47 -0500 Subject: [PATCH] updated code --- donutshop_ecommerce/public/cross.png | Bin 0 -> 16711 bytes .../src/app/api/auth/[...nextauth]/route.js | 18 +++++++++++- .../src/app/api/categories/route.js | 20 +++++++++----- .../src/app/api/menu-items/route.js | 26 ++++++++++++------ .../src/app/api/orders/route.js | 16 +++-------- .../src/app/api/users/route.js | 11 ++++++-- .../src/app/orders/[id]/page.js | 14 ++++++++-- donutshop_ecommerce/src/app/orders/page.js | 7 ++++- .../src/components/layout/HomeMenu.js | 2 +- .../src/components/menu/MenuItem.js | 20 +++++--------- 10 files changed, 86 insertions(+), 48 deletions(-) create mode 100644 donutshop_ecommerce/public/cross.png diff --git a/donutshop_ecommerce/public/cross.png b/donutshop_ecommerce/public/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..65e81b3ecbc7468f27759ad208fe67b607bc6a39 GIT binary patch literal 16711 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 literal 0 HcmV?d00001 diff --git a/donutshop_ecommerce/src/app/api/auth/[...nextauth]/route.js b/donutshop_ecommerce/src/app/api/auth/[...nextauth]/route.js index fe7bd04..35b0223 100644 --- a/donutshop_ecommerce/src/app/api/auth/[...nextauth]/route.js +++ b/donutshop_ecommerce/src/app/api/auth/[...nextauth]/route.js @@ -1,11 +1,12 @@ import * as mongoose from "mongoose" -import NextAuth from "next-auth" +import NextAuth, { getServerSession } from "next-auth" import CredentialsProvider from "next-auth/providers/credentials" import { User } from "../../models/User" import bcrypt from 'bcrypt' import GoogleProvider from "next-auth/providers/google"; import { MongoDBAdapter } from "@auth/mongodb-adapter" import clientPromise from "../../../../libs/mongoConnect" +import { UserInfo } from "../../models/UserInfo" export const authOptions = { secret: process.env.SECRET, @@ -37,6 +38,21 @@ export const authOptions = { } }), ], +}; + +export async function isAdmin(){ + const session = await getServerSession(authOptions); + const userEmail = session?.user?.email; + if (!userEmail) { + return false; + } + + const userInfo = await UserInfo.findOne({email:userEmail}); + if (!userInfo) { + return false; + } + + return userInfo.admin; } const handler = NextAuth(authOptions); diff --git a/donutshop_ecommerce/src/app/api/categories/route.js b/donutshop_ecommerce/src/app/api/categories/route.js index 4e23686..305fd6c 100644 --- a/donutshop_ecommerce/src/app/api/categories/route.js +++ b/donutshop_ecommerce/src/app/api/categories/route.js @@ -1,19 +1,24 @@ import mongoose from "mongoose"; import { Category } from "../models/Category"; +import { isAdmin } from "../auth/[...nextauth]/route"; export async function POST(req){ mongoose.connect(process.env.MONGO_URL) const {name} = await req.json(); - const categoryDoc = await Category.create({name}) - - return Response.json(categoryDoc); + if(await isAdmin()){ + const categoryDoc = await Category.create({name}) + return Response.json(categoryDoc); + } else { + return Response.json({}) + } } export async function PUT(req){ mongoose.connect(process.env.MONGO_URL) const {_id, name} = await req.json(); - await Category.updateOne({_id}, {name}); - + if(await isAdmin()){ + await Category.updateOne({_id}, {name}); + } return Response.json(true); } @@ -28,7 +33,8 @@ export async function DELETE(req){ mongoose.connect(process.env.MONGO_URL) const url = new URL(req.url); const _id = url.searchParams.get('_id'); - await Category.deleteOne({_id}) - + if(await isAdmin()){ + await Category.deleteOne({_id}) + } return Response.json(true) } \ No newline at end of file diff --git a/donutshop_ecommerce/src/app/api/menu-items/route.js b/donutshop_ecommerce/src/app/api/menu-items/route.js index 87d7236..edf1679 100644 --- a/donutshop_ecommerce/src/app/api/menu-items/route.js +++ b/donutshop_ecommerce/src/app/api/menu-items/route.js @@ -1,18 +1,26 @@ import mongoose from "mongoose"; import { MenuItem } from "../models/MenuItem"; +import { isAdmin } from "../auth/[...nextauth]/route"; export async function POST(req){ mongoose.connect(process.env.MONGO_URL) const data = await req.json(); - const menuItemDoc = await MenuItem.create(data); - - return Response.json(menuItemDoc) + if(await isAdmin()){ + const menuItemDoc = await MenuItem.create(data); + return Response.json(menuItemDoc) + } else { + return Response.json({}); + } + } export async function PUT(req){ mongoose.connect(process.env.MONGO_URL) - const {_id, ...data} = await req.json(); - await MenuItem.findByIdAndUpdate(_id, data); + if(await isAdmin()){ + const {_id, ...data} = await req.json(); + await MenuItem.findByIdAndUpdate(_id, data); + } + return Response.json(true) } @@ -21,14 +29,16 @@ export async function GET(){ mongoose.connect(process.env.MONGO_URL) return Response.json( await MenuItem.find() - ) + ) } export async function DELETE(req){ mongoose.connect(process.env.MONGO_URL) const url = new URL(req.url); const _id = url.searchParams.get('_id'); - await MenuItem.deleteOne({_id}) - + if(await isAdmin()){ + await MenuItem.deleteOne({_id}) + } + return Response.json(true) } \ No newline at end of file diff --git a/donutshop_ecommerce/src/app/api/orders/route.js b/donutshop_ecommerce/src/app/api/orders/route.js index aa51e0c..ecc2144 100644 --- a/donutshop_ecommerce/src/app/api/orders/route.js +++ b/donutshop_ecommerce/src/app/api/orders/route.js @@ -1,31 +1,23 @@ import mongoose from "mongoose"; import { getServerSession } from "next-auth" -import { authOptions } from "../auth/[...nextauth]/route" -import { UserInfo } from "../models/UserInfo" +import { authOptions, isAdmin } from "../auth/[...nextauth]/route" import { Order } from "../models/Order" export async function GET(req){ mongoose.connect(process.env.MONGO_URL); const session = await getServerSession(authOptions); const userEmail = session?.user?.email; - + const admin = isAdmin(); const url = new URL(req.url); const _id = url.searchParams.get('_id') if(_id){ return Response.json( await Order.findById(_id)); } - let isAdmin = false; - - if(userEmail){ - const userInfo = await UserInfo.findOne({email:userEmail}); - if(userInfo){ - const isAdmin = userInfo.admin; - } - } - if(isAdmin){ + if(admin){ return Response.json( await Order.find() ) } + if(userEmail){ return Response.json( await Order.find({userEmail}) ) } diff --git a/donutshop_ecommerce/src/app/api/users/route.js b/donutshop_ecommerce/src/app/api/users/route.js index e010514..6906585 100644 --- a/donutshop_ecommerce/src/app/api/users/route.js +++ b/donutshop_ecommerce/src/app/api/users/route.js @@ -1,9 +1,14 @@ import mongoose from "mongoose"; import { User } from "../models/User"; +import { isAdmin } from "../auth/[...nextauth]/route"; export async function GET(){ mongoose.connect(process.env.MONGO_URL); - const users = await User.find(); - - return Response.json(users); + if(await isAdmin()) { + const users = await User.find(); + return Response.json(users); + } else { + return Response.json([]); + } + } \ No newline at end of file diff --git a/donutshop_ecommerce/src/app/orders/[id]/page.js b/donutshop_ecommerce/src/app/orders/[id]/page.js index 024cfa7..176638a 100644 --- a/donutshop_ecommerce/src/app/orders/[id]/page.js +++ b/donutshop_ecommerce/src/app/orders/[id]/page.js @@ -6,7 +6,7 @@ import { useParams } from 'next/navigation' import AddressInfo from '../../../components/layout/AddressInfo' const OrdersPage = () => { - const {clearCart, cartProducts} = useContext(CartContext); + const {clearCart} = useContext(CartContext); const {id} = useParams(); const [order, setOrder] = useState(); @@ -37,13 +37,23 @@ const OrdersPage = () => { return (
+ {order?.paid ? (
checked

Thank you

Your order is confirmed

- {order && ( + ) : ( +
+ checked +

Action needed

+

Payment is required

+
+ ) + } + + {order&& (

Order Summary

diff --git a/donutshop_ecommerce/src/app/orders/page.js b/donutshop_ecommerce/src/app/orders/page.js index 501705e..f2e9c7a 100644 --- a/donutshop_ecommerce/src/app/orders/page.js +++ b/donutshop_ecommerce/src/app/orders/page.js @@ -41,7 +41,12 @@ const OrderPage = () => {
{order.userEmail}
- Order info + {order.paid? ( + Receipt info + ): ( + Order info + ) + }
{dateTime(order.createdAt)}
diff --git a/donutshop_ecommerce/src/components/layout/HomeMenu.js b/donutshop_ecommerce/src/components/layout/HomeMenu.js index b1ea029..71f0cfd 100644 --- a/donutshop_ecommerce/src/components/layout/HomeMenu.js +++ b/donutshop_ecommerce/src/components/layout/HomeMenu.js @@ -14,7 +14,7 @@ const HomeDrink = () => { useEffect(() => { fetch('/api/menu-items').then(res => { res.json().then(menuItems => { - setBestSeller(menuItems.slice(-5)) + setBestSeller(menuItems.slice(5, 10)) }) }) }, []) diff --git a/donutshop_ecommerce/src/components/menu/MenuItem.js b/donutshop_ecommerce/src/components/menu/MenuItem.js index d17e7f5..77d6b8a 100644 --- a/donutshop_ecommerce/src/components/menu/MenuItem.js +++ b/donutshop_ecommerce/src/components/menu/MenuItem.js @@ -18,20 +18,14 @@ const MenuItem = (menuItem) => { } return ( - <> - {showPopup && ( -
+
+ menu-donut +

{itemName}

+

{description}

+

${basePrice}

+ +
-
- )} -
- menu-donut -

{itemName}

-

{description}

-

${basePrice}

- -
- ) }