sojorn/go-backend/internal/database/migrations/20260127000002_optimize_e2ee_schema.up.sql
Patrick Britton 3c4680bdd7 Initial commit: Complete threaded conversation system with inline replies
**Major Features Added:**
- **Inline Reply System**: Replace compose screen with inline reply boxes
- **Thread Navigation**: Parent/child navigation with jump functionality
- **Chain Flow UI**: Reply counts, expand/collapse animations, visual hierarchy
- **Enhanced Animations**: Smooth transitions, hover effects, micro-interactions

 **Frontend Changes:**
- **ThreadedCommentWidget**: Complete rewrite with animations and navigation
- **ThreadNode Model**: Added parent references and descendant counting
- **ThreadedConversationScreen**: Integrated navigation handlers
- **PostDetailScreen**: Replaced with threaded conversation view
- **ComposeScreen**: Added reply indicators and context
- **PostActions**: Fixed visibility checks for chain buttons

 **Backend Changes:**
- **API Route**: Added /posts/:id/thread endpoint
- **Post Repository**: Include allow_chain and visibility fields in feed
- **Thread Handler**: Support for fetching post chains

 **UI/UX Improvements:**
- **Reply Context**: Clear indication when replying to specific posts
- **Character Counting**: 500 character limit with live counter
- **Visual Hierarchy**: Depth-based indentation and styling
- **Smooth Animations**: SizeTransition, FadeTransition, hover states
- **Chain Navigation**: Parent/child buttons with visual feedback

 **Technical Enhancements:**
- **Animation Controllers**: Proper lifecycle management
- **State Management**: Clean separation of concerns
- **Navigation Callbacks**: Reusable navigation system
- **Error Handling**: Graceful fallbacks and user feedback

This creates a Reddit-style threaded conversation experience with smooth
animations, inline replies, and intuitive navigation between posts in a chain.
2026-01-30 07:40:19 -06:00

74 lines
2.8 KiB
SQL

-- Optimizing E2EE Schema
-- Migration ID: 20260127000002
-- Description: Creates properly structured tables for Signal Protocol keys and messages to replace JSON blobs.
-- 1. One-Time Prekeys
-- Stores individual one-time keys. Critical for atomic "fetch and consume".
CREATE TABLE IF NOT EXISTS public.one_time_prekeys (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL, -- References profiles(id) usually, but loosen constraint if profiles not strictly sync'd yet
key_id INTEGER NOT NULL,
public_key TEXT NOT NULL,
signature TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT unique_otk_user_key UNIQUE (user_id, key_id)
);
-- Index for finding keys quickly by user
CREATE INDEX IF NOT EXISTS idx_otk_user_id ON public.one_time_prekeys(user_id);
-- 2. Signed Prekeys
-- Semi-permanent keys signed by identity key.
CREATE TABLE IF NOT EXISTS public.signed_prekeys (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL,
key_id INTEGER NOT NULL,
public_key TEXT NOT NULL,
signature TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT unique_spk_user_key UNIQUE (user_id, key_id)
);
-- Index to quickly get the latest signed prekey
CREATE INDEX IF NOT EXISTS idx_spk_user_created ON public.signed_prekeys(user_id, created_at DESC);
-- 3. Identities
-- Long-term identity keys.
CREATE TABLE IF NOT EXISTS public.identities (
user_id UUID PRIMARY KEY,
registration_id INTEGER NOT NULL,
public_key TEXT NOT NULL, -- Identity Key Public
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- 4. Secure Messages
-- Optimized storage for E2EE payloads.
-- Note: Replaces or complements 'encrypted_messages' depending on migration strategy.
CREATE TABLE IF NOT EXISTS public.secure_messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
conversation_id UUID NOT NULL,
sender_id UUID NOT NULL,
receiver_id UUID NOT NULL,
ciphertext TEXT NOT NULL, -- Base64 encoded encrypted payload
iv TEXT NOT NULL, -- Base64 encoded IV
key_version TEXT NOT NULL, -- e.g. "v1", "signal-session-id"
message_type INTEGER DEFAULT 1,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
delivered_at TIMESTAMPTZ,
read_at TIMESTAMPTZ
);
-- Composite index for fast pagination of chat history
CREATE INDEX IF NOT EXISTS idx_secure_msg_conv_created ON public.secure_messages(conversation_id, created_at DESC);
-- 5. E2EE Sessions (Optional/Future Proofing)
-- Stores session state if server-side session management is desired
CREATE TABLE IF NOT EXISTS public.e2ee_sessions (
user_id UUID NOT NULL,
device_id UUID NOT NULL,
session_state TEXT NOT NULL, -- Serialized session state
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
PRIMARY KEY (user_id, device_id)
);