Initial commit: NutriApp - Rust + Axum + Dioxus - CI/CD con Gitea Runner
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
-- ============================================================
|
||||
-- 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);
|
||||
Reference in New Issue
Block a user