import { createClient } from "@supabase/supabase-js"; import { getOrderUpdateForInboundAction } from "./workflow.ts"; export type ProviderName = "telegram" | "vk" | "messenger_max"; export type NormalizedChatEvent = { provider: ProviderName; orderId: string; externalMessageId: string | null; senderType: "client" | "bot" | "system"; text: string; payload: Record; action: "confirm_delivery" | "reschedule" | "cancel_delivery" | "unknown"; }; export const createServiceClient = () => { const supabaseUrl = Deno.env.get("SUPABASE_URL") || ""; const serviceRoleKey = Deno.env.get("SUPABASE_SERVICE_ROLE_KEY") || ""; return createClient(supabaseUrl, serviceRoleKey); }; /** Create a Supabase client that respects RLS policies (uses anon key). */ export const createAnonClient = () => { const supabaseUrl = Deno.env.get("SUPABASE_URL") || ""; const anonKey = Deno.env.get("SUPABASE_ANON_KEY") || ""; return createClient(supabaseUrl, anonKey); }; export const json = (body: unknown, status = 200) => new Response(JSON.stringify(body), { status, headers: { "Content-Type": "application/json", }, }); export const normalizeIncomingEvent = ( provider: ProviderName, body: Record, ): NormalizedChatEvent => { const payload = (body.payload as Record) || {}; return { provider, orderId: String(body.order_id || payload.order_id || ""), externalMessageId: body.external_message_id ? String(body.external_message_id) : null, senderType: "client", text: String(body.text || payload.text || ""), payload, action: resolveAction(body.action || payload.action), }; }; export const resolveAction = (action: unknown): NormalizedChatEvent["action"] => { switch (String(action || "").toLowerCase()) { case "confirm": case "confirm_delivery": return "confirm_delivery"; case "reschedule": return "reschedule"; case "cancel": case "cancel_delivery": return "cancel_delivery"; default: return "unknown"; } }; export const orderUpdateByAction = (action: NormalizedChatEvent["action"]) => getOrderUpdateForInboundAction(action); export const channelFromProvider = (provider: ProviderName) => provider;