Initial commit: Craft2Prints with Stages 1-3

This commit is contained in:
Andymick
2026-07-15 18:09:59 +01:00
commit 41937ffc15
158 changed files with 16054 additions and 0 deletions
+57
View File
@@ -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'}`);
}