CREATE TYPE "public"."child_sex" AS ENUM('male', 'female', 'other');--> statement-breakpoint CREATE TYPE "public"."child_stage" AS ENUM('newborn', 'infant', 'solids_start', 'toddler_early', 'toddler_late', 'preschool');--> statement-breakpoint CREATE TYPE "public"."member_role" AS ENUM('admin', 'caregiver', 'viewer');--> statement-breakpoint CREATE TYPE "public"."diaper_type" AS ENUM('wet', 'dirty', 'both', 'dry');--> statement-breakpoint CREATE TYPE "public"."feed_method" AS ENUM('bottle', 'breast_left', 'breast_right', 'breast_both', 'cup', 'spoon', 'finger', 'self');--> statement-breakpoint CREATE TYPE "public"."feed_type" AS ENUM('breast_milk', 'formula', 'solid', 'water', 'other');--> statement-breakpoint CREATE TYPE "public"."sleep_type" AS ENUM('nap', 'night');--> statement-breakpoint CREATE TABLE "admin_sessions" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "admin_id" uuid NOT NULL, "session_token" text NOT NULL, "expires" timestamp with time zone NOT NULL, "created_at" timestamp with time zone DEFAULT now(), CONSTRAINT "admin_sessions_session_token_unique" UNIQUE("session_token") ); --> statement-breakpoint CREATE TABLE "admins" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "username" varchar(50) NOT NULL, "password_hash" varchar(255) NOT NULL, "role" varchar(20) DEFAULT 'admin', "created_at" timestamp with time zone DEFAULT now(), "last_login" timestamp with time zone, CONSTRAINT "admins_username_unique" UNIQUE("username"), CONSTRAINT "admins_role_check" CHECK ((role)::text = ANY (ARRAY['super_admin','admin','support'])) ); --> statement-breakpoint CREATE TABLE "password_resets" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "user_id" uuid NOT NULL, "token" text NOT NULL, "expires_at" timestamp with time zone NOT NULL, "used_at" timestamp with time zone, CONSTRAINT "password_resets_token_unique" UNIQUE("token") ); --> statement-breakpoint CREATE TABLE "member_profiles" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "user_id" uuid NOT NULL, "family_id" uuid NOT NULL, "slug" text NOT NULL, "display_name" text NOT NULL, "bio" text, "avatar_url" text, "is_public" boolean DEFAULT false NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "member_profiles_user_id_unique" UNIQUE("user_id") ); --> statement-breakpoint CREATE TABLE "product_clicks" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "product_id" uuid NOT NULL, "clicked_at" timestamp with time zone DEFAULT now() NOT NULL, "referrer" text, "ip_hash" text ); --> statement-breakpoint CREATE TABLE "recommended_products" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "profile_id" uuid NOT NULL, "title" text NOT NULL, "description" text, "url" text NOT NULL, "image_url" text, "category" text DEFAULT 'general' NOT NULL, "display_order" integer DEFAULT 0 NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "ai_usage" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "family_id" uuid, "user_id" uuid, "intent" text, "model_used" text, "prompt_tokens" integer, "completion_tokens" integer, "total_tokens" integer, "cost_estimate_paise" numeric(10, 4), "duration_ms" integer, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "chat_messages" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "session_id" uuid NOT NULL, "role" varchar(20) NOT NULL, "content" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() ); --> statement-breakpoint CREATE TABLE "chat_sessions" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "title" varchar(255) DEFAULT 'New conversation' NOT NULL, "created_at" timestamp with time zone DEFAULT now(), "updated_at" timestamp with time zone DEFAULT now() ); --> statement-breakpoint CREATE TABLE "audit_log" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "family_id" uuid, "user_id" uuid, "action" varchar(50) NOT NULL, "resource_type" varchar(50), "resource_id" uuid, "ip_address" varchar(45), "user_agent" text, "metadata" jsonb DEFAULT '{}'::jsonb, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "log_corrections" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "family_id" uuid NOT NULL, "dose_id" uuid NOT NULL, "original_value" jsonb NOT NULL, "corrected_value" jsonb NOT NULL, "reason" text, "corrected_by" uuid, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "accounts" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "user_id" uuid NOT NULL, "type" text NOT NULL, "provider" text NOT NULL, "provider_account_id" text NOT NULL, "refresh_token" text, "access_token" text, "expires_at" timestamp, "token_type" text, "scope" text, "id_token" text, "session_state" text ); --> statement-breakpoint CREATE TABLE "sessions" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "session_token" text NOT NULL, "user_id" uuid NOT NULL, "expires" timestamp NOT NULL, CONSTRAINT "sessions_session_token_unique" UNIQUE("session_token") ); --> statement-breakpoint CREATE TABLE "users" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "name" text, "email" text NOT NULL, "email_verified" timestamp, "image" text, "created_at" timestamp DEFAULT now() NOT NULL, "updated_at" timestamp DEFAULT now() NOT NULL, "password_hash" varchar(255), "password_updated_at" timestamp with time zone, CONSTRAINT "users_email_unique" UNIQUE("email") ); --> statement-breakpoint CREATE TABLE "verification_tokens" ( "identifier" text NOT NULL, "token" text NOT NULL, "expires" timestamp NOT NULL ); --> statement-breakpoint CREATE TABLE "children" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "family_id" uuid NOT NULL, "name" text NOT NULL, "birth_date" date NOT NULL, "sex" "child_sex", "stage" "child_stage" DEFAULT 'newborn' NOT NULL, "image_url" text, "created_at" timestamp DEFAULT now() NOT NULL, "updated_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "families" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "name" text NOT NULL, "tier" varchar(20) DEFAULT 'free', "max_children" integer DEFAULT 1, "max_members" integer DEFAULT 2, "pediatrician_phone" text, "created_at" timestamp DEFAULT now() NOT NULL, "updated_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "family_invites" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "family_id" uuid NOT NULL, "email" text NOT NULL, "role" "member_role" DEFAULT 'viewer' NOT NULL, "token" text NOT NULL, "expires_at" timestamp NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL, CONSTRAINT "family_invites_token_unique" UNIQUE("token") ); --> statement-breakpoint CREATE TABLE "family_members" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "family_id" uuid NOT NULL, "user_id" uuid NOT NULL, "role" "member_role" DEFAULT 'caregiver' NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "attachments" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "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" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "memories" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "family_id" uuid NOT NULL, "child_id" uuid, "title" text, "description" text, "taken_at" timestamp with time zone, "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 DEFAULT false NOT NULL, "processing_status" text DEFAULT 'uploading' NOT NULL, "uploaded_by" uuid, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "diapers_logs" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "type" "diaper_type" NOT NULL, "notes" text, "logged_at" timestamp DEFAULT now() NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "feeds" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "type" "feed_type" NOT NULL, "method" "feed_method", "amount_ml" real, "notes" text, "logged_at" timestamp DEFAULT now() NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "growth" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "measured_at" timestamp NOT NULL, "weight_kg" real, "height_cm" real, "head_circumference_cm" real, "notes" text, "created_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "medications" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "name" text NOT NULL, "dosage" text, "frequency" text, "start_date" date NOT NULL, "end_date" date, "active" boolean DEFAULT true NOT NULL, "notes" text, "created_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "milestone_achievements" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "family_id" uuid NOT NULL, "milestone_key" text NOT NULL, "achieved_at" date NOT NULL, "notes" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "sleeps" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "type" "sleep_type" NOT NULL, "started_at" timestamp, "ended_at" timestamp, "duration_minutes" integer, "notes" text, "logged_at" timestamp DEFAULT now() NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "vaccinations" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "vaccine_name" text NOT NULL, "scheduled_date" date NOT NULL, "given_date" date, "status" text DEFAULT 'pending' NOT NULL, "provider" text, "lot_number" text, "notes" text, "created_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "allergies" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "name" varchar(255) NOT NULL, "severity" varchar(50) DEFAULT 'mild', "notes" text, "created_at" timestamp with time zone DEFAULT now(), "updated_at" timestamp with time zone DEFAULT now() ); --> statement-breakpoint CREATE TABLE "doctor_visits" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "doctor_name" varchar(255) NOT NULL, "reason" varchar(255), "visit_date" date NOT NULL, "notes" text, "created_at" timestamp with time zone DEFAULT now(), "updated_at" timestamp with time zone DEFAULT now() ); --> statement-breakpoint CREATE TABLE "illness_logs" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "name" varchar(255) NOT NULL, "start_date" date NOT NULL, "end_date" date, "notes" text, "created_at" timestamp with time zone DEFAULT now(), "updated_at" timestamp with time zone DEFAULT now() ); --> statement-breakpoint CREATE TABLE "medication_doses" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "medicine_id" uuid NOT NULL, "family_id" uuid NOT NULL, "administered_at" timestamp with time zone DEFAULT now() NOT NULL, "administered_by" uuid, "amount_given" text, "notes" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "medicines" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "child_id" uuid NOT NULL, "name" varchar(255) NOT NULL, "dose" varchar(255), "notes" text, "reminder_time" varchar(10), "created_at" timestamp with time zone DEFAULT now(), "updated_at" timestamp with time zone DEFAULT now() ); --> statement-breakpoint CREATE TABLE "support_responses" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "ticket_id" uuid, "admin_id" uuid, "message" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() ); --> statement-breakpoint CREATE TABLE "support_tickets" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "family_id" uuid, "user_id" uuid, "email" varchar(255) NOT NULL, "subject" varchar(255) NOT NULL, "description" text, "status" varchar(20) DEFAULT 'open', "priority" varchar(20) DEFAULT 'normal', "created_at" timestamp with time zone DEFAULT now(), "updated_at" timestamp with time zone DEFAULT now(), CONSTRAINT "support_tickets_status_check" CHECK ((status)::text = ANY (ARRAY['open','in_progress','resolved','closed'])), CONSTRAINT "support_tickets_priority_check" CHECK ((priority)::text = ANY (ARRAY['low','normal','high','urgent'])) ); --> statement-breakpoint ALTER TABLE "diapers_logs" ADD CONSTRAINT "diapers_logs_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE "feeds" ADD CONSTRAINT "feeds_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE "growth" ADD CONSTRAINT "growth_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE "medications" ADD CONSTRAINT "medications_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE "sleeps" ADD CONSTRAINT "sleeps_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE "vaccinations" ADD CONSTRAINT "vaccinations_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint CREATE INDEX "member_profiles_slug_idx" ON "member_profiles" USING btree ("slug");--> statement-breakpoint CREATE INDEX "product_clicks_product_idx" ON "product_clicks" USING btree ("product_id","clicked_at");--> statement-breakpoint CREATE INDEX "recommended_products_profile_idx" ON "recommended_products" USING btree ("profile_id","display_order");--> statement-breakpoint CREATE INDEX "ai_usage_created_idx" ON "ai_usage" USING btree ("created_at");--> statement-breakpoint CREATE INDEX "ai_usage_family_idx" ON "ai_usage" USING btree ("family_id");--> statement-breakpoint CREATE INDEX "audit_family_idx" ON "audit_log" USING btree ("family_id","created_at");--> statement-breakpoint CREATE INDEX "idx_audit_log_action" ON "audit_log" USING btree ("action");--> statement-breakpoint CREATE INDEX "idx_audit_log_created" ON "audit_log" USING btree ("created_at");--> statement-breakpoint CREATE INDEX "idx_audit_log_family" ON "audit_log" USING btree ("family_id");--> statement-breakpoint CREATE INDEX "idx_audit_log_user" ON "audit_log" USING btree ("user_id");--> statement-breakpoint CREATE INDEX "log_corrections_dose_idx" ON "log_corrections" USING btree ("dose_id");--> statement-breakpoint CREATE UNIQUE INDEX "accounts_provider_idx" ON "accounts" USING btree ("provider","provider_account_id");--> statement-breakpoint CREATE UNIQUE INDEX "verification_tokens_idx" ON "verification_tokens" USING btree ("identifier","token");--> statement-breakpoint CREATE INDEX "children_family_idx" ON "children" USING btree ("family_id");--> statement-breakpoint CREATE UNIQUE INDEX "invite_token_idx" ON "family_invites" USING btree ("token");--> statement-breakpoint CREATE UNIQUE INDEX "family_members_family_id_user_id_key" ON "family_members" USING btree ("family_id","user_id");--> statement-breakpoint CREATE INDEX "attachments_family_idx" ON "attachments" USING btree ("family_id");--> statement-breakpoint CREATE INDEX "memories_family_idx" ON "memories" USING btree ("family_id");--> statement-breakpoint CREATE INDEX "memories_child_idx" ON "memories" USING btree ("child_id");--> statement-breakpoint CREATE INDEX "memories_embedding_idx" ON "memories" USING ivfflat ("vision_embedding" vector_cosine_ops) WITH (lists=100);--> statement-breakpoint CREATE INDEX "milestone_child_idx" ON "milestone_achievements" USING btree ("child_id");--> statement-breakpoint CREATE UNIQUE INDEX "milestone_achievements_child_milestone_unique" ON "milestone_achievements" USING btree ("child_id","milestone_key");--> statement-breakpoint CREATE INDEX "medication_doses_family_idx" ON "medication_doses" USING btree ("family_id");--> statement-breakpoint CREATE INDEX "medication_doses_medicine_idx" ON "medication_doses" USING btree ("medicine_id");