Aunty-Sparkles-Website/app/api/square/orders/create/route.ts

92 lines
2.7 KiB
TypeScript

import { getSquareClient, getSquareLocationId } from "@/lib/square-client"
import type { CustomerInfo, CartItem } from "@/lib/square-types"
export async function POST(request: Request) {
try {
const { items, customerInfo }: { items: CartItem[], customerInfo: CustomerInfo } = await request.json()
if (!items || items.length === 0) {
return Response.json({
success: false,
error: "No items provided"
}, { status: 400 })
}
if (!customerInfo.name || !customerInfo.email) {
return Response.json({
success: false,
error: "Customer name and email are required"
}, { status: 400 })
}
const client = await getSquareClient()
const locationId = getSquareLocationId()
const ordersApi = client.ordersApi
// Calculate total amount
const totalAmount = items.reduce((sum, item) => sum + (item.price * item.quantity), 0)
// Create order request
const orderRequest = {
order: {
locationId: locationId,
lineItems: items.map(item => ({
catalogObjectId: item.variationId,
quantity: item.quantity.toString(),
name: item.name,
note: item.description || "",
basePriceMoney: {
amount: BigInt(Math.round(item.price * 100)), // Convert to cents
currency: "USD",
},
})),
metadata: {
customerName: customerInfo.name,
customerEmail: customerInfo.email,
customerPhone: customerInfo.phone || "",
...(customerInfo.address && {
shippingAddress: JSON.stringify(customerInfo.address)
})
},
state: "OPEN",
totalMoney: {
amount: BigInt(Math.round(totalAmount * 100)),
currency: "USD"
}
},
idempotencyKey: crypto.randomUUID(),
}
console.log("Creating Square order:", {
itemCount: items.length,
totalAmount,
customerEmail: customerInfo.email
})
const response = await ordersApi.createOrder(orderRequest)
if (response.result.order) {
console.log("Order created successfully:", response.result.order.id)
return Response.json({
success: true,
order: {
id: response.result.order.id,
state: response.result.order.state,
totalAmount: totalAmount,
lineItems: response.result.order.lineItems?.length || 0
}
})
} else {
throw new Error("Order creation failed - no order returned")
}
} catch (error) {
console.error("Square order creation error:", error)
return Response.json({
success: false,
error: error instanceof Error ? error.message : "Order creation failed"
}, { status: 500 })
}
}