38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { z } from 'zod';
|
|
import { verifyAdminToken, unauthorizedResponse } from '@/lib/admin-auth';
|
|
import { processRefund, OrderError } from '@/lib/order/service';
|
|
|
|
const refundSchema = z.object({
|
|
order_id: z.string().min(1),
|
|
reason: z.string().optional(),
|
|
force: z.boolean().optional().default(false),
|
|
});
|
|
|
|
export async function POST(request: NextRequest) {
|
|
if (!(await verifyAdminToken(request))) return unauthorizedResponse();
|
|
|
|
try {
|
|
const body = await request.json();
|
|
const parsed = refundSchema.safeParse(body);
|
|
|
|
if (!parsed.success) {
|
|
return NextResponse.json({ error: '参数错误', details: parsed.error.flatten().fieldErrors }, { status: 400 });
|
|
}
|
|
|
|
const result = await processRefund({
|
|
orderId: parsed.data.order_id,
|
|
reason: parsed.data.reason,
|
|
force: parsed.data.force,
|
|
});
|
|
|
|
return NextResponse.json(result);
|
|
} catch (error) {
|
|
if (error instanceof OrderError) {
|
|
return NextResponse.json({ error: error.message, code: error.code }, { status: error.statusCode });
|
|
}
|
|
console.error('Refund error:', error);
|
|
return NextResponse.json({ error: '退款失败' }, { status: 500 });
|
|
}
|
|
}
|