Initial commit: NutriApp - Rust + Axum + Dioxus - CI/CD con Gitea Runner

This commit is contained in:
2026-06-24 08:35:09 +01:00
commit bede2018a6
35 changed files with 829 additions and 0 deletions
@@ -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);