Saltar al contenido principal

Esquema de Supabase

Supabase actúa como backend principal de la aplicación. La base de datos subyacente es PostgreSQL. A continuación se describe cada tabla, sus columnas y las relaciones entre ellas.

Tabla: usuarios​

Almacena los datos de los usuarios registrados en la aplicación.

ColumnaTipoRestriccionesDescripción
idintegerPK, auto-incrementIdentificador único del usuario
nombrevarchar(100)NOT NULLNombre completo del usuario
dnivarchar(20)UNIQUEDocumento Nacional de Identidad. Se usa como identificador de login
contraseniaHashvarchar(255)Contraseña almacenada (texto plano en la versión actual)
emailvarchar(100)UNIQUECorreo electrónico. Se usa para la recuperación de contraseña
telefonovarchar(20)Número de teléfono de contacto
adminintegerDEFAULT 0Indica si el usuario tiene rol de administrador (0 = usuario, 1 = admin)
premiumbooleanDEFAULT falseIndica si el usuario tiene suscripción Premium activa
fecha_ini_premdateFecha de inicio de la suscripción Premium
fecha_fin_premdateFecha de fin de la suscripción Premium
fototextImagen de perfil codificada en Base64

La data class correspondiente es models/Usuario.kt.

Tabla: maquinas​

Almacena el catálogo de maquinaria del gimnasio.

ColumnaTipoRestriccionesDescripción
idintegerPK, auto-incrementIdentificador único de la máquina
nombrevarchar(100)NOT NULLNombre descriptivo de la máquina
tipovarchar(50)Categoría de ejercicio (Cardio, Espalda, Pierna, Pecho, etc.)
estadointegerDEFAULT 0Campo de estado genérico
descripciontextDescripción detallada de la máquina
operativabooleanDEFAULT trueIndica si la máquina está disponible para reservas
mantenimiento_desdevarcharFecha y hora de inicio del período de mantenimiento (yyyy-MM-dd HH:mm)
mantenimiento_hastavarcharFecha y hora de fin del período de mantenimiento (yyyy-MM-dd HH:mm)

La data class correspondiente es models/Maquina.kt.

Tabla: reservas​

Almacena las reservas de maquinaria realizadas por los usuarios.

ColumnaTipoRestriccionesDescripción
idintegerPK, auto-incrementIdentificador único de la reserva
id_usuariointegerFK → usuarios.idUsuario que realizó la reserva
id_maquinaintegerFK → maquinas.idMáquina reservada
fechadateFecha de la reserva (yyyy-MM-dd)
hora_iniciotimeHora de inicio de la franja reservada
hora_fintimeHora de fin de la franja reservada
estadobooleanDEFAULT truetrue = activa, false = cancelada

Las data classes correspondientes son models/Reserva.kt y models/ReservaConDetalles.kt. La segunda incluye los objetos Usuario y Maquina embebidos, obtenidos mediante la sintaxis de relaciones de PostgREST (*, usuarios(*), maquinas(*)).

Tabla: platos​

Almacena los platos nutricionales del catálogo.

ColumnaTipoRestriccionesDescripción
idintegerPK, auto-incrementIdentificador único del plato
id_usuariointegerFK → usuarios.idUsuario que sugirió el plato (nullable para platos del sistema)
nombrevarchar(100)NOT NULLNombre del plato
descripciontextDescripción o receta del plato
caloriasdouble precisionContenido calórico por ración
imagen_urlvarchar(255)URL de imagen o cadena Base64 de la imagen del plato
fecha_subidatimestampFecha y hora de creación del registro
visibilidadbooleanDEFAULT trueIndica si el plato es visible en el catálogo
tiempovarcharTiempo de preparación estimado (por ejemplo, "30 minutos")
aceptadobooleanDEFAULT falseIndica si el plato ha sido aprobado por un administrador

La data class correspondiente es models/Plato.kt.

Tabla: peso_usuario​

Almacena el historial de registros de peso de cada usuario.

ColumnaTipoRestriccionesDescripción
idintegerPK, auto-incrementIdentificador único del registro
id_usuariointegerFK → usuarios.idUsuario al que pertenece el registro
pesodouble precisionNOT NULLPeso en kilogramos
fechadateFecha del registro (yyyy-MM-dd)

La aplicación impone la restricción de un único registro por día a nivel de UI. La pantalla comprueba si ya existe un registro para la fecha actual antes de permitir añadir uno nuevo.

La data class correspondiente es models/PesoUsuario.kt.

Tabla: pagos​

Almacena el historial de transacciones de suscripción Premium.

ColumnaTipoRestriccionesDescripción
idintegerPK, auto-incrementIdentificador único del pago
id_usuariointegerFK → usuarios.idUsuario que realizó el pago
montodouble precisionNOT NULLImporte de la transacción en euros
fecha_pagodateFecha en que se realizó el pago
tipovarchar(50)Modalidad de suscripción (Mensual, Semestral, Anual)
metodo_pagovarchar(25)Método de pago utilizado (Tarjeta, Bizum)

La data class correspondiente es models/Pago.kt.

Diagrama de relaciones​

usuarios (id)
|
|--< reservas (id_usuario) >-- maquinas (id)
|
|--< peso_usuario (id_usuario)
|
|--< platos (id_usuario)
|
|--< pagos (id_usuario)

Las relaciones son todas de tipo uno a muchos. No se definen claves foráneas explícitas a nivel de Supabase Dashboard; la integridad referencial se gestiona a nivel de aplicación.

Row Level Security​

Las políticas de Row Level Security (RLS) de Supabase no están configuradas en esta versión. El acceso a los datos se realiza con la anon key, por lo que cualquier cliente con la clave puede leer y escribir en todas las tablas. En un entorno de producción sería imprescindible definir políticas RLS adecuadas o utilizar la service_role key exclusivamente desde un backend de confianza.

Constantes de base de datos​

Los nombres de las tablas y columnas se centralizan en DbConstants.kt mediante los objetos DbTables y DbColumns, evitando el uso de strings literales dispersos por el código:

object DbTables {
const val USUARIOS = "usuarios"
const val MAQUINAS = "maquinas"
const val PLATOS = "platos"
const val PAGOS = "pagos"
const val RESERVAS = "reservas"
const val PESO_USUARIO = "peso_usuario"
}

object DbColumns {
const val ID = "id"
const val DNI = "dni"
const val NOMBRE = "nombre"
// ...
}