From 3567eae3e6ae4eda4e878e12cc105127e9bffe6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20M=C3=BCller?= <46693545+am9zZWY@users.noreply.github.com> Date: Mon, 16 Dec 2024 13:13:57 +0100 Subject: [PATCH] Fix alot of linting errors --- bun.lockb | Bin 280515 -> 280973 bytes docker-compose.yml | 4 +- package.json | 1 + public/icons/add-svgrepo-com.svg | 4 + public/icons/remove-svgrepo-com.svg | 4 + .../manage/order/[[...orderId]]/page.tsx | 28 +- src/app/admin/manage/page.tsx | 4 +- src/app/admin/prepare/page.tsx | 27 +- src/app/api/auth/login/route.ts | 2 +- src/app/api/manage/db/delete/route.ts | 10 +- src/app/api/manage/db/prepare/route.ts | 62 ++-- src/app/api/manage/system/status/route.ts | 2 +- src/app/api/order/[id]/cancel/route.ts | 4 +- src/app/api/order/[id]/pay/route.ts | 6 +- src/app/api/order/[id]/route.ts | 10 +- src/app/api/order/route.ts | 28 +- src/app/api/pizza/route.ts | 8 +- src/app/api/timeline/route.ts | 10 +- src/app/order/Order.css | 6 - src/app/order/[orderNumber]/page.tsx | 6 +- src/app/page.jsx | 328 ------------------ src/app/page.tsx | 315 +++++++++++++++++ src/config/index.ts | 1 + src/model/food.ts | 82 ++--- src/model/order.ts | 225 +++++------- 25 files changed, 549 insertions(+), 628 deletions(-) create mode 100644 public/icons/add-svgrepo-com.svg create mode 100644 public/icons/remove-svgrepo-com.svg delete mode 100644 src/app/page.jsx create mode 100644 src/app/page.tsx diff --git a/bun.lockb b/bun.lockb index 8b6a7614a0dcdde4ab14c0685d4dcb15a409a65b..921530667a12c62972aefe54e4525c719c53de2a 100755 GIT binary patch delta 55097 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 dehN`r+wrsn37C>p{4Z6{{UVeFf9N8 delta 54239 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�l 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 + + + \ No newline at end of file diff --git a/public/icons/remove-svgrepo-com.svg b/public/icons/remove-svgrepo-com.svg new file mode 100644 index 0000000..25137fa --- /dev/null +++ b/public/icons/remove-svgrepo-com.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/app/admin/manage/order/[[...orderId]]/page.tsx b/src/app/admin/manage/order/[[...orderId]]/page.tsx index f0acfcd..9de8ece 100644 --- a/src/app/admin/manage/order/[[...orderId]]/page.tsx +++ b/src/app/admin/manage/order/[[...orderId]]/page.tsx @@ -4,7 +4,7 @@ import { useEffect, useState } from "react"; import { IDetectedBarcode, Scanner } from "@yudiel/react-qr-scanner"; import { getFromLocalStorage } from "@/lib/localStorage"; import WithAuth from "@/app/admin/WithAuth"; -import { ORDER_STATES, OrderDocument, OrderStatus, OrderWithId } from "@/model/order"; +import { Order, ORDER_STATES, OrderDocument, OrderStatus } from "@/model/order"; import { formatDateTime, getDateFromTimeSlot } from "@/lib/time"; import SearchInput from "@/app/components/SearchInput"; import ErrorMessage from "@/app/components/ErrorMessage"; @@ -12,8 +12,8 @@ import ErrorMessage from "@/app/components/ErrorMessage"; const Page = ({ params }: { params: { orderId: string } }) => { const [error, setError] = useState(''); - const [orders, setOrders] = useState([]); - const [filteredOrders, setFilteredOrders] = useState([] as OrderWithId[]); // state to hold order status] + const [orders, setOrders] = useState([]); + const [filteredOrders, setFilteredOrders] = useState([] as OrderDocument[]); // state to hold order status] const [filter, setFilter] = useState(''); // state to hold order status const [noFinished, setNoFinished] = useState(true); @@ -41,7 +41,7 @@ const Page = ({ params }: { params: { orderId: string } }) => { } return data; }) - .then(data => setOrders(data)) + .then(data => setOrders(data as OrderDocument[])) .catch(error => { console.error('Error fetching orders', error); setError(error.message) @@ -63,11 +63,11 @@ const Page = ({ params }: { params: { orderId: string } }) => { // Filter the orders useEffect(() => { if (filter) { - setFilteredOrders(orders.filter((order: OrderWithId) => { + setFilteredOrders(orders.filter((order) => { if (order.name.toLowerCase().includes(filter.toLowerCase())) { return true; } - if (order._id.toLowerCase().includes(filter.toLowerCase())) { + if (order._id.toString().toLowerCase().includes(filter.toLowerCase())) { return true; } if (order.status.toLowerCase().includes(filter.toLowerCase())) { @@ -86,7 +86,7 @@ const Page = ({ params }: { params: { orderId: string } }) => { * @param status */ const updateOrderStatus = (_id: string, status: OrderStatus) => { - const order = orders.find(order => order._id === _id); + const order = orders.find(order => order._id.toString() === _id); if (!order) { setError('Order not found'); return; @@ -108,7 +108,7 @@ const Page = ({ params }: { params: { orderId: string } }) => { return data; }) .then(() => { - setOrders(orders.map(order => order._id === _id ? newOrder : order)); + setOrders(orders.map(order => order._id.toString() === _id ? newOrder as OrderDocument : order)); }) .catch(error => setError(error.message)); } @@ -130,7 +130,7 @@ const Page = ({ params }: { params: { orderId: string } }) => { .then(() => { // Update the order by id const newOrders = orders.map((order) => { - if (order._id === _id) { + if (order._id.toString() === _id) { order.isPaid = isPaid; } return order; @@ -205,12 +205,12 @@ const Page = ({ params }: { params: { orderId: string } }) => { .filter(order => noFinished ? !['delivered', 'cancelled'].includes(order.status) : true) // Filter by finished .toSorted((a, b) => getDateFromTimeSlot(a.timeslot).toDate().getTime() - getDateFromTimeSlot(b.timeslot).toDate().getTime()) // Sort by date .map((order, index) => ( // Map the orders -
+
@@ -275,7 +275,7 @@ const Page = ({ params }: { params: { orderId: string } }) => { key={state} disabled={state === order.status} className={`rounded-full px-4 py-2 text-sm font-medium transition duration-200 ${state === order.status ? 'bg-green-500 text-white' : 'bg-gray-300 text-gray-700 hover:bg-gray-400'} focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed`} - onClick={() => updateOrderStatus(order._id, state)} + onClick={() => updateOrderStatus(order._id.toString(), state)} > {state} @@ -284,7 +284,7 @@ const Page = ({ params }: { params: { orderId: string } }) => { className={`rounded-full px-4 py-2 text-sm font-medium transition duration-200 ${order.isPaid ? 'bg-green-300 text-green-700 hover:bg-green-400' : 'bg-red-300 text-red-700 hover:bg-red-400'} focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed`} - onClick={() => setOrderAsPaid(order._id, !order.isPaid)} + onClick={() => setOrderAsPaid(order._id.toString(), !order.isPaid)} > {order.isPaid ? 'Paid' : 'Not Paid'} diff --git a/src/app/admin/manage/page.tsx b/src/app/admin/manage/page.tsx index fed6563..cf747ce 100644 --- a/src/app/admin/manage/page.tsx +++ b/src/app/admin/manage/page.tsx @@ -61,7 +61,7 @@ const Page = () => { .then(data => setStatus(data.status)) .catch((error) => { console.error('There was an error!', error); - setMessage(error) + setMessage('Error getting system status') }) } @@ -135,4 +135,4 @@ const Page = () => { ); } -export default WithAuth(Page); +export default Page; diff --git a/src/app/admin/prepare/page.tsx b/src/app/admin/prepare/page.tsx index b81c12d..9c09dcd 100644 --- a/src/app/admin/prepare/page.tsx +++ b/src/app/admin/prepare/page.tsx @@ -4,7 +4,8 @@ import { useEffect, useState } from "react"; import { getFromLocalStorage } from "@/lib/localStorage"; import ErrorMessage from "@/app/components/ErrorMessage.jsx"; import { getDateFromTimeSlot } from "@/lib/time"; -import { ItemStatus, Order, OrderWithId } from "@/model/order"; +import { ItemStatus } from "@/model/order"; +import type { OrderDocument, OrderModel } from "@/model/order"; import WithAuth from "@/app/admin/WithAuth"; import SearchInput from "@/app/components/SearchInput"; import './Prepare.css'; @@ -14,9 +15,9 @@ const Page = () => { const [error, setError] = useState(''); const [filter, setFilter] = useState('') - const [orders, setOrders] = useState([]); - const [filteredOrders, setFilteredOrders] = useState([]); - const [ordersByTimeslot, setOrdersByTimeslot] = useState(new Map) + const [orders, setOrders] = useState([]); + const [filteredOrders, setFilteredOrders] = useState([]); + const [ordersByTimeslot, setOrdersByTimeslot] = useState(new Map) const [currentTime, setCurrentTime] = useState(new Date()); const [isClient, setIsClient] = useState(false); @@ -59,9 +60,9 @@ const Page = () => { // Filter the orders useEffect(() => { if (filter) { - setFilteredOrders(orders.filter((order: OrderWithId) => + setFilteredOrders(orders.filter((order) => order.name.toLowerCase().includes(filter.toLowerCase()) || - order._id.toLowerCase().includes(filter.toLowerCase()) || + order._id.toString().toLowerCase().includes(filter.toLowerCase()) || order.status.toLowerCase().includes(filter.toLowerCase()) || order.totalPrice.toString().includes(filter) || order.timeslot.includes(filter) || @@ -72,7 +73,7 @@ const Page = () => { }, [filter, orders]); useEffect(() => { - const ordersByTimeslot = new Map + const ordersByTimeslot = new Map filteredOrders.forEach(order => { const timeslot = order.timeslot // Add order to list at the respective timeslot @@ -94,10 +95,10 @@ const Page = () => { setOrdersByTimeslot(sortedOrdersByTimeslots) }, [filteredOrders]) - const setFoodStatusFromLocalStorage = (orders: OrderWithId[]) => { + const setFoodStatusFromLocalStorage = (orders: OrderDocument[]) => { // Get from local storage orders.map(order => { - let foodItems = getFromLocalStorage(`foodItems.${order._id}`, []); + let foodItems = getFromLocalStorage(`foodItems.${order._id.toString()}`, []); if (!foodItems || foodItems.length === 0) { return; } @@ -123,7 +124,7 @@ const Page = () => { * @param status */ const updateItemStatus = (_id: string, itemIndex: number, status: ItemStatus) => { - const order = orders.find(order => order._id === _id); + const order = orders.find(order => order._id.toString() === _id); if (!order) { console.error('Order not found'); return; @@ -148,7 +149,7 @@ const Page = () => { }) .then(() => { // Update the order by id - setOrders(orders.map(order => order._id === _id ? newOrder : order)); + setOrders(orders.map(order => order._id.toString() === _id ? newOrder as OrderDocument : order)); }) .catch(error => setError(error.message)); }; @@ -164,7 +165,7 @@ const Page = () => { * Check if the order has a comment * @param order */ - const hasComment = (order: Order) => { + const hasComment = (order: OrderDocument) => { return ( typeof order.comment === "string" && order.comment != "" && @@ -259,7 +260,7 @@ const Page = () => { diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts index 0e23893..3531eb8 100644 --- a/src/app/api/auth/login/route.ts +++ b/src/app/api/auth/login/route.ts @@ -19,7 +19,7 @@ export async function POST(req: Request): Promise { try { // Validate token - const correct_token: string = process.env.PAYMENT_ADMIN_TOKEN || tokens.PAYMENT_ADMIN_TOKEN || ''; + const correct_token = process.env.PAYMENT_ADMIN_TOKEN; if (!correct_token || correct_token.length === 0) { return NextResponse.json({ message: 'Token not set' diff --git a/src/app/api/manage/db/delete/route.ts b/src/app/api/manage/db/delete/route.ts index 9fdd1ba..3beb37a 100644 --- a/src/app/api/manage/db/delete/route.ts +++ b/src/app/api/manage/db/delete/route.ts @@ -1,10 +1,12 @@ // Fill the database -import { Food } from "@/model/food"; +import { FoodModel } from "@/model/food"; import { headers } from "next/headers"; import { extractBearerFromHeaders, validateToken } from "@/lib/auth"; import dbConnect from "@/lib/dbConnect"; -import { Order } from "@/model/order"; +import { OrderModel } from "@/model/order"; import { NextResponse } from "next/server"; +import { System } from "@/model/system"; +import { constants } from "@/config"; // Thanks to https://medium.com/phantom3/next-js-14-build-prerender-error-fix-f3c51de2fe1d export const dynamic = "force-dynamic"; @@ -25,8 +27,8 @@ export async function POST() { }, { status: 401 }); } - await Food.deleteMany({}) - await Order.deleteMany({}) + await FoodModel.deleteMany({}) + await OrderModel.deleteMany({}) return Response.json({ message: 'Successfully deleted database' }) } diff --git a/src/app/api/manage/db/prepare/route.ts b/src/app/api/manage/db/prepare/route.ts index cf62e05..a7456a1 100644 --- a/src/app/api/manage/db/prepare/route.ts +++ b/src/app/api/manage/db/prepare/route.ts @@ -1,5 +1,5 @@ // Fill the database -import { Food } from "@/model/food"; +import { FoodModel } from "@/model/food"; import { headers } from "next/headers"; import { extractBearerFromHeaders, validateToken } from "@/lib/auth"; import dbConnect from "@/lib/dbConnect"; @@ -11,27 +11,14 @@ import { NextResponse } from "next/server"; export const dynamic = "force-dynamic"; export const fetchCache = "force-no-store"; -const pizzas = [ - { name: "Salami", ingredients: ["Cheese 🧀", "Tomato Sauce 🍅", "Salami 🍕"] }, - { name: "Ham and mushrooms", ingredients: ["Cheese 🧀", "Tomato Sauce 🍅", "Ham 🥓", "Mushrooms 🍄"] }, - { - name: "Capriccosa", - ingredients: ["Cheese 🧀", "Tomato Sauce 🍅", "Mushrooms 🍄", "Artichokes 🌱", "Olives 🫒", "Ham 🥓", "Basil 🌿"] - }, - { name: "Margherita", ingredients: ["Cheese 🧀", "Tomato Sauce 🍅", "Basil 🌿"] }, - { - name: "Veggies", - ingredients: ["Cheese 🧀", "Tomato Sauce 🍅", "Mushrooms 🍄", "Onions 🧅", "Green Peppers 🫑", "Olives 🫒"] - }, - { name: "Margherita vegan", ingredients: ["Vegan Cheese 🧀", "Tomato Sauce 🍅", "Basil 🌿"] }, - { - name: "Capriccosa vegan", - ingredients: ["Vegan Cheese 🧀", "Tomato Sauce 🍅", "Mushrooms 🍄", "Artichokes 🌱", "Olives 🫒", "Basil 🌿"] - } -]; - -const pizza_by_name = (pizza_name: string) => { - return pizzas.filter(pizza => pizza.name == pizza_name).map(pizza => pizza.ingredients).flat(); +const pizzasByName = { + Salami: ["Cheese 🧀", "Tomato Sauce 🍅", "Salami 🍕"], + "Ham and mushrooms": ["Cheese 🧀", "Tomato Sauce 🍅", "Ham 🥓", "Mushrooms 🍄"], + Capriccosa: ["Cheese 🧀", "Tomato Sauce 🍅", "Mushrooms 🍄", "Artichokes 🌱", "Olives 🫒", "Ham 🥓", "Basil 🌿"], + Margherita: ["Cheese 🧀", "Tomato Sauce 🍅", "Basil 🌿"], + Veggies: ["Cheese 🧀", "Tomato Sauce 🍅", "Mushrooms 🍄", "Onions 🧅", "Green Peppers 🫑", "Olives 🫒"], + "Margherita vegan": ["Vegan Cheese 🧀", "Tomato Sauce 🍅", "Basil 🌿"], + "Capriccosa vegan": ["Vegan Cheese 🧀", "Tomato Sauce 🍅", "Mushrooms 🍄", "Artichokes 🌱", "Olives 🫒", "Basil 🌿"] }; /** @@ -56,7 +43,7 @@ export async function POST() { price: 4, dietary: 'meat', type: 'pizza', - ingredients: pizza_by_name('Salami'), + ingredients: pizzasByName['Salami'], size: 0.5 }, { @@ -64,7 +51,7 @@ export async function POST() { price: 8, dietary: 'meat', type: 'pizza', - ingredients: pizza_by_name('Salami'), + ingredients: pizzasByName['Salami'], size: 1 }, { @@ -72,7 +59,7 @@ export async function POST() { price: 4, dietary: 'meat', type: 'pizza', - ingredients: pizza_by_name('Ham and mushrooms'), + ingredients: pizzasByName['Ham and mushrooms'], size: 0.5 }, { @@ -80,7 +67,7 @@ export async function POST() { price: 8, dietary: 'meat', type: 'pizza', - ingredients: pizza_by_name('Ham and mushrooms'), + ingredients: pizzasByName['Ham and mushrooms'], size: 1 }, { @@ -88,7 +75,7 @@ export async function POST() { price: 4, type: 'pizza', dietary: 'meat', - ingredients: pizza_by_name('Capriccosa'), + ingredients: pizzasByName['Capriccosa'], size: 0.5 }, { @@ -96,19 +83,19 @@ export async function POST() { price: 8, type: 'pizza', dietary: 'meat', - ingredients: pizza_by_name('Capriccosa'), + ingredients: pizzasByName['Capriccosa'], size: 1 }, - { name: 'Margherita half', price: 3, type: 'pizza', ingredients: pizza_by_name('Margherita'), size: 0.5 }, - { name: 'Margherita full', price: 6, type: 'pizza', ingredients: pizza_by_name('Margherita'), size: 1 }, - { name: 'Veggies half', price: 3, type: 'pizza', ingredients: pizza_by_name('Veggies'), size: 0.5 }, - { name: 'Veggies full', price: 6, type: 'pizza', ingredients: pizza_by_name('Veggies'), size: 1 }, + { name: 'Margherita half', price: 3, type: 'pizza', ingredients: pizzasByName['Margherita'], size: 0.5 }, + { name: 'Margherita full', price: 6, type: 'pizza', ingredients: pizzasByName['Margherita'], size: 1 }, + { name: 'Veggies half', price: 3, type: 'pizza', ingredients: pizzasByName['Veggies'], size: 0.5 }, + { name: 'Veggies full', price: 6, type: 'pizza', ingredients: pizzasByName['Veggies'], size: 1 }, { name: 'Margherita vegan half', price: 3, dietary: 'vegan', type: 'pizza', - ingredients: pizza_by_name('Margherita vegan'), + ingredients: pizzasByName['Margherita vegan'], size: 0.5 }, { @@ -116,7 +103,7 @@ export async function POST() { price: 6, dietary: 'vegan', type: 'pizza', - ingredients: pizza_by_name('Margherita vegan'), + ingredients: pizzasByName['Margherita vegan'], size: 1 }, { @@ -124,7 +111,7 @@ export async function POST() { price: 3, dietary: 'vegan', type: 'pizza', - ingredients: pizza_by_name('Capriccosa vegan'), + ingredients: pizzasByName['Capriccosa vegan'], size: 0.5 }, { @@ -132,12 +119,13 @@ export async function POST() { price: 6, dietary: 'vegan', type: 'pizza', - ingredients: pizza_by_name('Capriccosa vegan'), + ingredients: pizzasByName['Capriccosa vegan'], size: 1 }, ]; + console.log('Pizzas:', pizzas); for (const pizza of pizzas) { - await new Food(pizza).save(); + await new FoodModel(pizza).save(); } // Add the system diff --git a/src/app/api/manage/system/status/route.ts b/src/app/api/manage/system/status/route.ts index 3077bdc..bd18b38 100644 --- a/src/app/api/manage/system/status/route.ts +++ b/src/app/api/manage/system/status/route.ts @@ -13,7 +13,7 @@ export const fetchCache = "force-no-store"; * Set the system status * @constructor */ -export async function GET(req: Request, { params }: { params: { status: string } }) { +export async function GET(req: Request) { await dbConnect(); // Set the system status diff --git a/src/app/api/order/[id]/cancel/route.ts b/src/app/api/order/[id]/cancel/route.ts index d5c1a8f..a495220 100644 --- a/src/app/api/order/[id]/cancel/route.ts +++ b/src/app/api/order/[id]/cancel/route.ts @@ -1,6 +1,6 @@ import dbConnect from "@/lib/dbConnect"; import mongoose from "mongoose"; -import { Order } from "@/model/order"; +import { OrderModel } from "@/model/order"; /** * Allow user to cancel an order. @@ -27,7 +27,7 @@ export async function PUT(req: Request, { params }: { params: { id: string } }) try { // Find the order by ID - const foundOrder = await Order.findById(id); + const foundOrder = await OrderModel.findById(id); if (!foundOrder) { return new Response('Order not found', { status: 404 }); diff --git a/src/app/api/order/[id]/pay/route.ts b/src/app/api/order/[id]/pay/route.ts index 7057532..37ad324 100644 --- a/src/app/api/order/[id]/pay/route.ts +++ b/src/app/api/order/[id]/pay/route.ts @@ -2,7 +2,7 @@ import mongoose from "mongoose"; import dbConnect from "@/lib/dbConnect"; import { headers } from "next/headers"; import { extractBearerFromHeaders, validateToken } from "@/lib/auth"; -import { Order } from "@/model/order"; +import { OrderModel } from "@/model/order"; import { NextResponse } from "next/server"; /** @@ -25,7 +25,7 @@ export async function GET(req: Request, { params }: { params: { id: string } }) } // Find the order by ID - const order = await Order.findById(id); + const order = await OrderModel.findById(id); if (!order) { return NextResponse.json({ message: 'The Order was not found.' @@ -66,7 +66,7 @@ export async function PUT(req: Request, { params }: { params: { id: string } }) try { // Find the order by ID - const foundOrder = await Order.findById(id); + const foundOrder = await OrderModel.findById(id); if (!foundOrder) { return NextResponse.json({ diff --git a/src/app/api/order/[id]/route.ts b/src/app/api/order/[id]/route.ts index e2030cd..da15aba 100644 --- a/src/app/api/order/[id]/route.ts +++ b/src/app/api/order/[id]/route.ts @@ -1,7 +1,7 @@ import dbConnect from "@/lib/dbConnect"; import mongoose from "mongoose"; -import { Order } from "@/model/order"; -import { Food, FoodDocument } from "@/model/food"; +import { OrderModel } from "@/model/order"; +import { FoodModel, FoodDocument } from "@/model/food"; export async function GET(req: Request, { params }: { params: { id: string } }) { @@ -22,7 +22,7 @@ export async function GET(req: Request, { params }: { params: { id: string } }) } // Find the order by ID - const order = await Order.findById(id); + const order = await OrderModel.findById(id); if (!order) { return new Response(` The order with the ID ${id} was not found. @@ -32,7 +32,7 @@ export async function GET(req: Request, { params }: { params: { id: string } }) } // Get the foods for the order - const foodsDetails = await Food + const foodsDetails = await FoodModel .find({ _id: { $in: order.items.map((item) => item.food) } }) // Create a map of food details @@ -48,7 +48,7 @@ export async function GET(req: Request, { params }: { params: { id: string } }) name: order.name, comment: order.comment || "", items: order.items.map((item) => ({ - food: foodById[item.food._id], + food: foodById[item.food._id.toString()], status: item.status })), orderDate: order.orderDate, diff --git a/src/app/api/order/route.ts b/src/app/api/order/route.ts index 8e1173a..e43b3b6 100644 --- a/src/app/api/order/route.ts +++ b/src/app/api/order/route.ts @@ -1,9 +1,9 @@ import mongoose from "mongoose"; -import { Food, FoodDocument } from "@/model/food"; +import { FoodModel, FoodDocument } from "@/model/food"; import dbConnect from "@/lib/dbConnect"; import { headers } from "next/headers"; import { extractBearerFromHeaders, validateToken } from "@/lib/auth"; -import { Order } from "@/model/order"; +import { OrderModel } from "@/model/order"; import { constants, ORDER } from "@/config"; import { System } from "@/model/system"; import { NextResponse } from "next/server"; @@ -13,14 +13,14 @@ export async function GET(req: Request) { // Authenticate the user const headersList = headers() - /* if (!await validateToken(extractBearerFromHeaders(headersList))) { + if (!await validateToken(extractBearerFromHeaders(headersList))) { return NextResponse.json({ message: 'Unauthorized' }, { status: 401 }); - } */ + } - const orders = await Order.find(); - const foods = await Food.find(); + const orders = await OrderModel.find(); + const foods = await FoodModel.find(); const transformedOrders = await Promise.all(orders.map(async order => { // Get the foods for the order @@ -38,7 +38,7 @@ export async function GET(req: Request) { name: order.name, comment: order.comment || "", items: order.items.map((item) => ({ - food: foodById[item.food._id], + food: foodById[item.food._id.toString()], status: item.status })), orderDate: order.orderDate, @@ -84,7 +84,7 @@ export async function POST(req: Request) { // Check if the pizzas are valid const foodIds: string[] = items.map((pizza: { _id: string }) => pizza._id); - if (!foodIds.every(async (foodId: string) => await Food.exists({ _id: foodId }))) { + if (!foodIds.every(async (foodId: string) => await FoodModel.exists({ _id: foodId }))) { console.error('Some items are missing', items); return NextResponse.json({ message: 'Some items are missing' @@ -92,14 +92,14 @@ export async function POST(req: Request) { } // Find orders with the same time slot - const orders = await Order.find( + const orders = await OrderModel.find( { timeslot: timeslot, status: { $nin: ['cancelled'] } } ); // Find all food items - const food = await Food.find(); + const food = await FoodModel.find(); const foodById = food .reduce((map: { [id: string]: FoodDocument }, food) => { map[food._id.toString()] = food; @@ -108,7 +108,7 @@ export async function POST(req: Request) { // Sum up all items in the orders const orderItemsTotal = orders .flatMap(order => order.items) - .reduce((total, item) => total + foodById[item.food._id].size, 0); + .reduce((total, item) => total + foodById[item.food._id.toString()].size, 0); // Check if the total number of items is not too high console.log('Order items total:', orderItemsTotal, currentOrderItemsTotal); if (orderItemsTotal + currentOrderItemsTotal > ORDER.MAX_ITEMS_PER_TIMESLOT) { @@ -122,7 +122,7 @@ export async function POST(req: Request) { // Don't trust the price from the request body const totalPrice: number = await foodIds .reduce(async (total: Promise, foodId: string) => { - const food = await Food.findOne({ _id: foodId }); + const food = await FoodModel.findOne({ _id: foodId }); if (!food) { console.error('Pizza not found', foodId) return total; @@ -131,7 +131,7 @@ export async function POST(req: Request) { }, Promise.resolve(0)); // Create the order - const order = new Order(); + const order = new OrderModel(); order.name = (name || "anonymous").slice(0, 30); order.comment = (comment || "No comment").slice(0, 500); order.items = items.map((item: { _id: string }) => ({ food: item._id })); @@ -167,7 +167,7 @@ export async function PUT(req: Request) { try { // Find the order by ID - const foundOrder = await Order.findById(id); + const foundOrder = await OrderModel.findById(id); if (!foundOrder) { return new Response('Order not found', { status: 404 }); diff --git a/src/app/api/pizza/route.ts b/src/app/api/pizza/route.ts index 55dc971..42f9cc0 100644 --- a/src/app/api/pizza/route.ts +++ b/src/app/api/pizza/route.ts @@ -1,4 +1,4 @@ -import { Food } from "@/model/food"; +import { FoodModel } from "@/model/food"; import dbConnect from "@/lib/dbConnect"; import { headers } from "next/headers"; import { extractBearerFromHeaders, validateToken } from "@/lib/auth"; @@ -9,7 +9,7 @@ export async function GET(req: Request) { await dbConnect(); try { - const pizzas = await Food.find({ type: 'pizza' }); + const pizzas = await FoodModel.find({ type: 'pizza' }); return Response.json(pizzas) } catch (error) { console.error('Error fetching pizzas:', error); @@ -32,7 +32,7 @@ export async function POST(req: Request) { const newPizza = await req.json() try { - const pizza = new Food(newPizza); + const pizza = new FoodModel(newPizza); await pizza.save(); return Response.json(pizza); } catch (error) { @@ -55,7 +55,7 @@ export async function PUT(req: Request) { const pizza = await req.json() try { - const updatedPizza = await Food.findById(pizza._id); + const updatedPizza = await FoodModel.findById(pizza._id); if (!updatedPizza) { return NextResponse.json({ message: 'Pizza not found' diff --git a/src/app/api/timeline/route.ts b/src/app/api/timeline/route.ts index c0033a5..947a50e 100644 --- a/src/app/api/timeline/route.ts +++ b/src/app/api/timeline/route.ts @@ -1,9 +1,9 @@ import dbConnect from "@/lib/dbConnect"; import { constants } from '@/config'; -import { Order } from '@/model/order'; +import { OrderModel } from '@/model/order'; import moment from 'moment-timezone'; -import { Food, FoodDocument } from "@/model/food"; +import { FoodModel, FoodDocument } from "@/model/food"; import { getDateFromTimeSlot } from "@/lib/time"; // Thanks to https://medium.com/phantom3/next-js-14-build-prerender-error-fix-f3c51de2fe1d @@ -39,14 +39,14 @@ export async function GET(request: Request) { currentTime = moment(currentTime).add(TIME_SLOT_SIZE_MINUTES, 'minutes'); } - const orders = await Order.find({ + const orders = await OrderModel.find({ orderDate: { $gte: moment().utc().subtract(10 * TIME_SLOT_SIZE_MINUTES, 'minutes'), $lt: moment().utc().add(20 * TIME_SLOT_SIZE_MINUTES, 'minutes'), }, status: { $ne: 'cancelled' }, // TODO: Check if this is needed }); - const food = await Food.find(); + const food = await FoodModel.find(); const foodById = food .reduce((map: { [id: string]: FoodDocument }, food) => { map[food._id.toString()] = food; @@ -59,7 +59,7 @@ export async function GET(request: Request) { const timeSlot = getDateFromTimeSlot(timeslot); if (timeSlot >= startTime && timeSlot < stopTime) { items.forEach(({ food }) => { - totalAmount += foodById[food._id].size; + totalAmount += foodById[food._id.toString()].size; }); } }); diff --git a/src/app/order/Order.css b/src/app/order/Order.css index f28fca8..91e4d06 100644 --- a/src/app/order/Order.css +++ b/src/app/order/Order.css @@ -41,12 +41,6 @@ transition: background-color 0.3s, transform 0.3s; } -.pizza.order:hover { - background-color: rgba(var(--danger-color-rgb), 0.2); - transform: scale(1.01); -} - .pizza:hover { - background-color: rgba(var(--primary-color-rgb), 0.1); transform: scale(1.01); } diff --git a/src/app/order/[orderNumber]/page.tsx b/src/app/order/[orderNumber]/page.tsx index 23df9c8..b7aedcb 100755 --- a/src/app/order/[orderNumber]/page.tsx +++ b/src/app/order/[orderNumber]/page.tsx @@ -4,13 +4,13 @@ import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { getFromLocalStorage } from "@/lib/localStorage"; import { formatDateTime, getDateFromTimeSlot } from "@/lib/time"; -import { OrderStatus, OrderWithId } from "@/model/order"; +import { OrderStatus, Order } from "@/model/order"; import OrderQR from "@/app/components/order/OrderQR"; const Page = ({ params }: { params: { orderNumber: string } }) => { const [error, setError] = useState(null); - const [order, setOrder] = useState(null) + const [order, setOrder] = useState(null) // Check if logged in const router = useRouter(); @@ -138,7 +138,7 @@ const Page = ({ params }: { params: { orderNumber: string } }) => { {order?.items?.map((item) => ( <>
-
+
{/* Product Image */}
diff --git a/src/app/page.jsx b/src/app/page.jsx deleted file mode 100644 index 35c685a..0000000 --- a/src/app/page.jsx +++ /dev/null @@ -1,328 +0,0 @@ -'use client' - -import './order/Order.css'; -import {useEffect, useState} from "react"; -import OrderButton from "@/app/components/order/OrderButton.jsx"; -import Timeline from "@/app/components/Timeline.jsx"; -import ErrorMessage from "@/app/components/ErrorMessage.jsx"; -import WithSystemCheck from "./WithSystemCheck.jsx"; -import {getDateFromTimeSlot} from "@/lib/time"; - -const EVERY_X_SECONDS = 60; - -const Food = ({food, className, onClick}) => { - return ( -
  • -
    - {food.price}€ {food.name} -
    -
    - {food.dietary && {food.dietary}} - {food.type} -
    -
  • - ); -}; - -const FloatingIslandElement = ({content, title}) => { - return ( -
    -
    -
    - {content} -
    -
    -
    - {title} -
    -
    - ) -} - - -const PizzaIngredientsTable = () => { - const tableCellClass = "border border-gray-300 px-4 py-2"; - const headerCellClass = `bg-gray-200 ${tableCellClass}`; - - const pizzas = [ - {name: "Salami", ingredients: ["Cheese 🧀", "Tomato Sauce 🍅", "Salami 🍕"]}, - {name: "Ham and mushrooms", ingredients: ["Cheese 🧀", "Tomato Sauce 🍅", "Ham 🥓", "Mushrooms 🍄"]}, - { - name: "Capriccosa", - ingredients: ["Cheese 🧀", "Tomato Sauce 🍅", "Mushrooms 🍄", "Artichokes 🌱", "Olives 🫒", "Ham 🥓", "Basil 🌿"] - }, - {name: "Margherita", ingredients: ["Cheese 🧀", "Tomato Sauce 🍅", "Basil 🌿"]}, - { - name: "Veggies", - ingredients: ["Cheese 🧀", "Tomato Sauce 🍅", "Mushrooms 🍄", "Onions 🧅", "Green Peppers 🫑", "Olives 🫒"] - }, - {name: "Margherita vegan", ingredients: ["Vegan Cheese 🧀", "Tomato Sauce 🍅", "Basil 🌿"]}, - { - name: "Capriccosa vegan", - ingredients: ["Vegan Cheese 🧀", "Tomato Sauce 🍅", "Mushrooms 🍄", "Artichokes 🌱", "Olives 🫒", "Basil 🌿"] - } - ]; - - return ( -
    -

    Pizza Ingredients:

    - - - - - - - - - {pizzas.map((pizza, index) => ( - - - - - ))} - -
    PizzaIngredients
    - {pizza.name} - - {pizza.ingredients.join(", ")} -
    -
    - ); -}; - -// Order component -const Page = () => { - // State to hold the order - const [error, setError] = useState(''); - const [foods, setFoods] = useState([]); - const [order, setOrder] = useState({name: '', items: [], comment: '', timeslot: null}); - - // Set the start and end date for the timeline - const start = new Date(); - start.setHours(start.getHours() - 1); // Previous hour - start.setMinutes(0, 0, 0); - - const end = new Date(); - end.setHours(end.getHours() + 1); // Next hour - end.setMinutes(59, 59, 999); - - // Fetch the pizza menu from the server - useEffect(() => { - // Fetch the pizza menu from the server - fetch("/api/pizza") - .then(async response => { - const data = await response.json(); - if (!response.ok) { - const error = (data && data.message) || response.statusText; - throw new Error(error); - } - return data; - }) - .then(data => { - setFoods(data); - }) - .catch(error => { - console.error('There was an error!', error); - setError(error.message); - }); - }, []); - - /** - * Update the order with the new values - * @param updatedOrder - */ - const updateOrder = (updatedOrder) => { - setOrder({...order, ...updatedOrder}); - }; - - /** - * Add food to the order - * @param food - */ - const addToOrder = (food) => { - setError(''); - const newOrder = [...order.items]; - newOrder.push(food); - updateOrder({items: newOrder}); - } - - /** - * Remove food from the order - * @param index - */ - const removeFromOrder = (index) => { - setError(''); - const newOrder = [...order.items]; - newOrder.splice(index, 1); - updateOrder({items: newOrder}); - } - - /** - * Set the timeslot of the order - */ - const setTimeslot = (timeslot) => { - // Check if the timeslot is not in the past - - const BUFFER = 10; - - // Get time with buffer - const currentTime = new Date(); - currentTime.setMinutes(currentTime.getMinutes() + BUFFER); - - const timeslotTime = getDateFromTimeSlot(timeslot).toDate() - - if (timeslotTime < currentTime) { - setError('You cannot choose a timeslot in the past.'); - setTimeout(() => setError(''), 5000); - return; - } - - updateOrder({timeslot: timeslot}); - } - - /** - * Set the name of the order - * @param name - */ - const setName = (name) => { - updateOrder({name: name}); - }; - - /** - * Set the comment of the order - */ - const setComment = (comment) => { - updateOrder({comment: comment}); - } - - - return ( -
    -
    -

    Order your pizza at Sommerfest 2024!

    -
    -
      -
    1. -

      Choose Pizza:

      -

      Select whole or halved from the list below (a whole pizza has a diameter of 12 inches / 30 cm).

      -
    2. -
    3. -

      Pick-Up Time:

      -

      Choose a time (some slots may be full).

      -
    4. -
    5. -

      Pay in Cash:

      -

      Pay when collecting at the counter.

      -
    6. -
    -
    -

    Order Times:

    -

    Earliest pick-up: 17:25

    -

    Latest order: 23:40

    -
    -

    Enjoy your evening!

    -
    -
    - -
    -
    -
    -

    Menu:

    -

    Select your pizza from the list below. - Ingredients are at the bottom.

    - -
      - {foods - .filter(food => food.enabled) - .map((food, index) => ( - addToOrder(food)} - /> - ))} - {!foods.length &&

      Loading...

      } -
    -
    - -
    - -

    Your current order:

    - {error && } -
      - {order.items - .map((food, index) => ( - removeFromOrder(food)} - /> - ))} -
    - -
    - - setName(e.target.value)} - /> - -