Files
alva/supabase/functions/submit-order/index.ts
T
gpt-engineer-app[bot] 046a413a59 Changes
Co-authored-by: wolfoftyreso-debug <250630591+wolfoftyreso-debug@users.noreply.github.com>
2026-07-11 12:50:32 +00:00

102 lines
3.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { createClient } from "https://esm.sh/@supabase/supabase-js@2.45.0";
import { corsHeaders } from "npm:@supabase/supabase-js@2/cors";
import { z } from "https://esm.sh/zod@3.23.8";
const BodySchema = z.object({
företag: z.string().trim().min(1).max(100),
epost: z.string().trim().email().max(255),
telefon: z.string().trim().max(30).optional().default(""),
adress: z.string().trim().max(200).optional().default(""),
postnummer: z
.string()
.trim()
.regex(/^\s*\d{3}\s*\d{2}\s*$/, "Ogiltigt postnummer")
.refine((v) => {
const n = parseInt(v.replace(/\s/g, ""), 10);
return n >= 10000 && n <= 19999;
}, "Vi levererar endast inom Storstockholm (100 00 199 99)"),
stad: z.string().trim().max(100).optional().default(""),
kommentarer: z.string().trim().max(1000).optional().default(""),
employees: z.number().int().min(1).max(1000),
kg_per_vecka: z.number().min(1).max(500),
pris_per_vecka: z.number().min(0).max(1000000),
});
Deno.serve(async (req) => {
if (req.method === "OPTIONS") {
return new Response("ok", { headers: corsHeaders });
}
try {
const parsed = BodySchema.safeParse(await req.json());
if (!parsed.success) {
return new Response(
JSON.stringify({ error: parsed.error.flatten().fieldErrors }),
{
status: 400,
headers: { ...corsHeaders, "Content-Type": "application/json" },
}
);
}
const d = parsed.data;
const supabase = createClient(
Deno.env.get("SUPABASE_URL")!,
Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!
);
const orderNumber = `ABO-${Date.now().toString(36).toUpperCase()}`;
const { data, error } = await supabase
.from("orders")
.insert({
order_number: orderNumber,
customer_email: d.epost,
customer_name: d.företag,
items: [
{
typ: "Kakabonnemang",
antal_anställda: d.employees,
kg_per_vecka: d.kg_per_vecka,
pris_per_vecka_exkl_moms: d.pris_per_vecka,
valuta: "SEK",
leverans: {
adress: d.adress,
postnummer: d.postnummer,
stad: d.stad,
},
telefon: d.telefon,
kommentarer: d.kommentarer,
},
],
total_amount: d.pris_per_vecka,
currency: "SEK",
status: "pending",
})
.select("id, order_number")
.single();
if (error) {
console.error("Order insert failed:", error);
return new Response(
JSON.stringify({ error: "Kunde inte spara beställning", details: error.message }),
{
status: 500,
headers: { ...corsHeaders, "Content-Type": "application/json" },
}
);
}
return new Response(JSON.stringify({ ok: true, order: data }), {
status: 200,
headers: { ...corsHeaders, "Content-Type": "application/json" },
});
} catch (e) {
console.error("submit-order error:", e);
return new Response(JSON.stringify({ error: (e as Error).message }), {
status: 500,
headers: { ...corsHeaders, "Content-Type": "application/json" },
});
}
});