-- ============================================================ -- NutriApp — Migración inicial -- ============================================================ -- Habilitar extensión UUID CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- ─── Familias ──────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS familias ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), nombre VARCHAR(255) NOT NULL, codigo_invitacion VARCHAR(8) UNIQUE NOT NULL, creador_id UUID, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); -- ─── Usuarios ──────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS usuarios ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), email VARCHAR(255) UNIQUE NOT NULL, nombre VARCHAR(255) NOT NULL, password_hash TEXT NOT NULL, familia_id UUID REFERENCES familias(id) ON DELETE SET NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); -- FK circular: creador_id → usuarios ALTER TABLE familias ADD CONSTRAINT fk_familias_creador FOREIGN KEY (creador_id) REFERENCES usuarios(id) ON DELETE SET NULL; -- ─── Ingredientes (catálogo global por familia) ────────────── CREATE TABLE IF NOT EXISTS ingredientes ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), familia_id UUID NOT NULL REFERENCES familias(id) ON DELETE CASCADE, nombre VARCHAR(255) NOT NULL, categoria VARCHAR(50), unidad_medida VARCHAR(20) NOT NULL DEFAULT 'unidad', created_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE(familia_id, nombre) ); -- ─── Recetas ───────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS recetas ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), familia_id UUID NOT NULL REFERENCES familias(id) ON DELETE CASCADE, creador_id UUID NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE, nombre VARCHAR(255) NOT NULL, descripcion TEXT, porciones INTEGER NOT NULL DEFAULT 1, tiempo_preparacion_min INTEGER, instrucciones TEXT, imagen_url TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); -- ─── Ingredientes de cada receta ──────────────────────────── CREATE TABLE IF NOT EXISTS receta_ingredientes ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), receta_id UUID NOT NULL REFERENCES recetas(id) ON DELETE CASCADE, ingrediente_id UUID NOT NULL REFERENCES ingredientes(id) ON DELETE CASCADE, cantidad DOUBLE PRECISION NOT NULL, unidad VARCHAR(20) NOT NULL DEFAULT 'unidad', UNIQUE(receta_id, ingrediente_id) ); -- ─── Calendario semanal (slots de comida) ────────────────── CREATE TABLE IF NOT EXISTS slots_comida ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), familia_id UUID NOT NULL REFERENCES familias(id) ON DELETE CASCADE, fecha DATE NOT NULL, tipo VARCHAR(20) NOT NULL CHECK (tipo IN ('desayuno', 'comida', 'cena')), receta_id UUID REFERENCES recetas(id) ON DELETE SET NULL, porciones INTEGER NOT NULL DEFAULT 1, creado_por UUID REFERENCES usuarios(id) ON DELETE SET NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE(familia_id, fecha, tipo, receta_id) ); -- ─── Inventario familiar ──────────────────────────────────── CREATE TABLE IF NOT EXISTS inventario ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), familia_id UUID NOT NULL REFERENCES familias(id) ON DELETE CASCADE, ingrediente_id UUID NOT NULL REFERENCES ingredientes(id) ON DELETE CASCADE, cantidad DOUBLE PRECISION NOT NULL DEFAULT 0, unidad VARCHAR(20) NOT NULL, updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE(familia_id, ingrediente_id) ); -- ─── Índices ───────────────────────────────────────────────── CREATE INDEX idx_recetas_familia ON recetas(familia_id); CREATE INDEX idx_slots_familia_fecha ON slots_comida(familia_id, fecha); CREATE INDEX idx_inventario_familia ON inventario(familia_id); CREATE INDEX idx_ingredientes_familia ON ingredientes(familia_id);