chore(db): archive legacy migrations, stop gitignoring drizzle/
The drizzle/ folder was in .gitignore (line 34) — likely confused with the build 'out/' dir. Effect: migration SQL never reached the server on deploy, so the migration pipeline could never have worked. Only 7 of 18 files were ever force-tracked; 0000-0010 + most of manual/ were untracked. - Remove drizzle/ from .gitignore; document why it must be tracked - Archive legacy hand-rolled migrations 0000-0015 + manual/ to _archived_pre_baseline_2026-05-19/ (kept on disk; history retains old copies) - Archive stale meta/ (knew of only 3 of 16 migrations) - Baseline regeneration follows in subsequent commits
This commit is contained in:
parent
5fe24b8c59
commit
e7d68c2fc6
8 changed files with 7 additions and 163 deletions
8
.gitignore
vendored
8
.gitignore
vendored
|
|
@ -31,4 +31,10 @@ yarn-error.log*
|
||||||
# docker
|
# docker
|
||||||
.docker/
|
.docker/
|
||||||
data/
|
data/
|
||||||
drizzle/
|
|
||||||
|
# NOTE: drizzle/ is intentionally NOT ignored.
|
||||||
|
# It holds migration SQL + meta snapshots — these are SOURCE CODE and
|
||||||
|
# MUST be committed so the deploy pipeline can apply them on the server.
|
||||||
|
# Only transient introspection scratch output is ignored:
|
||||||
|
drizzle/_introspected/
|
||||||
|
drizzle/_archived_pre_baseline_2026-05-19/
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
-- Enable pgvector if not already
|
|
||||||
CREATE EXTENSION IF NOT EXISTS vector;
|
|
||||||
|
|
||||||
-- Memories table (photos with vision metadata)
|
|
||||||
CREATE TABLE IF NOT EXISTS memories (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
family_id UUID NOT NULL,
|
|
||||||
child_id UUID,
|
|
||||||
title TEXT,
|
|
||||||
description TEXT,
|
|
||||||
taken_at TIMESTAMPTZ,
|
|
||||||
r2_key TEXT NOT NULL,
|
|
||||||
r2_thumbnail_key TEXT,
|
|
||||||
mime_type TEXT,
|
|
||||||
size_bytes INTEGER,
|
|
||||||
width INTEGER,
|
|
||||||
height INTEGER,
|
|
||||||
vision_caption TEXT,
|
|
||||||
vision_tags TEXT[],
|
|
||||||
vision_embedding VECTOR(1536),
|
|
||||||
is_private BOOLEAN NOT NULL DEFAULT FALSE,
|
|
||||||
processing_status TEXT NOT NULL DEFAULT 'uploading'
|
|
||||||
CHECK (processing_status IN ('uploading', 'processing', 'ready', 'failed')),
|
|
||||||
uploaded_by UUID,
|
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
||||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS memories_family_idx ON memories (family_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS memories_child_idx ON memories (child_id);
|
|
||||||
|
|
||||||
-- Attachments table (files linked to log entries, no vision)
|
|
||||||
CREATE TABLE IF NOT EXISTS attachments (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
family_id UUID NOT NULL,
|
|
||||||
log_entry_id UUID,
|
|
||||||
r2_key TEXT NOT NULL,
|
|
||||||
r2_thumbnail_key TEXT,
|
|
||||||
mime_type TEXT,
|
|
||||||
size_bytes INTEGER,
|
|
||||||
uploaded_by UUID,
|
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS attachments_family_idx ON attachments (family_id);
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
-- G3.2: Medication dose log
|
|
||||||
CREATE TABLE IF NOT EXISTS medication_doses (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
medicine_id UUID NOT NULL,
|
|
||||||
family_id UUID NOT NULL,
|
|
||||||
administered_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
||||||
administered_by UUID,
|
|
||||||
amount_given TEXT,
|
|
||||||
notes TEXT,
|
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS medication_doses_medicine_idx ON medication_doses (medicine_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS medication_doses_family_idx ON medication_doses (family_id);
|
|
||||||
|
|
||||||
-- G3.4: Log corrections (audit trail for edited doses)
|
|
||||||
CREATE TABLE IF NOT EXISTS log_corrections (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
family_id UUID NOT NULL,
|
|
||||||
dose_id UUID NOT NULL REFERENCES medication_doses(id) ON DELETE CASCADE,
|
|
||||||
original_value JSONB NOT NULL,
|
|
||||||
corrected_value JSONB NOT NULL,
|
|
||||||
reason TEXT,
|
|
||||||
corrected_by UUID,
|
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS log_corrections_dose_idx ON log_corrections (dose_id);
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
CREATE TABLE IF NOT EXISTS ai_usage (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
family_id UUID,
|
|
||||||
user_id UUID,
|
|
||||||
intent TEXT, -- structured_query | memory_search | general_parenting | medical_redirect
|
|
||||||
model_used TEXT,
|
|
||||||
prompt_tokens INTEGER,
|
|
||||||
completion_tokens INTEGER,
|
|
||||||
total_tokens INTEGER,
|
|
||||||
cost_estimate_paise NUMERIC(10,4), -- rough estimate for monitoring
|
|
||||||
duration_ms INTEGER,
|
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS ai_usage_family_idx ON ai_usage (family_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS ai_usage_created_idx ON ai_usage (created_at DESC);
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
CREATE TABLE IF NOT EXISTS milestone_achievements (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
child_id UUID NOT NULL REFERENCES children(id) ON DELETE CASCADE,
|
|
||||||
family_id UUID NOT NULL,
|
|
||||||
milestone_key TEXT NOT NULL,
|
|
||||||
achieved_at DATE NOT NULL,
|
|
||||||
notes TEXT,
|
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
||||||
UNIQUE(child_id, milestone_key)
|
|
||||||
);
|
|
||||||
CREATE INDEX IF NOT EXISTS milestone_child_idx ON milestone_achievements (child_id);
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
CREATE TABLE IF NOT EXISTS member_profiles (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
user_id UUID NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
|
|
||||||
family_id UUID NOT NULL REFERENCES families(id) ON DELETE CASCADE,
|
|
||||||
slug TEXT NOT NULL UNIQUE,
|
|
||||||
display_name TEXT NOT NULL,
|
|
||||||
bio TEXT,
|
|
||||||
avatar_url TEXT,
|
|
||||||
is_public BOOLEAN NOT NULL DEFAULT false,
|
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
||||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS recommended_products (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
profile_id UUID NOT NULL REFERENCES member_profiles(id) ON DELETE CASCADE,
|
|
||||||
title TEXT NOT NULL,
|
|
||||||
description TEXT,
|
|
||||||
url TEXT NOT NULL,
|
|
||||||
image_url TEXT,
|
|
||||||
category TEXT NOT NULL DEFAULT 'general',
|
|
||||||
display_order INTEGER NOT NULL DEFAULT 0,
|
|
||||||
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS product_clicks (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
product_id UUID NOT NULL REFERENCES recommended_products(id) ON DELETE CASCADE,
|
|
||||||
clicked_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
||||||
referrer TEXT,
|
|
||||||
ip_hash TEXT
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS member_profiles_slug_idx ON member_profiles (slug);
|
|
||||||
CREATE INDEX IF NOT EXISTS recommended_products_profile_idx ON recommended_products (profile_id, display_order);
|
|
||||||
CREATE INDEX IF NOT EXISTS product_clicks_product_idx ON product_clicks (product_id, clicked_at DESC);
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
-- Create audit_log table
|
|
||||||
CREATE TABLE IF NOT EXISTS audit_log (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
user_id UUID,
|
|
||||||
family_id UUID,
|
|
||||||
action TEXT NOT NULL,
|
|
||||||
metadata JSONB,
|
|
||||||
ip_address TEXT,
|
|
||||||
user_agent TEXT,
|
|
||||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
||||||
);
|
|
||||||
|
|
||||||
-- Create index for queries
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_audit_log_user ON audit_log(user_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_audit_log_family ON audit_log(family_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_audit_log_action ON audit_log(action);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_audit_log_created ON audit_log(created_at DESC);
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
-- Create password_resets table
|
|
||||||
CREATE TABLE IF NOT EXISTS password_resets (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
user_id UUID NOT NULL REFERENCES users(id),
|
|
||||||
token TEXT UNIQUE NOT NULL,
|
|
||||||
expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
|
|
||||||
used_at TIMESTAMP WITH TIME ZONE
|
|
||||||
);
|
|
||||||
Loading…
Add table
Reference in a new issue