916ad39176
Deploy to route.crispygoat.com / deploy (push) Failing after 3m1s
- Add MinIO/S3-compatible storage client (src/lib/storage.ts) with uploadObject, deleteObject, presigned URL helpers, and BUCKETS constant - Wire product images, brand logos, and water log photos to MinIO via the new storage client - Migrate forgot-password to Neon Auth (remove Supabase /auth/v1/recover call) - Migrate send-scheduled cron to direct Postgres + Resend (remove Supabase Edge Function proxy) - Add logoUrl to email types (OrderReceipt, Welcome, PasswordReset) and pass brand_settings.logo_url from all call sites - Update email templates to use dynamic logoUrl instead of hardcoded Supabase bucket URLs - Remove hardcoded Supabase URLs from TuxedoVideoHero, TuxedoAboutPage, TimeTrackingFieldClient; use brand_settings props + local public/ fallback - Download brand logos (3) and tuxedo-hero.mp4 (36MB) from Supabase bucket to public/ for local development - Add MinIO env vars to .env.example (endpoint, access key, secret, buckets) - Fix TimeTrackingFieldClient to destructure logoUrl and brandAccent props - Fix admin/users.ts logoUrl type (null → undefined for optional string) - Remove stale sb- cookie from wholesale-auth - Migrate tuxedo/about page to remove supabase import and use pool query for wholesale_settings lookup
67 lines
2.1 KiB
PL/PgSQL
67 lines
2.1 KiB
PL/PgSQL
-- Migration 063: Auto-create wholesale_settings on first registration
|
|
-- Ensures new brands get a default wholesale_settings row automatically
|
|
|
|
BEGIN;
|
|
|
|
-- Update register_wholesale_customer to auto-create wholesale_settings if missing
|
|
CREATE OR REPLACE FUNCTION public.register_wholesale_customer(
|
|
p_brand_id UUID DEFAULT NULL,
|
|
p_company_name TEXT DEFAULT NULL,
|
|
p_contact_name TEXT DEFAULT NULL,
|
|
p_email TEXT DEFAULT NULL,
|
|
p_phone TEXT DEFAULT NULL
|
|
)
|
|
RETURNS JSONB
|
|
LANGUAGE plpgsql SECURITY DEFINER SET search_path = public
|
|
AS $$
|
|
DECLARE
|
|
v_id UUID;
|
|
v_req_app BOOLEAN := true;
|
|
BEGIN
|
|
-- Reject duplicate email for this brand
|
|
IF EXISTS (SELECT 1 FROM wholesale_customers WHERE brand_id = p_brand_id AND email = p_email) THEN
|
|
RETURN jsonb_build_object('success', false, 'error', 'An account with this email already exists.');
|
|
END IF;
|
|
|
|
-- Auto-create wholesale_settings row if it doesn't exist for this brand
|
|
-- This ensures new brands always have settings before registration proceeds
|
|
IF NOT EXISTS (SELECT 1 FROM wholesale_settings WHERE brand_id = p_brand_id) THEN
|
|
INSERT INTO wholesale_settings (brand_id, require_approval, wholesale_enabled, pickup_location)
|
|
VALUES (p_brand_id, true, true, 'See your order confirmation for pickup details')
|
|
ON CONFLICT (brand_id) DO NOTHING;
|
|
END IF;
|
|
|
|
-- Read require_approval setting for this brand (now guaranteed to exist)
|
|
BEGIN
|
|
SELECT require_approval INTO v_req_app
|
|
FROM wholesale_settings
|
|
WHERE brand_id = p_brand_id;
|
|
EXCEPTION WHEN OTHERS THEN
|
|
v_req_app := true;
|
|
END;
|
|
|
|
INSERT INTO wholesale_customers (
|
|
brand_id, company_name, contact_name, email, phone,
|
|
account_status, role
|
|
) VALUES (
|
|
p_brand_id,
|
|
p_company_name,
|
|
p_contact_name,
|
|
p_email,
|
|
p_phone,
|
|
CASE WHEN COALESCE(v_req_app, true) THEN 'pending_approval' ELSE 'active' END,
|
|
'buyer'
|
|
)
|
|
RETURNING id INTO v_id;
|
|
|
|
RETURN jsonb_build_object(
|
|
'success', true,
|
|
'id', v_id,
|
|
'requires_approval', COALESCE(v_req_app, true)
|
|
);
|
|
END;
|
|
$$;
|
|
|
|
COMMIT;
|
|
|
|
NOTIFY pgrst, 'reload schema'; |