diff --git a/app/api/cart/route.ts b/app/api/cart/route.ts
index f1d501675..f61845fa1 100644
--- a/app/api/cart/route.ts
+++ b/app/api/cart/route.ts
@@ -1,21 +1,38 @@
-import { authOptions } from 'lib/auth/config';
-import { storeApi } from 'lib/woocomerce/storeApi';
-import { getServerSession } from 'next-auth';
+import { getStoreApiFromRequest } from 'lib/woocomerce/storeApi';
import { NextRequest, NextResponse } from 'next/server';
export async function GET(req: NextRequest) {
try {
- const session = await getServerSession(authOptions);
- storeApi._setAuthorizationToken(session?.user?.token ?? '');
- const cart = await storeApi.getCart();
- return NextResponse.json(cart, { status: 200 });
- } catch (error) {
- return NextResponse.json({ error: 'Failed to fetch cart', message: error }, { status: 500 });
+ const storeApi = await getStoreApiFromRequest(req);
+ const { cart, cartToken: updatedToken } = await storeApi.getCart();
+
+ const response = NextResponse.json(cart);
+
+ if (updatedToken) {
+ response.cookies.set('cart-token', updatedToken, {
+ httpOnly: true,
+ sameSite: 'lax',
+ path: '/', //
+ maxAge: 60 * 60 * 46 // 46 ore
+ });
+ }
+
+ return response;
+ } catch (error: any) {
+ if (error.message.includes('jwt_auth_invalid_token')) {
+ console.error('Token expired, please reauthenticate.');
+ return NextResponse.json({ error: 'Token expired, please reauthenticate.' }, { status: 401 });
+ }
+ return NextResponse.json(
+ { error: 'Failed to fetch cart', message: error.message },
+ { status: 500 }
+ );
}
}
export async function POST(req: NextRequest) {
try {
+ const storeApi = await getStoreApiFromRequest(req);
const { id, quantity, variation } = await req.json();
const cart = await storeApi.addToCart({ id, quantity, variation });
return NextResponse.json(cart, { status: 200 });
@@ -29,6 +46,7 @@ export async function POST(req: NextRequest) {
export async function PUT(req: NextRequest) {
try {
+ const storeApi = await getStoreApiFromRequest(req);
const { key, quantity } = await req.json();
if (quantity > 0) {
const cart = await storeApi.updateItem({ key, quantity });
@@ -47,6 +65,7 @@ export async function PUT(req: NextRequest) {
export async function DELETE(req: NextRequest) {
try {
+ const storeApi = await getStoreApiFromRequest(req);
const { key } = await req.json();
const cart = await storeApi.removeFromCart({ key });
return NextResponse.json(cart, { status: 200 });
diff --git a/app/api/customer/order/route.ts b/app/api/customer/order/route.ts
new file mode 100644
index 000000000..190e018f9
--- /dev/null
+++ b/app/api/customer/order/route.ts
@@ -0,0 +1,31 @@
+import { authOptions } from 'lib/auth/config';
+import { getStoreApiFromRequest, OrderPayload } from 'lib/woocomerce/storeApi';
+import { getServerSession } from 'next-auth';
+import { NextRequest, NextResponse } from 'next/server';
+
+export async function POST(req: NextRequest) {
+ try {
+ const session = await getServerSession(authOptions);
+ if (!session?.user?.customer_id) {
+ return NextResponse.json({ error: 'User not logged' }, { status: 401 });
+ }
+
+ const storeApi = await getStoreApiFromRequest(req);
+
+ const { billing_address, shipping_address, customer_note, payment_method, payment_data } =
+ await req.json();
+ const order: OrderPayload = {
+ shipping_address,
+ billing_address: billing_address || shipping_address,
+ customer_note,
+ payment_method: payment_method || 'bacs', // Ensure payment method is used
+ payment_data: payment_data || [] // Ensure payment data is used
+ };
+ console.log('Creating order', order);
+ const result = await storeApi.createOrder(order);
+ return NextResponse.json(result, { status: 200 });
+ } catch (error) {
+ console.error('Error creating order', error);
+ return NextResponse.json({ error: JSON.stringify(error) }, { status: 500 });
+ }
+}
diff --git a/app/checkout/page.tsx b/app/checkout/page.tsx
index 770ec8c82..76f195a14 100644
--- a/app/checkout/page.tsx
+++ b/app/checkout/page.tsx
@@ -20,9 +20,8 @@ const shippingSchema = z.object({
address_1: z.string().min(3),
address_2: z.string().optional(),
city: z.string().min(3),
- state: z.string().max(2).min(2),
postcode: z.string().min(3),
- country: z.string().min(3),
+ country: z.string().min(2).max(2),
company: z.string().optional()
});
diff --git a/app/checkout/review/page.tsx b/app/checkout/review/page.tsx
index 5ebf519bb..cab033343 100644
--- a/app/checkout/review/page.tsx
+++ b/app/checkout/review/page.tsx
@@ -9,6 +9,18 @@ export default function CheckoutReview() {
const { cart } = useCart();
const { checkout } = useCheckout();
+ const handleCreateOrder = async () => {
+ const order = await fetch('/api/customer/order', {
+ method: 'POST',
+ body: JSON.stringify({
+ billing_address: checkout?.billing,
+ shipping_address: checkout?.shipping,
+ payment_method: checkout?.payment_method
+ })
+ }).catch((err) => {
+ console.error('Error creating order', err);
+ });
+ };
return (
Riassunto
@@ -41,8 +53,13 @@ export default function CheckoutReview() {
Metodo di pagamento
{checkout?.payment_method}
-