Initial commit: Craft2Prints with Stages 1-3
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
'use server';
|
||||
|
||||
import { redirect } from 'next/navigation';
|
||||
import { prisma } from '@/lib/prisma';
|
||||
import { sendProofEmail } from '@/lib/mail';
|
||||
|
||||
export async function createProof(formData: FormData) {
|
||||
const productId = String(formData.get('productId') ?? '');
|
||||
const customerName = String(formData.get('customerName') ?? '').trim();
|
||||
const customerEmail = String(formData.get('customerEmail') ?? '').trim();
|
||||
const color = String(formData.get('color') ?? '');
|
||||
const quantity = Math.max(1, Number(formData.get('quantity') ?? 1));
|
||||
const note = String(formData.get('note') ?? '').trim();
|
||||
const priceOverride = formData.get('price');
|
||||
const file = formData.get('image') as File | null;
|
||||
|
||||
if (!productId || !customerEmail || !color || !file || file.size === 0) {
|
||||
throw new Error('Missing required fields: product, customer email, color, and an image are all required.');
|
||||
}
|
||||
|
||||
const product = await prisma.product.findUnique({ where: { id: productId } });
|
||||
if (!product) throw new Error('Product not found.');
|
||||
|
||||
const bytes = Buffer.from(await file.arrayBuffer());
|
||||
const mimeType = file.type || 'image/png';
|
||||
const imageDataUrl = `data:${mimeType};base64,${bytes.toString('base64')}`;
|
||||
|
||||
const unitPrice = priceOverride && String(priceOverride).trim() !== ''
|
||||
? Math.round(Number(priceOverride) * 100)
|
||||
: product.basePrice;
|
||||
|
||||
const proof = await prisma.designProof.create({
|
||||
data: {
|
||||
productId,
|
||||
customerName: customerName || null,
|
||||
customerEmail,
|
||||
color,
|
||||
quantity,
|
||||
unitPrice,
|
||||
imageDataUrl,
|
||||
note: note || null,
|
||||
},
|
||||
});
|
||||
|
||||
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL ?? 'http://localhost:3000';
|
||||
const link = `${siteUrl}/proofs/${proof.id}`;
|
||||
|
||||
const result = await sendProofEmail({
|
||||
to: customerEmail,
|
||||
customerName: customerName || null,
|
||||
link,
|
||||
productName: product.name,
|
||||
note: note || null,
|
||||
});
|
||||
|
||||
redirect(`/admin/proofs/${proof.id}/sent?emailed=${result.sent ? '1' : '0'}`);
|
||||
}
|
||||
Reference in New Issue
Block a user