92 lines
2.7 KiB
TypeScript
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 })
|
|
}
|
|
}
|