export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })}const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)const intent = await stripe.paymentIntents.create({amount: cart.total, currency: 'krw',metadata: { holdId: hold.id, cartId: cart.id },})export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })}const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)const intent = await stripe.paymentIntents.create({amount: cart.total, currency: 'krw',metadata: { holdId: hold.id, cartId: cart.id },})export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })}const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)const intent = await stripe.paymentIntents.create({amount: cart.total, currency: 'krw',metadata: { holdId: hold.id, cartId: cart.id },})export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })}const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)const intent = await stripe.paymentIntents.create({amount: cart.total, currency: 'krw',metadata: { holdId: hold.id, cartId: cart.id },})
const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)const intent = await stripe.paymentIntents.create({amount: cart.total, currency: 'krw',metadata: { holdId: hold.id, cartId: cart.id },})export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)const intent = await stripe.paymentIntents.create({amount: cart.total, currency: 'krw',metadata: { holdId: hold.id, cartId: cart.id },})export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)const intent = await stripe.paymentIntents.create({amount: cart.total, currency: 'krw',metadata: { holdId: hold.id, cartId: cart.id },})export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)const intent = await stripe.paymentIntents.create({amount: cart.total, currency: 'krw',metadata: { holdId: hold.id, cartId: cart.id },})export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)const intent = await stripe.paymentIntents.create({amount: cart.total, currency: 'krw',metadata: { holdId: hold.id, cartId: cart.id },})export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)const intent = await stripe.paymentIntents.create({amount: cart.total, currency: 'krw',metadata: { holdId: hold.id, cartId: cart.id },})export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)const intent = await stripe.paymentIntents.create({amount: cart.total, currency: 'krw',metadata: { holdId: hold.id, cartId: cart.id },})export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })
export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export function CheckoutPage() {const [step, setStep] = useState<Step>('address')const { data: cart } = useCart()return <Stepper step={step} onNext={advance} />}async function releaseHold(holdId: string) {await db.hold.update({ where: { id: holdId },data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })
data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })data: { releasedAt: new Date() } })await inventory.restore(holdId)}schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })
schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })}const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })}const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)schedule.every('1m', () => expireHolds({ olderThan: 600 }))const order = await db.order.create({ data: { cartId, intentId } })logger.info('order.created', { orderId: order.id })await mailer.send('order-confirmed', { to: user.email })export async function POST(req: Request) {const sig = req.headers.get('stripe-signature')const event = stripe.webhooks.constructEvent(raw, sig, secret)if (event.type === 'payment_intent.succeeded') {await createOrder(event.data.object)}return NextResponse.json({ received: true })}const hold = await reserveStock(items, { ttl: 600 })if (!hold.ok) throw new OutOfStockError(hold.sku)