Spaces:
Sleeping
Sleeping
File size: 3,667 Bytes
fd9025a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | -- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
-- Supabase Migration β entgroup-sentiment patch v3.1
-- ΰΈ£ΰΈ±ΰΈΰΉΰΈ Supabase Dashboard β SQL Editor ΰΈΰΉΰΈΰΈ git push app.py
-- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
-- ββ 1. admin_activity table (PATCH 3b) ββββββββββββββββββββββββββ
-- ΰΉΰΈΰΈ in-memory _last_admin_activity ΰΈΰΈ΅ΰΉΰΈ«ΰΈ²ΰΈ’ΰΉΰΈ‘ΰΈ·ΰΉΰΈ Space restart
CREATE TABLE IF NOT EXISTS admin_activity (
id SERIAL PRIMARY KEY,
activity_key TEXT NOT NULL UNIQUE, -- 'global' ΰΈ«ΰΈ£ΰΈ·ΰΈ customer_id
last_active_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_admin_activity_key ON admin_activity(activity_key);
-- ββ 2. RPC: increment_daily_stats (PATCH 3) ββββββββββββββββββββββ
-- atomic server-side increment ΰΈΰΉΰΈΰΈΰΈΰΈ±ΰΈ race condition
-- ΰΉΰΈ£ΰΈ΅ΰΈ’ΰΈΰΈΰΈ²ΰΈ Python: sb_post("/rest/v1/rpc/increment_daily_stats", {...})
CREATE OR REPLACE FUNCTION increment_daily_stats(
p_date DATE,
p_is_new BOOLEAN,
p_customer_type TEXT
)
RETURNS VOID
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO daily_stats (
date, total_customers, new_customers, returning_customers,
si_count, end_user_count, unknown_count, total_messages
) VALUES (
p_date, 1,
CASE WHEN p_is_new THEN 1 ELSE 0 END,
CASE WHEN NOT p_is_new THEN 1 ELSE 0 END,
CASE WHEN p_customer_type = 'si' THEN 1 ELSE 0 END,
CASE WHEN p_customer_type = 'end_user' THEN 1 ELSE 0 END,
CASE WHEN p_customer_type = 'unknown' THEN 1 ELSE 0 END,
1
)
ON CONFLICT (date) DO UPDATE SET
total_customers = daily_stats.total_customers + 1,
new_customers = daily_stats.new_customers + CASE WHEN p_is_new THEN 1 ELSE 0 END,
returning_customers = daily_stats.returning_customers + CASE WHEN NOT p_is_new THEN 1 ELSE 0 END,
si_count = daily_stats.si_count + CASE WHEN p_customer_type = 'si' THEN 1 ELSE 0 END,
end_user_count = daily_stats.end_user_count + CASE WHEN p_customer_type = 'end_user' THEN 1 ELSE 0 END,
unknown_count = daily_stats.unknown_count + CASE WHEN p_customer_type = 'unknown' THEN 1 ELSE 0 END,
total_messages = daily_stats.total_messages + 1;
END;
$$;
-- Grant execute ΰΉΰΈ«ΰΉ anon role (ΰΉΰΈΰΉ Supabase key ΰΈΰΈΰΈΰΈ΄)
GRANT EXECUTE ON FUNCTION increment_daily_stats TO anon, authenticated, service_role;
-- ββ 3. ΰΈΰΈ£ΰΈ§ΰΈΰΈͺΰΈΰΈ daily_stats ΰΈ‘ΰΈ΅ unique constraint ΰΈΰΈ date ββββββββββ
-- RPC ΰΉΰΈΰΉ ON CONFLICT (date) β ΰΈΰΉΰΈΰΈΰΈ‘ΰΈ΅ unique index
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conname = 'daily_stats_date_key'
) THEN
ALTER TABLE daily_stats ADD CONSTRAINT daily_stats_date_key UNIQUE (date);
END IF;
END $$;
-- ββ Done ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
SELECT 'Migration complete: admin_activity table + increment_daily_stats RPC' AS result;
|