97 lines
4.9 KiB
SQL
97 lines
4.9 KiB
SQL
-- ============================================================
|
|
-- 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);
|