File size: 1,693 Bytes
b6b8e8b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
-- ============================================================
-- MATHSOLVER v5.0 - State Architecture Upgrade Migration
-- ============================================================

-- 1. Auto-update `sessions.updated_at` function
CREATE OR REPLACE FUNCTION public.update_session_timestamp()
RETURNS TRIGGER AS $$
BEGIN
    UPDATE public.sessions
    SET updated_at = NOW()
    WHERE id = NEW.session_id;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

-- 2. Triggers for session timestamp updates
DROP TRIGGER IF EXISTS trg_update_session_on_message ON public.messages;
CREATE TRIGGER trg_update_session_on_message
    AFTER INSERT ON public.messages
    FOR EACH ROW
    EXECUTE FUNCTION public.update_session_timestamp();

DROP TRIGGER IF EXISTS trg_update_session_on_job ON public.jobs;
CREATE TRIGGER trg_update_session_on_job
    AFTER INSERT OR UPDATE ON public.jobs
    FOR EACH ROW
    EXECUTE FUNCTION public.update_session_timestamp();

DROP TRIGGER IF EXISTS trg_update_session_on_asset ON public.session_assets;
CREATE TRIGGER trg_update_session_on_asset
    AFTER INSERT ON public.session_assets
    FOR EACH ROW
    EXECUTE FUNCTION public.update_session_timestamp();

-- 3. Idempotency Support: client_message_id on messages
ALTER TABLE public.messages 
ADD COLUMN IF NOT EXISTS client_message_id UUID;

CREATE UNIQUE INDEX IF NOT EXISTS idx_messages_session_client_id 
ON public.messages(session_id, client_message_id) 
WHERE client_message_id IS NOT NULL;

-- 4. Atomic Asset Versioning: Unique version per session and asset type
CREATE UNIQUE INDEX IF NOT EXISTS idx_session_assets_unique_version 
ON public.session_assets(session_id, asset_type, version);